更新 AMIs
以下教程说明了如何更新 Amazon Machine Image(AMIs)以包含最新补丁。
主题
更新 Linux AMI(AWS CLI)
此 AWS Systems Manager 自动化演练介绍如何使用 AWS Command Line Interface (AWS CLI) 和 Systems Manager AWS-UpdateLinuxAmi
运行手册通过指定的最新版本软件包自动修补 Linux Amazon Machine Image (AMI)。自动化是 AWS Systems Manager 的一项功能。AWS-UpdateLinuxAmi
运行手册也能自动安装其他具体站点相关的软件包和配置。您可以使用该演练更新各种 Linux 分发版,包括 Ubuntu Server、CentOS、RHEL、SLES 或 Amazon Linux AMIs。有关支持的 Linux 版本的完整列表,请参阅 Patch Manager 先决条件。
使用 AWS-UpdateLinuxAmi
运行手册可以自动完成映像维护任务,而无需使用 JSON 或 YAML 编写运行手册。您可以使用 AWS-UpdateLinuxAmi
运行手册执行以下类型的任务。
-
在 Amazon Linux、Red Hat Enterprise Linux、Ubuntu Server、SLES 或 CentOS Amazon Machine Image(AMI)上升级所有分发程序包和 Amazon 软件。这是默认运行手册行为。
-
在现有映像上安装 AWS Systems Manager SSM Agent 以启用 Systems Manager 功能,例如使用 AWS Systems Manager Run Command 的远程命令执行,或者使用 Inventory 的软件清单收集。
-
安装其他软件包。
开始前的准备工作
在您开始使用运行手册之前,请先为自动化配置角色和 EventBridge(后者可选)。有关更多信息,请参阅 设置自动化。此演练还要求您指定 AWS Identity and Access Management (IAM) 实例配置文件的名称。有关创建 IAM 实例配置文件的更多信息,请参阅配置 Systems Manager 所需的实例权限。
AWS-UpdateLinuxAmi
运行手册接受以下输入参数。
参数 | 类型 | 描述 |
---|---|---|
SourceAmiId |
String |
(必需)源 AMI ID。您可以使用 AWS Systems Manager Parameter Store 公有参数自动引用最新的 Linux Amazon EC2 AMI ID。有关更多信息,请参阅使用 AWS Systems Manager Parameter Store 查询最新 Amazon Linux AMI ID |
IamInstanceProfileName |
String |
(必需)您在配置 Systems Manager 所需的实例权限中创建的 IAM 实例配置文件角色的名称。实例配置文件角色为自动化提供在您实例上执行操作的权限,例如运行命令或启动和停止服务。运行手册仅使用实例配置文件角色的名称。 |
AutomationAssumeRole |
String |
(必需)您在 设置自动化 中创建的 IAM 服务角色的名称。服务角色(也称为担任角色)为自动化提供权限,用于担任您的 IAM 角色和代表您执行操作。例如,在运行手册中运行 |
TargetAmiName |
String |
(可选)新 AMI 在创建之后的名称。默认名称是系统生成的字符串,其中包括源 AMI ID 以及创建时间和日期。 |
InstanceType |
String |
(可选) 启动作为工作区主机的实例的类型。实例类型因区域而异。默认类型为 t2.micro。 |
PreUpdateScript |
String |
(可选) 在应用更新前要运行的脚本的 URL。默认值 (\"none\") 不运行脚本。 |
PostUpdateScript |
String |
(可选) 在应用软件包更新后要运行的脚本的 URL。默认值 (\"none\") 不运行脚本。 |
IncludePackages |
String |
(可选) 仅更新这些指定的软件包。默认值 (\"all\") 将应用所有可用的更新。 |
ExcludePackages |
String |
(可选) 在所有情况下从更新中排除的软件包的名称。默认值 (\"none\") 不排除任何软件包。 |
自动化步骤
默认情况下,AWS-UpdateLinuxAmi
运行手册包括以下步骤。
- 步骤 1:launchInstance(
aws:runInstances
操作) -
此步骤使用 Amazon Elastic Compute Cloud (Amazon EC2) 用户数据和 IAM 实例配置文件角色启动实例。用户数据根据操作系统安装相应的 SSM Agent。安装 SSM Agent后,您可以利用 Systems Manager 功能,例如 Run Command、State Manager 和 Inventory。
- 步骤 2:updateOSSoftware(
aws:runCommand
操作) -
此步骤在已启动实例上运行以下命令:
-
从 Amazon Simple Storage Service (Amazon S3) 下载更新脚本。
-
运行可选的更新前脚本。
-
更新分发软件包和 Amazon 软件。
-
运行可选的更新后脚本。
执行日志存储在 /tmp 文件夹中,供用户以后查看。
如果您希望升级特定软件包集,则可以使用
IncludePackages
参数提供列表。在提供时,系统仅尝试更新这些软件包及其依赖项。不执行任何其他更新。默认情况下,如果未指定包含 软件包,则程序将更新所有可用软件包。如果要在升级中排除特定软件包集,则可以向
ExcludePackages
参数提供列表。如果提供,这些软件包保持其当前版本,与任何其他指定的选项无关。默认情况下,在未指定任何排除软件包时,将不排除软件包。 -
- 步骤 3:stopInstance(
aws:changeInstanceState
操作) -
此步骤停止已更新实例。
- 步骤 4:createImage(
aws:createImage
操作) -
此步骤创建一个新 AMI,带有可将其链接到源 ID 和创建时间的描述性名称。例如:“EC2 自动化在 {{global:DATE_TIME}} 从 {{SourceAmiId}} 生成了 AMI”,其中 DATE_TIME 和 SourceID 表示自动化变量。
- 步骤 5:terminateInstance(
aws:changeInstanceState
操作) -
此步骤通过终止正在运行的实例来清除执行过程。
- 输出
-
自动化返回新的 AMI ID 作为输出。
注意
默认情况下,当自动化运行 AWS-UpdateLinuxAmi
运行手册时,系统会在默认 VPC (172.30.0.0/16) 中创建一个临时实例。如果您删除了默认 VPC,会收到以下错误:
VPC not defined 400
要解决此问题,您必须复制 AWS-UpdateLinuxAmi
运行手册并指定子网 ID。有关更多信息,请参阅 VPC not defined 400。
使用自动化创建经过修补的 AMI
安装并配置 AWS Command Line Interface(AWS CLI)(如果尚未执行该操作)。
有关信息,请参阅安装或更新 AWS CLI 的最新版本。
-
运行以下命令来运行
AWS-UpdateLinuxAmi
运行手册。将每个示例资源占位符
替换为您自己的信息。aws ssm start-automation-execution \ --document-name "AWS-UpdateLinuxAmi" \ --parameters \ SourceAmiId=
AMI ID
, \ IamInstanceProfileName=IAM instance profile
, \ AutomationAssumeRole='arn:aws:iam::{{global:ACCOUNT_ID}}:role/AutomationServiceRole
'该命令将会返回执行 ID。请将该 ID 复制到剪贴板。您将使用该 ID 查看自动化的状态。
{ "AutomationExecutionId": "
automation execution ID
" } -
要使用 AWS CLI 查看自动化,请运行以下命令:
aws ssm describe-automation-executions
-
运行以下命令以查看有关运行手册进程的详细信息。将
automation execution ID
替换为您自己的信息。aws ssm get-automation-execution --automation-execution-id
automation execution ID
更新过程可能需要 30 分钟或者更久。
注意
您也可以在控制台中监控自动化的状态。在列表中,选择您刚才运行的自动化,然后选择步骤选项卡。该选项卡将显示自动化操作的状态。
在自动化完成后,请从更新后的 AMI 启动测试实例以验证更改。
注意
如果自动化有任何步骤失败,自动化执行页面上会列出有关失败的信息。自动化设计为在成功完成所有任务后终止临时实例。如果步骤失败,系统可能不会终止实例。因此,如果某个步骤失败,请手动终止临时实例。