演练:使用自动化、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 服务角色
登录 Amazon Web Services Management Console,然后通过以下网址打开 IAM 控制台:https://console.aws.amazon.com/iam/
。 -
在导航窗格中选择策略,然后选择创建策略。
-
请选择 JSON 选项卡。
-
将默认内容替换为以下内容。务必将
us-west-2
和123456789012
替换为您要使用的区域和账户。将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
:*" ] } ] } -
选择 Review policy (审核策略)。
-
在查看策略页面上,对于名称,输入内联策略的名称,例如
amiLambda
。 -
选择 Create policy(创建策略)。
-
重复步骤 2 和 3。
-
将默认内容替换为以下内容。务必将
us-west-2
和123456789012
替换为您要使用的区域和账户。{ "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": "*" } ] } -
选择 Review policy (审核策略)。
-
在查看策略页面上,对于名称,输入内联策略的名称,例如
amiParameter
。 -
选择 Create policy(创建策略)。
-
在导航窗格中,选择 Roles (角色),然后选择 Create role (创建角色)。
-
在紧靠选择将使用此角色的服务下面,选择 Lambda,然后选择下一步:权限。
-
在附加权限策略 页面上,使用搜索 字段查找之前创建的两个策略。
-
选择策略旁边的复选框,然后选择下一步:标签。
-
(可选)添加一个或多个标签键值对以组织、跟踪或控制该角色的访问,然后选择下一步: 审核。
-
对于角色名称,请输入新角色的名称,如
lambda-ssm-role
或所需的其他名称。注意 由于多个实体可能引用该角色,因此创建角色后无法更改角色的名称。
-
选择 Create role(创建角色)。
任务 3:创建 Amazon Lambda 函数
使用以下过程创建 Lambda 函数,该函数自动更新 latestAmi
参数的值。
创建 Lambda 函数
登录到 Amazon Web Services Management Console,然后通过以下网址打开 Amazon Lambda 控制台:https://console.aws.amazon.com/lambda/
。 -
选择 Create function(创建函数)。
-
在创建函数页面上,选择从 Scratch 开始创作。
-
对于函数名称,请键入
Automation-UpdateSsmParam
。 -
在运行时列表中,请选择 Python 3.8。
-
在权限部分中,展开选择或创建执行角色。
-
选择使用现有角色,然后为您在任务 2 中创建的 Lambda 选择服务角色。
-
选择 Create function(创建函数)。
-
在函数代码部分中的 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
-
选择保存。
-
要测试 Lambda 函数,请从选择测试事件菜单中选择配置测试事件。
-
对于事件名称,输入测试事件的名称,如
MyTestEvent
。 -
将现有文本替换为以下 JSON,将
your-ami-id
替换为要设置为latestAmi
参数值的新 AMI 的 ID。{ "parameterName":"latestAmi", "parameterValue":"
your-ami-id
" } -
选择 Create (创建) 。
-
选择测试以测试该函数。输出应说明已成功更新参数并包括有关更新的详细信息。例如,“已使用值 ami-123456 更新参数 latestAmi”。
任务 4:创建运行手册并修补 AMI
使用以下过程创建并运行运行手册,该文档修补您为 latestAmi 参数指定的 AMI。在自动化完成后,使用新修补的 AMI 的 ID 更新 latestAmi 的值。后续自动化使用先前执行创建的 AMI。
创建运行手册并修补 AMI
访问 https://console.aws.amazon.com/systems-manager/
,打开 Amazon Systems Manager 控制台。 在导航窗格中,选择 文档。
-或者-
如果首先打开 Amazon Systems Manager 主页,选择菜单图标 (
) 以打开导航窗格,然后在导航窗格中选择文档。
-
选择创建自动化。
-
在名称字段中,键入
UpdateMyLatestWindowsAmi
。 -
选择编辑器 选项卡,然后选择编辑。
-
将文档编辑器字段中的默认内容替换为以下 JSON 示例文档。
注意 您必须使用您在 设置自动化 过程中创建的服务角色 ARN 和实例配置文件角色,更改此示例中的
assumeRole
和IamInstanceProfileName
。{ "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" ] } -
选择创建自动化以保存文档。
-
在导航窗格中,选择自动化,然后选择执行自动化。
-
在选择文档页中,选择由我拥有选项卡,然后选择 UpdateMyLatestWindowsAmi 卡片中的按钮。
-
在文档详细信息部分,验证文档版本是否设置为 1(默认)。
-
选择 Next (下一步)。
-
选择简单执行。
-
选择执行。
-
自动化完成后,在导航窗格中选择 Parameter Store,并确认
latestAmi
的新值与自动化返回的值匹配。您还可以验证新 AMI ID 与 Amazon EC2 控制台的 AMI 部分中的自动化输出匹配。