演练:简化AMI使用 Automation、Amazon Lambda和 Parameter Store - Amazon Web Services Systems Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

演练:简化AMI使用 Automation、Amazon Lambda和 Parameter Store

以下示例扩展了如何更新 WindowsAMI,如所述演练:修补 Windows Server AMI。此示例使用组织维护和定期修补自己专有的模型AMIs而不是从 Amazon Elastic Compute Cloud (Amazon EC2) 中构建而成AMIs。

以下过程演示了如何自动应用操作系统 (OS) 补丁到 WindowsAMI,这些已经被认为是最新的或latest AMI。在示例中,参数的默认值SourceAmiId由Amazon Web Services Systems Manager名为的参数存储参数latestAmi。值latestAmi由Amazon Lambda函数在自动化结束时调用。由于此 Automation 过程,修补所需的时间和工作量AMIs最小化,因为修补程序始终应用于最新的AMI。参数存储和自动化是Amazon Web Services Systems Manager。

开始前的准备工作

配置 Automation 角色以及 (可选) 为 Automation 配置 Amazon EventBridge。有关更多信息,请参阅 设置 Automation

Task 1:在 Systems Manager Parameter Store 中创建参数

在参数存储中创建一个使用以下信息的字符串参数:

  • Name (名称)latestAmi

  • :WindowsAMIID。例如: ami-188d6e0e

有关如何创建参数存储字符串参数的信息,请参阅创建 Systems Manager 参数

Task 2:为 Amazon Lambda 创建 IAM 角色

使用以下过程为创建 IAM 服务角色Amazon Lambda。这些策略为 Lambda 提供更新latestAmi参数使用 Lambda 函数和 Systems Manager。

为 Lambda 创建 IAM 服务角色

  1. 登录 Amazon Web Services Management Console,单击 https://console.aws.amazon.com/iam/ 打开 IAM 控制台。

  2. 在导航窗格中,选择策略,然后选择创建策略

  3. 选择 JSON 选项卡。

  4. 将默认内容替换为以下内容。务必将 us-west-2123456789012 替换为您要使用的区域和账户。ReplaceupdateAmiFunction替换为 Lambda 函数的名称。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-2:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-2:123456789012:log-group:/aws/lambda/updateAmiFunction:*" ] } ] }
  5. 选择查看策略

  6. Review policy (查看策略) 页面上,对于 Name (名称),输入内联策略的名称,例如 amiLambda

  7. 选择创建策略

  8. 重复步骤 2 和 3。

  9. 将默认内容替换为以下内容。务必将 us-west-2123456789012 替换为您要使用的区域和账户。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:us-west-2:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  10. 选择查看策略

  11. Review policy (查看策略) 页面上,对于 Name (名称),输入内联策略的名称,例如 amiParameter

  12. 选择创建策略

  13. 在导航窗格中,选择角色,然后选择创建角色

  14. 紧接在选择将使用此角色的服务中,选择Lambda,然后选择后续:Permissions (下一步:权限)

  15. Attach permissions policies (附加权限策略) 页面上,使用 Search (搜索) 字段查找之前创建的两个策略。

  16. 选中策略旁边的复选框,然后选择后续:标签

  17. (可选)添加一个或多个标签键/值对以组织、跟踪或控制该角色的访问,然后选择后续:审核

  18. 对于角色名称,请输入新角色的名称,如 lambda-ssm-role 或所需的其他名称。

    注意

    由于多个实体可能引用该角色,因此创建角色后无法更改角色的名称。

  19. 选择创建角色

Task 3:创建Amazon Lambdafunction

使用以下过程创建 Lambda 函数,该函数自动更新latestAmi参数。

