Amazon EC2 Systems Manager
用户指南
AWS 服务或AWS文档中描述的功能,可能因地区/位置而异。点 击 Getting Started with Amazon AWS to see specific differences applicable to the China (Beijing) Region.

修补 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 组中的现有实例以强制启动使用新映像的实例。或者,用户可以等待以允许缩减或扩展事件正常启动较新的实例。

开始前的准备工作

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

任务 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 New Role

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

    注意

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

  4. Select Role Type 页面中,选择 AWS Service Roles 部分,然后选择 AWS Lambda

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

  6. 选择 Create Role

步骤 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 a Lambda function

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

  4. Configure triggers 页面上,选择 Next

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

  6. Runtime 列表中,选择 Python 2.7

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

    Copy
    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'])
  8. Lambda function handler and role 部分的 Role 列表中,选择您在任务 1 中为 Lambda 创建的服务角色。

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

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

  11. 使用以下 JSON 替换现有文本,并输入 AMI ID 和 Auto Scaling 组。

    Copy
    { "newAmiID": "valid AMI ID", "targetASG": "name of your Auto Scaling group" }
  12. 选择 Save and test。输出表明,已使用新的启动配置成功更新 Auto Scaling 组。

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

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

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

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

  3. 选择 Create Document

  4. Name 字段中,键入 PatchAmiandUpdateAsg。

  5. Document Type 列表中,选择 Automation

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

    注意

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

    Copy
    { "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. 选择 Create Document 保存文档。

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

  9. Document name 列表中,选择 PatchAmiandUpdateAsg

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

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

  12. 选择 Run automation

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

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

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

注意

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