AWS Systems Manager
用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

使用 Automation、Lambda 和 Parameter Store 简化 AMI 修补

以下示例在如何更新 Windows AMI 基础之上扩展,这些内容在 修补 Windows AMI 中介绍。此示例使用组织维护和定期修补自己专有 AMI 的模型,而非构建自 Amazon EC2 AMI。

以下过程演示如何自动应用操作系统 (OS) 补丁到已视为最新的 Windows AMI 或最新 AMI。在示例中,参数 SourceAmiId 的默认值由名为 latestAmi 的 Systems Manager Parameter Store 参数定义。latestAmi 的值由 AWS Lambda 函数在 Automation 工作流结束时更新。由于此 Automation 过程,修补 AMI 所需的时间和工作量都尽可能减少,因为修补操作始终都应用到最新的 AMI。

开始前的准备工作

配置 Automation 角色以及 (可选) 为 Automation 配置 CloudWatch Events。有关更多信息,请参阅 Automation 入门

任务 1:在 Systems Manager Parameter Store 中创建一个参数

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

  • 名称:latestAmi。

  • :Windows AMI ID。例如:ami-188d6e0e。

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

任务 2:为 AWS Lambda 创建 IAM 角色

使用以下过程为 AWS Lambda 创建 IAM 服务角色。此角色包括 AWSLambdaExecuteAmazonSSMFullAccess 托管策略。这些策略授予 Lambda 权限,以便使用 Lambda 函数和 Systems Manager 来更新 latestAmi 参数的值。

为 Lambda 创建 IAM 服务角色

  1. Open the IAM console at https://console.amazonaws.cn/iam/.

  2. 在导航窗格中选择 Roles,然后选择 Create New Role

  3. 对于 Role name,键入可帮助您识别此角色用途的角色名称,例如,lambda-ssm-role。角色名称在您的 AWS 账户内必须是唯一的。键入名称后,选择页面底部的 Next Step

    注意

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

  4. 选择角色类型页面中,选择 AWS 服务角色部分,然后选择 AWS Lambda

  5. Attach Policy 页面中,选择 AWSLambdaExecuteAmazonSSMFullAccess,然后选择 Next Step

  6. 选择 Create Role

步骤 3:创建 AWS Lambda 函数

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

创建 Lambda 函数

  1. Sign in to the AWS Management Console and open the AWS Lambda console at https://console.amazonaws.cn/lambda/.

  2. 选择 Create a Lambda function

  3. Select blueprint 页面上,选择 Blank Function

  4. Configure triggers 页面上,选择 Next

  5. Configure function 页面的 Name 字段中键入 Automation-UpdateSsmParam,如果需要还可键入说明。

  6. Runtime 列表中,选择 Python 2.7

  7. Lambda 函数代码部分中,删除字段中预填充的代码,然后粘贴以下代码示例。

    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
  8. Lambda 函数处理程序和角色部分的角色列表中,选择在任务 2 中为 Lambda 创建的服务角色。

  9. 选择 Next,然后选择 Create function

  10. 要测试 Lambda 函数,请从操作菜单选择配置测试事件

  11. 使用以下 JSON 替换现有文本。

    { "parameterName":"latestAmi", "parameterValue":"your AMI ID" }
  12. 选择 Save and test。输出应说明已成功更新参数并包括有关更新的详细信息。例如,“已使用值 ami-123456 更新参数 latestAmi”。

任务 4:创建 Automation 文档并修补 AMI

使用以下过程创建并运行 Automation 文档,该文档修补您为 latestAmi 参数指定的 AMI。在 Automation 工作流程完成后,使用新修补的 AMI 的 ID 更新 latestAmi 的值。接下来的执行过程使用以前执行创建的 AMI。

根据您使用的服务 (AWS Systems Manager 或 Amazon EC2 Systems Manager),请采用下列过程之一:

创建 Automation 文档并修补 AMI (AWS Systems Manager)

  1. https://console.www.amazonaws.cn/systems-manager/ 上打开 AWS Systems Manager 控制台。

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

    -或者-

    如果 AWS Systems Manager 主页首先打开,请选择菜单图标 ( ) 以打开导航窗格,然后在导航窗格中选择 Documents

  3. 选择创建文档

  4. Name 字段中,键入 UpdateMyLatestWindowsAmi。

  5. 文档类型列表中,选择自动化文档

  6. 删除 Content 字段中的方括号,然后将以下 JSON 实例文档粘贴到此处。

    注意

    您必须使用在 Automation 入门 时创建的服务角色 ARN 和实例配置文件角色,来更改此示例中 assumeRoleIamInstanceProfileName 的值。

    { "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-InstallMissingWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "UpdateLevel":"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. 在导航窗格中,选择自动化,然后选择执行自动化

  9. 自动化文档列表中,选择 UpdateMyLatestWindowsAmi

  10. 文档详细信息部分,确认文档版本是否设置为 1

  11. 执行模式部分中,选择一次执行整个自动化

  12. 保留目标和速率控制选项为禁用状态。

  13. 执行完成后,在导航窗格中选择 Parameter Store,并确认 latestAmi 的新值与 Automation 工作流程返回的值匹配。您还可以验证新 AMI ID 与 EC2 控制台的 AMI 部分中的 Automation 输出匹配。

创建 Automation 文档并修补 AMI (Amazon EC2 Systems Manager)

  1. Open the Amazon EC2 console at https://console.amazonaws.cn/ec2/.

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

  3. 选择 Create Document

  4. Name 字段中,键入 UpdateMyLatestWindowsAmi。

  5. Document Type 列表中,选择 Automation

  6. 删除 Content 字段中的方括号,然后将以下 JSON 实例文档粘贴到此处。

    注意

    您必须使用在 Automation 入门 时创建的服务角色 ARN 和实例配置文件角色,来更改此示例中 assumeRoleIamInstanceProfileName 的值。

    { "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-InstallMissingWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "UpdateLevel":"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. 选择 Create Document 保存文档。

  8. 在导航窗格中展开 Systems Manager Services,选择 Automations,然后选择 Run automation

  9. Document name 列表中,选择 UpdateMyLatestWindowsAmi

  10. Version 列表中,选择 1,然后选择 Run automation

  11. 执行完成后,在 Amazon EC2 控制台中选择 Parameter Store,并确认 latestAmi 的新值与 Automation 工作流程返回的值匹配。您还可以验证新 AMI ID 与 EC2 控制台的 AMI 部分中的 Automation 输出匹配。