创建 Lambda 函数

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Lambda 控制台:https://console.aws.amazon.com/lambda/

  2. 选择创建函数

  3. Create function 页面上,选择 Author from scratch

  4. 对于函数名称,请键入 Automation-UpdateSsmParam

  5. 运行时列表中,选择Python 3.8

  6. Permissions (权限) 部分中,展开 Choose or create an execution role (选择或创建执行角色)

  7. 选择使用现有角色,然后为您在任务 2 中创建的 Lambda 选择服务角色。

  8. 选择创建函数

  9. 函数代码部分中,在 lambda_function 选项卡上,删除此字段中的预填充代码,然后粘贴以下代码示例。

    from __future__ import print_function import json import boto3 print('Loading function') #Updates an SSM parameter #Expects parameterName, parameterValue def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get SSM client client = boto3.client('ssm') #confirm parameter exists before updating it response = client.describe_parameters( Filters=[ { 'Key': 'Name', 'Values': [ event['parameterName'] ] }, ] ) if not response['Parameters']: print('No such parameter') return 'SSM parameter not found.' #if parameter has a Description field, update it PLUS the Value if 'Description' in response['Parameters'][0]: description = response['Parameters'][0]['Description'] response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Description=description, Type='String', Overwrite=True ) #otherwise just update Value else: response = client.put_parameter( Name=event['parameterName'], Value=event['parameterValue'], Type='String', Overwrite=True ) reponseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue']) return reponseString
  10. 选择保存

  11. 要测试 Lambda 函数,请从选择测试事件菜单中,选择配置测试事件

  12. 对于 Event name (事件名称),输入测试事件的名称,如 MyTestEvent

  13. 使用以下 JSON 替换现有文本,将您的身份证使用新的AMI设置为latestAmi参数值。

    { "parameterName":"latestAmi", "parameterValue":"your-ami-id" }
  14. 选择创建

  15. 选择测试以测试该函数。输出应说明已成功更新参数并包括有关更新的详细信息。例如,“已使用值 ami-123456 更新参数 latestAmi”。

Task 4:创建运行手册并修补 AMI

使用以下过程可创建和运行用于修补AMI您指定的latestAmi参数。自动化完成后,latestAmi使用新修补的 ID 更新。AMI。后续自动化使用AMI由之前执行创建。

要创建运行簿并修补AMI

  1. 打开Amazon Web Services Systems Manager控制台https://console.aws.amazon.com/systems-manager/

  2. 在导航窗格中,选择 Documents

    -或者-

    如果Amazon Web Services Systems Manager首先打开主页,选择菜单图标( ) 以打开导航窗格中的,然后选择。文档在导航窗格中。

  3. 选择 Create automation (创建自动化)

  4. Name 字段中,键入 UpdateMyLatestWindowsAmi

  5. 选择 Editor (编辑器) 选项卡,然后选择 Edit (编辑)

  6. 替换默认内容文档编辑器字段,其中包含以下 JSON 示例运行簿。

    注意

    您必须更改assumeRoleIamInstanceProfileName的服务角色 ARN 和实例配置文件角色,在此示例中创建时设置 Automation

    { "description":"Systems Manager Automation Demo – Patch AMI and Update SSM Param", "schemaVersion":"0.3", "assumeRole":"the role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch", "default":"{{ssm:latestAmi}}" }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" } }, "mainSteps":[ { "name":"startInstances", "action":"aws:runInstances", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "ImageId":"{{ sourceAMIid }}", "InstanceType":"m3.large", "MinInstanceCount":1, "MaxInstanceCount":1, "IamInstanceProfileName":"the name of the IAM role you created" } }, { "name":"installMissingWindowsUpdates", "action":"aws:runCommand", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "DocumentName":"AWS-InstallWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "SeverityLevels":"Important" } } }, { "name":"stopInstance", "action":"aws:changeInstanceState", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "DesiredState":"stopped" } }, { "name":"createImage", "action":"aws:createImage", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "InstanceId":"{{ startInstances.InstanceIds }}", "ImageName":"{{ targetAMIname }}", "NoReboot":true, "ImageDescription":"AMI created by EC2 Automation" } }, { "name":"terminateInstance", "action":"aws:changeInstanceState", "maxAttempts":1, "onFailure":"Continue", "inputs":{ "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "DesiredState":"terminated" } }, { "name":"updateSsmParam", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs":{ "FunctionName":"Automation-UpdateSsmParam", "Payload":"{\"parameterName\":\"latestAmi\", \"parameterValue\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  7. 选择创建自动化以保存运行簿。

  8. 在导航窗格中,选择 Automation (自动化),然后选择 Execute automation (执行自动化)

  9. Choose document (选择文档) 页中,选择 Owned by me (由我拥有) 选项卡,然后选择 UpdateMyLatestWindowsAmi 卡片中的按钮。

  10. 文档详细信息部分,验证文档版本是否设置为 1 (默认)

  11. 选择 Next

  12. 选择 Simple execution (简单执行)

  13. 选择 Execute (执行)

  14. 自动化完成后,选择Parameter Store,并确认latestAmi与自动化返回的值匹配。您也可以验证新的AMIID 与AMI部 Amazon EC2。