演练:使用自动化、AMI 和 Parameter Store 简化 Amazon Lambda 的修补 - Amazon Systems Manager
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

演练:使用自动化、AMI 和 Parameter Store 简化 Amazon Lambda 的修补

以下示例在如何更新 Windows AMI 基础之上扩展,这些内容在 演练:修补 Windows Server AMI 中介绍。此示例使用组织维护和定期修补自己专有 AMIs 的模型,而非构建自 Amazon Elastic Compute Cloud (Amazon EC2) AMIs。

以下过程说明了如何自动应用操作系统 (OS) 补丁到已视为最新的 Windows AMI 或最新的 AMI。在示例中,参数 SourceAmiId 的默认值由名为 latestAmi 的 Amazon Systems Manager Parameter Store 参数定义。latestAmi 的值由调用的 Amazon Lambda 函数在自动化结束时更新。由于采用此自动化过程,因此修补 AMIs 所需的时间和工作量可最大限度减少,因为修补操作始终都应用到最新的 AMI。Parameter Store 和自动化是 Amazon Systems Manager 的功能。

开始前的准备工作

配置自动化角色以及(可选)为自动化配置 Amazon EventBridge。有关更多信息,请参阅设置自动化

任务 1:在 Systems Manager Parameter Store 中创建一个参数

在 Parameter Store 中创建一个使用以下信息的字符串参数:

  • 名称latestAmi

  • :Windows AMI ID。例如: ami-188d6e0e

有关如何创建 Parameter Store 字符串参数的信息,请参阅创建 Systems Manager 参数

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

使用以下过程为 Amazon Lambda 创建 IAM 服务角色。这些策略授予 Lambda 权限,以便使用 Lambda 函数和 Systems Manager 来更新 latestAmi 参数的值。

为 Lambda 创建 IAM 服务角色

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

  2. 在导航窗格中选择策略,然后选择创建策略

  3. 请选择 JSON 选项卡。

  4. 将默认内容替换为以下内容。务必将 us-west-2123456789012 替换为您要使用的区域和账户。将 updateAmiFunction 替换为 Lambda 函数的名称。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-west-2:123456789012:*" }, { "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": [ "arn:aws:logs:us-west-2:123456789012:log-group:/aws/lambda/updateAmiFunction:*" ] } ] }
  5. 选择 Review policy (审核策略)

  6. 查看策略页面上,对于名称,输入内联策略的名称,例如 amiLambda

  7. 选择 Create policy(创建策略)。

  8. 重复步骤 2 和 3。

  9. 将默认内容替换为以下内容。务必将 us-west-2123456789012 替换为您要使用的区域和账户。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "ssm:PutParameter", "Resource": "arn:aws:ssm:us-west-2:123456789012:parameter/latestAmi" }, { "Effect": "Allow", "Action": "ssm:DescribeParameters", "Resource": "*" } ] }
  10. 选择 Review policy (审核策略)

  11. 查看策略页面上,对于名称,输入内联策略的名称,例如 amiParameter

  12. 选择 Create policy(创建策略)。

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

  14. 在紧靠选择将使用此角色的服务下面,选择 Lambda,然后选择下一步:权限

  15. 附加权限策略 页面上,使用搜索 字段查找之前创建的两个策略。

  16. 选择策略旁边的复选框,然后选择下一步:标签

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

  18. 对于角色名称,请输入新角色的名称,如 lambda-ssm-role 或所需的其他名称。

    注意

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

  19. 选择 Create role(创建角色)。

任务 3:创建 Amazon Lambda 函数

使用以下过程创建 Lambda 函数,该函数自动更新 latestAmi 参数的值。

创建 Lambda 函数

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

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

  3. 创建函数页面上,选择从 Scratch 开始创作

  4. 对于函数名称,请键入 Automation-UpdateSsmParam

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

  6. 权限部分中,展开选择或创建执行角色

  7. 选择使用现有角色,然后为您在任务 2 中创建的 Lambda 选择服务角色。

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

  9. 函数代码部分中的 lambda_function 选项卡上,删除此字段中的预填充代码,然后粘贴以下代码示例。

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

  11. 要测试 Lambda 函数,请从选择测试事件菜单中选择配置测试事件

  12. 对于事件名称,输入测试事件的名称,如 MyTestEvent

  13. 将现有文本替换为以下 JSON,将 your-ami-id 替换为要设置为 latestAmi 参数值的新 AMI 的 ID。

    { "parameterName":"latestAmi", "parameterValue":"your-ami-id" }
  14. 选择 Create (创建)

  15. 选择测试以测试该函数。输出应说明已成功更新参数并包括有关更新的详细信息。例如,“已使用值 ami-123456 更新参数 latestAmi”。

任务 4:创建运行手册并修补 AMI

使用以下过程创建并运行运行手册,该文档修补您为 latestAmi 参数指定的 AMI。在自动化完成后,使用新修补的 AMI 的 ID 更新 latestAmi 的值。后续自动化使用先前执行创建的 AMI。

创建运行手册并修补 AMI

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

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

    -或者-

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

  3. 选择创建自动化

  4. 名称字段中,键入 UpdateMyLatestWindowsAmi

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

  6. 文档编辑器字段中的默认内容替换为以下 JSON 示例文档。

    注意

    您必须使用您在 设置自动化 过程中创建的服务角色 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-InstallWindowsUpdates", "InstanceIds":[ "{{ startInstances.InstanceIds }}" ], "Parameters":{ "SeverityLevels":"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. 选择 Next (下一步)

  12. 选择简单执行

  13. 选择执行

  14. 自动化完成后,在导航窗格中选择 Parameter Store,并确认 latestAmi 的新值与自动化返回的值匹配。您还可以验证新 AMI ID 与 Amazon EC2 控制台的 AMI 部分中的自动化输出匹配。