演练:修补 AMI 并更新 Auto Scaling 组 - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

演练:修补 AMI 并更新 Auto Scaling 组

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

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

开始前的准备工作

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

  • 为自动化(Amazon Systems Manager 的一项功能)配置 IAM 角色。Systems Manager 需要实例配置文件角色和服务角色 ARN 来处理自动化。有关更多信息,请参阅 设置自动化

  • 如果您不熟悉 Lambda,建议您使用 Amazon Lambda 开发人员指南中的创建简单的 Lambda 函数主题创建简单的 Lambda 函数。此主题将帮助您详细了解创建 Lambda 函数所需的一些步骤。

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

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

为 Lambda 创建 IAM 服务角色

  1. 通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/

  2. 在导航窗格中,选择 Roles (角色),然后选择 Create role (创建角色)

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

  4. 选择使用场景部分,请选择 Lambda,然后选择下一步:权限

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

  6. 请选择下一步:标签

  7. (可选)添加一个或多个标签键值对以组织、跟踪或控制该角色的访问,然后选择下一步: 审核

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

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

  10. 选择 Create role(创建角色)。系统将让您返回到 Roles (角色) 页面。

任务 2:创建 Amazon Lambda 函数

使用以下过程创建 Lambda 函数,该函数自动使用最新修补的 AMI 更新现有的 Auto Scaling 组。

创建 Lambda 函数

  1. 登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Lambda 控制台:https://console.aws.amazon.com/lambda/

  2. 选择 Create function(创建函数)。

  3. 验证是否已选中从 Scratch 开始创作

  4. 函数名称字段中输入 Automation-UpdateAsg

  5. 运行时列表中,选择 Python 3.7

  6. 展开权限下方的更改默认执行角色,验证是否选择了使用现有角色

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

  8. 选择 Create function(创建函数)。系统将显示 Automation-UpdateAsg 的代码和配置页面。

  9. 设计器部分中不进行任何更改。

  10. Code source(代码源)部分中,删除 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. 选择保存

  13. 选择部署

  14. 选择测试

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

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

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

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

    { "newAmiID":"valid AMI ID", "targetASG":"name of your Auto Scaling group" }
  19. 选择 Create (创建)

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

任务 3:创建一个运行手册,修补 AMI,并更新 Auto Scaling 组

使用以下过程创建并运行一个运行手册,该运行手册修补您为 latestAmi 参数指定的 AMI。然后,自动化更新 Auto Scaling 组以使用最新的修补后的 AMI。

创建运行手册并运行

  1. 访问 https://console.aws.amazon.com/systems-manager/,打开 Amazon Systems Manager 控制台。

  2. 在导航窗格中,选择 文档

    -或者-

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

  3. 创建文档下拉菜单中,选择自动化

  4. 名称字段中,输入 PatchAmiandUpdateAsg

  5. 选择编辑器选项卡,然后选择编辑按钮。

  6. 出现提示时选择确定,然后删除文档编辑器字段中的占位符内容。

  7. 文档编辑器字段中,粘贴以下 JSON 示例文档内容。

    注意

    您必须使用您在 设置自动化 过程中创建的服务角色 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" }, "subnetId":{ "type":"String", "description":"The SubnetId where the instance is launched from the sourceAMIid." }, "targetAMIname":{ "type":"String", "description":"Name of new AMI", "default":"patchedAMI-{{global:DATE_TIME}}" }, "targetASG":{ "type":"String", "description":"Auto Scaling 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", "SubnetId":"{{ subnetId }}" } }, { "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" ] }
  8. 选择创建自动化以保存文档。

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

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

  11. 选择 Next (下一步)

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

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

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

  15. sourceAMIid 指定 Windows AMI ID,为 targetASG 指定 Auto Scaling 组名称,并为 subnetId 输入参数指定一个值。

  16. 选择执行

  17. 自动化完成后,在 Amazon EC2 控制台中,选择 Auto Scaling,然后选择启动配置。确认看到了新的启动配置,并且使用了新 AMI ID。

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

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

注意

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