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

修补 AMI 和更新 Auto Scaling 组

以下示例建立在 使用 Automation、Lambda 和 Parameter Store 简化 AMI 修补 示例的基础上,并增加了使用新修补的 AMI 来更新 Auto Scaling 组的步骤。此过程确保新映像自动可供使用 Auto Scaling 组的不同计算环境使用。

此示例中 Automation 工作流的最后一步使用 AWS Lambda 函数复制现有启动配置并将 AMI ID 设置为新修补的 AMI。然后,使用新启动配置更新 Auto Scaling 组。在此类型的 Auto Scaling 方案中,用户可以终止 Auto Scaling 组中的现有实例以强制启动使用新映像的实例。或者,用户可以等待以允许缩减或扩展事件正常启动较新的实例。

开始前的准备工作

在开始本示例之前,请完成以下任务。

  • 完成 使用 Automation、Lambda 和 Parameter Store 简化 AMI 修补 示例。以下示例使用在该示例中创建的 UpdateMyLatestWindowsAmi Automation 文档。

  • 为 Automation 配置 IAM 角色。Systems Manager 需要实例配置文件角色和服务角色 ARN 来处理 Automation 工作流。有关更多信息,请参阅 设置 Automation

  • 如果您不熟悉 Lambda,建议您使用 AWS Lambda Developer Guide 中的创建简单的 Lambda 函数主题创建简单的 Lambda 函数。此主题将帮助您详细了解创建 Lambda 函数所需的一些步骤。

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

使用以下过程为 AWS Lambda 创建 IAM 服务角色。此角色包括 AWSLambdaExecuteAutoScalingFullAccess 托管策略。这些策略授予 Lambda 权限,以便使用 Lambda 函数通过最新修补的 AMI 创建新 Auto Scaling 组。

为 Lambda 创建 IAM 服务角色

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

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

  3. 选择受信任实体的类型页面上的 AWS 服务下,选择 Lambda

  4. 选择您的使用案例部分中,依次选择 Lambda下一步: 权限

  5. 附加权限策略页面上,搜索 AWSLambdaExecute,然后选择它旁边的选项。搜索 AutoScalingFullAccess,然后选择它旁边的选项。

  6. 选择下一步: 审核

  7. 审核页面上,验证 AWSLambdaExecuteAutoScalingFullAccess 是否列在策略下。

    将示例代码粘贴到 lambda_function 字段中
  8. 角色名称框中键入名称,然后键入描述。

  9. 选择 Create role。系统将让您返回到 Roles 页。

步骤 2:创建 AWS Lambda 函数

使用以下过程创建新 Lambda 函数,该函数字段使用最新修补的 AMI 创建新 Auto Scaling 组。

创建 Lambda 函数

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

  2. 选择 Create function

  3. 验证从头开始创作是否处于选中状态。

  4. 名称字段中,键入 Automation-UpdateAsg。

  5. Runtime 列表中,选择 Python 2.7

  6. 角色列表中,验证选择现有角色是否处于选中状态。

  7. 现有角色列表中,选择您先前创建的角色。

  8. 选择 Create function。系统将显示 Automation-UpdateSAsg 的代码和配置页面。

  9. Designer 部分中不进行任何更改。

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

    将示例代码粘贴到 lambda_function 字段中
    from __future__ import print_function import json import datetime import time import boto3 print('Loading function') def lambda_handler(event, context): print("Received event: " + json.dumps(event, indent=2)) # get autoscaling client client = boto3.client('autoscaling') # get object for the ASG we're going to update, filter by name of target ASG response = client.describe_auto_scaling_groups(AutoScalingGroupNames=[event['targetASG']]) if not response['AutoScalingGroups']: return 'No such ASG' # get name of InstanceID in current ASG that we'll use to model new Launch Configuration after sourceInstanceId = response.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId'] # create LC using instance from target ASG as a template, only diff is the name of the new LC and new AMI timeStamp = time.time() timeStampString = datetime.datetime.fromtimestamp(timeStamp).strftime('%Y-%m-%d %H-%M-%S') newLaunchConfigName = 'LC '+ event['newAmiID'] + ' ' + timeStampString client.create_launch_configuration( InstanceId = sourceInstanceId, LaunchConfigurationName=newLaunchConfigName, ImageId= event['newAmiID'] ) # update ASG to use new LC response = client.update_auto_scaling_group(AutoScalingGroupName = event['targetASG'],LaunchConfigurationName = newLaunchConfigName) return 'Updated ASG `%s` with new launch configuration `%s` which includes AMI `%s`.' % (event['targetASG'], newLaunchConfigName, event['newAmiID'])
  11. 指定此页面上的其余配置选项。

  12. 选择 Save

  13. 选择 Test

  14. 配置测试事件页面中,验证创建新测试事件是否处于选中状态。

  15. 事件模板列表中,验证 Hello World 是否处于选中状态。

  16. 事件名称字段中,键入名称。

  17. 将现有示例替换为以下 JSON。输入 AMI ID 和 Auto Scaling 组。

    { "newAmiID":"valid AMI ID", "targetASG":"name of your Auto Scaling group" }
  18. 选择 Save

  19. 选择 Test。输出表明,已使用新的启动配置成功更新 Auto Scaling 组。

任务 3:创建一个 Automation 文档,修补 AMI,并更新 Auto Scaling 组

使用以下过程创建并运行 Automation 文档,该文档修补您为 latestAmi 参数指定的 AMI。然后,Automation 工作流更新 Auto Scaling 组以使用最新的修补后的 AMI。

创建并运行自动化文档 ()

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

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

    -或者-

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

  3. 选择创建文档

  4. Name 字段中,键入 PatchAmiandUpdateAsg。

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

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

    注意

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

    { "description":"Systems Manager Automation Demo - Patch AMI and Update ASG", "schemaVersion":"0.3", "assumeRole":"the service role ARN you created", "parameters":{ "sourceAMIid":{ "type":"String", "description":"AMI to patch" }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" }, "targetASG":{ "type":"String", "description":"Autosaling group to Update" } }, "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 instance 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":"updateASG", "action":"aws:invokeLambdaFunction", "timeoutSeconds":1200, "maxAttempts":1, "onFailure":"Abort", "inputs": { "FunctionName": "Automation-UpdateAsg", "Payload": "{\"targetASG\":\"{{targetASG}}\", \"newAmiID\":\"{{createImage.ImageId}}\"}" } } ], "outputs":[ "createImage.ImageId" ] }
  7. 选择创建文档以保存文档。

  8. 选择自动化,然后选择执行自动化

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

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

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

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

  13. sourceAMIid 指定 Windows AMI ID,为 targetASG 指定您的 Auto Scaling 组名。

  14. 选择执行自动化

  15. 执行完成后,在 Amazon EC2 控制台中,选择 Auto Scaling,然后选择 Launch Configurations。 验证您看到了新的启动配置,并且使用了新 AMI ID。

  16. 选择 Auto Scaling,然后选择 Auto Scaling Groups。验证 Auto Scaling 组使用了新的启动配置。

  17. 终止 Auto Scaling 组中的一个或多个实例。使用新 AMI ID 替换将要启动的实例。

注意

您可以通过编辑 Lambda 函数正常终止实例,从而进一步自动完成新 AMI 的部署。您还可以调用自己的 Lambda 函数并利用 AWS CloudFormation 的功能来更新 Auto Scaling 组。有关更多信息,请参阅 UpdatePolicy Attribute