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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

演练:PatchAMI并更新 Auto Scaling 组

以下示例构建在演练:简化AMI使用 Automation、Amazon Lambda和 Parameter Store示例,方法是添加一个使用新修补的 Auto Scaling 组更新 Automation 组的步骤AMI。此过程确保新映像自动可供使用 Auto Scaling 组的不同计算环境使用。

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

开始前的准备工作

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

  • 配置 IAM 角色以实现自动化,Amazon Web Services Systems Manager。Systems Manager agement 需要实例配置文件角色和服务角色 ARN 来处理自动化。有关更多信息,请参阅 设置 Automation

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

Task 1:为 Amazon Lambda 创建 IAM 角色

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

为 Lambda 创建 IAM 服务角色

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

  2. 在导航窗格中,选择角色,然后选择创建角色

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

  4. 选择使用案例部分,选择。Lambda,然后选择后续:Permissions (下一步:权限)

  5. 在存储库的附加权限策略页面上,搜索AWSLambda 执行,然后选择它旁边的选项。搜索 AutoScalingFullAccess,然后选择它旁边的选项。

  6. 选择 Next:。标签

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

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

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

  10. 选择创建角色。系统将让您返回到角色页。

Task 2:创建Amazon Lambdafunction

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

创建 Lambda 函数

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

  2. 选择创建函数

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

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

  5. Runtime 列表中,选择 Python 2.7

  6. Expand选择或创建执行角色然后,在执行角色列表中,验证使用现有角色处于选择状态。

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

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

  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. 选择保存

  13. 选择 Test (测试)

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

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

  16. Event name (事件名称)字段中,输入名称。

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

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

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

Task 3:创建 Runbook,修补 AMI,并更新 Auto Scaling tomation 组

使用以下过程可创建和运行用于修补AMI您指定的latestAmi参数。然后,Auto Scaling 组更新以使用最新的修补后的修补后的 Auto Scaling 组。AMI。

创建并运行运行手册

  1. 打开Amazon Web Services Systems Manager控制台https://console.aws.amazon.com/systems-manager/

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

    -或者-

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

  3. 选择 Create automation (创建自动化)

  4. Name (名称) 字段中,输入 PatchAmiandUpdateAsg

  5. 选择 Editor (编辑器) 选项卡,然后选择 Edit (编辑) 按钮。

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

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

    注意

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

    { "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. Automation 文档列表中,选择 PatchAmiandUpdateAsg

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

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

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

  14. 指定一个窗口AMI的 IDsourceAMIid,您的 Auto Scaling 组名称targetASG,以及subnetId输入参数。

  15. 选择执行自动化

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

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

  18. 终止 Auto Scaling 组中的一个或多个实例。替换实例将使用新的AMIID。

注意

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