Amazon EC2 Systems Manager
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。请点击 Amazon AWS 入门,可查看中国地区的具体差异

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

以下示例在如何更新 Windows AMI 基础之上扩展,这些内容在 创建 Automation 文档 中介绍。此示例使用组织维护和定期修补自己专有 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 中创建参数

使用以下过程在 Systems Manager Parameter Store 中创建参数。通过 Parameter Store,您可以跨 Systems Manager 功能 (包括 Run Command、状态管理器 和 Automation) 引用参数 (称为“Systems Manager 参数”)。

使用 Parameter Store 创建参数

  1. 打开 Amazon EC2 控制台,展开导航窗格中的 Systems Manager Shared Resources,然后选择 Parameter Store

  2. 选择创建参数

  3. 对于 Name,请键入 latestAmi。

  4. Description 字段中,键入确定此参数用途的说明。

  5. 对于类型,选择字符串

  6. Value 字段中,输入 Windows AMI ID。例如:ami-188d6e0e。

  7. 选择 Create Parameter,然后选择 OK

任务 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. Select Role Type 页面中,选择 AWS Service Roles 部分,然后选择 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 function code 部分中,删除字段中预填充的代码,然后粘贴以下代码示例。

    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 Descrition 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 function handler and role 部分的 Role 列表中,选择您在任务 2 中为 Lambda 创建的服务角色。

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

  10. 要测试 Lambda 函数,请从 Actions 菜单选择 Configure Test Event

  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。

  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 输出匹配。