AWS 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 中创建一个参数

在 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. 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 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 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。

创建自动化文档并修补 AMI ()

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