

• AWS Systems Manager CloudWatch 控制面板在 2026 年 4 月 30 日之后将不再可用。客户可以像现在一样继续使用 Amazon CloudWatch 控制台来查看、创建和管理其 Amazon CloudWatch 控制面板。有关更多信息，请参阅 [Amazon CloudWatch 控制面板文档](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/CloudWatch_Dashboards.html)。

# AWS Systems Manager 更改管理工具
<a name="systems-manager-actions-and-change"></a>

AWS Systems Manager 提供以下工具，用于对 AWS 资源进行更改。

**Topics**
+ [AWS Systems Manager 自动化](systems-manager-automation.md)
+ [AWS Systems Manager Change Calendar](systems-manager-change-calendar.md)
+ [AWS Systems Manager Change Manager](change-manager.md)
+ [AWS Systems Manager 文档](documents.md)
+ [AWS Systems Manager Maintenance Windows](maintenance-windows.md)
+ [AWS Systems Manager Quick Setup](systems-manager-quick-setup.md)

# AWS Systems Manager 自动化
<a name="systems-manager-automation"></a>

Automation 是 AWS Systems Manager 中的一项工具，其简化了 Amazon Elastic Compute Cloud（Amazon EC2）、Amazon Relational Database Service（Amazon RDS）、Amazon Redshift、Amazon Redshift、Amazon Simple Storage Service（Amazon S3）等 AWS 服务的常见维护、部署和修复任务。要开始使用自动化，请打开 [Systems Manager 控制台](https://console.aws.amazon.com/systems-manager/automation)。在导航窗格中，选择**自动化**。

Automation 可帮助您构建用于大规模部署、配置和管理 AWS 资源的自动化解决方案。借助 Automation，您可以精确控制自动化的并发性。这意味着您可以指定同时定位多少资源，以及在停止自动化之前可能发生的错误数。

为了帮助您开始使用 Automation，AWS 开发和维护了几个预先定义的运行手册。根据您的应用场景，您可以使用这些预定义的运行手册来执行各种任务，或者创建更适合您的需求的自定义运行手册。要监控自动化的进度和状态，您可以使用 Systems Manager Automation 控制台或您的首选命令行工具。Automation 还与 Amazon EventBridge 集成，可帮助您大规模构建事件驱动型架构。

**注意**  
对于截至 2025 年 8 月 14 日的 Systems Manager Automation 新客户，自动化免费套餐不可用。对于已经使用自动化的客户，免费套餐服务将于 2025 年 12 月 31 日结束。有关当前服务成本的信息，请参阅 [AWS Systems Manager 定价](https://aws.amazon.com/systems-manager/pricing/)。

## 我的组织如何从 Automation 获益？
<a name="automation-benefits"></a>

Automation 具备下列优势：
+ **运行手册内容中的脚本支持**

  使用 `aws:executeScript` 操作，您可以直接从运行手册中运行自定义 Python 和 PowerShell 函数。这使您可以更灵活地创建自定义运行手册，因为您可以完成其他 Automation 操作不支持的各种任务。您还可以更好地控制运行手册的逻辑。有关如何使用此操作以及如何帮助改进现有自动化解决方案的示例，请参阅 [创作自动化运行手册](automation-authoring-runbooks.md)。
+  **从一个集中位置跨多个 AWS 账户 和 AWS 区域 运行自动化** 

  管理员可以从 Systems Manager 控制台跨多个账户和区域对资源运行自动化。
+  **增强操作安全** 

  管理员可以集中地授予和撤销对运行手册的访问。仅使用 AWS Identity and Access Management (IAM) 策略，您就可以控制贵企业中的哪些个人用户或组能够使用 Automation 以及他们能够访问的运行手册。
+  **自动执行常见 IT 任务** 

  自动执行常见任务可以帮助提高运营效率、强制执行组织标准并减少操作员错误。例如，您可以使用 `AWS-UpdateCloudFormationStackWithApproval` 运行手册来更新通过使用 AWS CloudFormation 模板部署的资源。更新会应用新模板。在更新开始之前，您可以配置 Automation 以请求由一个或多个用户批准。
+  **安全地批量执行中断性任务** 

  Automation 包含诸如速率控制之类的功能，使您可以通过指定并发值和错误阈值来控制自动化在整个机群上的部署。有关使用速率控制的更多信息，请参阅 [大规模运行自动化操作](running-automations-scale.md)。
+ **简化复杂任务**

  Automation 提供了预定义的运行手册，可简化复杂而耗时的任务，例如创建黄金 Amazon Machine Images (AMIs)。例如，您可以使用 `AWS-UpdateLinuxAmi` 和 `AWS-UpdateWindowsAmi` 运行手册从源 AMI 创建黄金 AMIs。使用这些运行手册，您可以在应用更新前后运行自定义脚本。您还可以包含特定软件包或从安装中排除这些软件包。有关如何使用这些运行手册的示例，请参阅 [教程](automation-tutorials.md)。
+ **为输入定义约束条件**

  您可以在自定义运行手册中定义约束条件，以限制 Automation 将为特定输入参数接受的值。例如，`allowedPattern` 将只接受与您定义的正则表达式匹配的输入参数的值。如果您为输入参数指定 `allowedValues`，只接受您在运行手册中指定的值。
+  **将自动化操作输出记录到 Amazon CloudWatch Logs 中** 

  为了满足组织的操作或安全要求，您可能需要提供在运行手册期间运行的脚本记录。使用 CloudWatch Logs，您可以监控、存储和访问各种 AWS 服务 的日志文件。您可以将 `aws:executeScript` 操作的输出发送到 CloudWatch Logs 日志组中用于调试和故障排除目的。在将日志数据发送到日志组时，可以使用您的 KMS 密钥进行 AWS KMS 加密，也可以不加密。有关更多信息，请参阅 [使用 CloudWatch Logs 记录自动化操作输出](automation-action-logging.md)。
+  **Amazon EventBridge 集成** 

  支持将 Automation 作为 Amazon EventBridge 规则中的*目标*类型。这意味着您可以通过使用事件触发运行手册。有关更多信息，请参阅 [使用 Amazon EventBridge 监控 Systems Manager 事件](monitoring-eventbridge-events.md) 和 [引用：Amazon EventBridge 事件模式和 Systems Manager 类型](reference-eventbridge-events.md)。
+ **分享组织最佳实践**

  您可以在跨账户和区域共享的运行手册中定义资源管理、运营任务等的最佳实践。

## 谁应该使用 Automation？
<a name="automation-who"></a>
+ 任何希望大规模提高其运营效率、减少与手动干预相关的错误以及缩短解决常见问题的时间的 AWS 客户。
+ 希望自动执行部署和配置任务的基础设施专家。
+ 想要可靠地解决常见问题、提高故障排除效率和减少重复性操作的管理员。
+ 想要自动执行通常需要手动执行的任务的用户。

## 什么是自动化？
<a name="what-is-an-automation"></a>

*自动化*由运行手册中定义的所有任务组成，并由 Automation 服务执行。Automation 使用以下组件运行自动化。


****  

| 概念 | Details | 
| --- | --- | 
|  自动化运行手册  |  Systems Manager 自动化运行手册定义 Systems Manager 对托管式节点和 AWS 资源执行的自动化操作。自动化包含几个预定义的自动化运行手册，您可以用它们来执行常见任务，例如重启一个或多个 Amazon EC2 实例，或创建 Amazon Machine Image (AMI)。您也可以创建自己的运行手册。运行手册使用 YAML 或 JSON,，并包括您指定的步骤和参数。步骤按先后顺序运行。有关更多信息，请参阅 [创建您自己的运行手册](automation-documents.md)。 运行手册是 `Automation` 类型的 Systems Manager 文档，而不是`Command`、`Policy`、`Session` 文档。运行手册支持 0.3 版架构。命令文档使用 1.2、2.0 或 2.2 版本的架构。策略文档使用 2.0 或更高版本的架构。  | 
|  自动化操作  |  运行手册中定义的自动化包括一个或多个步骤。每个步骤都与特定操作关联。此操作确定本步的输入、行为和输出。在运行手册的 `mainSteps` 部分定义步骤。自动化支持 20 种不同的操作类型。有关更多信息，请参阅[Systems Manager 自动化操作参考](automation-actions.md)。  | 
|  自动化配额  |  每个 AWS 账户 账户可以同时运行 100 项自动化。这包括子自动化（由其他自动化启动的自动化）和速率控制自动化。如果您尝试运行的自动化多于此数量，Systems Manager 会将额外的自动化添加到一个队列中，状态显示为“待处理”。此限额可使用自适应并发来调整。有关更多信息，请参阅 [允许 Automation 适应您的并发需求](adaptive-concurrency.md)。有关运行自动化的更多信息，请参阅 [运行由 Systems Manager Automation 支持的自动化操作](running-simple-automations.md)。  | 
|  自动化队列配额  |  如果尝试运行的自动化数量超过并发自动化限制，后续自动化将添加到队列中。每个 AWS 账户可以排列 5000 个自动化。自动化完成（或达到最终状态）后，队列中的第一个自动化将启动。  | 
|  速率控制自动化配额  |  每个 AWS 账户 可以同时运行 25 项速率控制自动化。如果您尝试运行的速率控制自动化多于并发费率控制自动化限制，Systems Manager 会将后续速率控制自动化添加到一个队列中，状态显示为“待处理”。有关运行速率控制自动化的更多信息，请参阅 [大规模运行自动化操作](running-automations-scale.md)。  | 
|  速率控制自动化队列配额  |  如果尝试运行的自动化数量超过并发速率控制自动化限制，后续自动化将添加到队列中。每个 AWS 账户 可以排列 1000 个速率控制自动化。自动化完成（或达到最终状态）后，队列中的第一个自动化将启动。  | 

**Topics**
+ [我的组织如何从 Automation 获益？](#automation-benefits)
+ [谁应该使用 Automation？](#automation-who)
+ [什么是自动化？](#what-is-an-automation)
+ [设置自动化](automation-setup.md)
+ [运行由 Systems Manager Automation 支持的自动化操作](running-simple-automations.md)
+ [重新运行自动化执行](automation-rerun-executions.md)
+ [运行需要审批的自动化](running-automations-require-approvals.md)
+ [大规模运行自动化操作](running-automations-scale.md)
+ [在多个 AWS 区域 和账户中运行自动化](running-automations-multiple-accounts-regions.md)
+ [基于 EventBridge 事件运行自动化](running-automations-event-bridge.md)
+ [要按步骤运行自动化](automation-working-executing-manually.md)
+ [使用 State Manager 关联调度自动化](scheduling-automations-state-manager-associations.md)
+ [使用维护窗口计划自动化](scheduling-automations-maintenance-windows.md)
+ [Systems Manager 自动化操作参考](automation-actions.md)
+ [创建您自己的运行手册](automation-documents.md)
+ [Systems Manager 自动化运行手册参考](automation-documents-reference.md)
+ [教程](automation-tutorials.md)
+ [了解 Systems Manager Automation 返回的状态](automation-statuses.md)
+ [Systems Manager 自动化故障排除](automation-troubleshooting.md)

# 设置自动化
<a name="automation-setup"></a>

要设置 Automation（AWS Systems Manager 中的一项工具），您必须确保用户对 Automation 服务具有访问权限并按情景配置角色，以便服务可在您的资源上执行操作。我们还建议您在 Automation 首选项中选择使用自适应并发模式。自适应并发会自动扩展您的自动化配额以满足您的需求。有关更多信息，请参阅 [允许 Automation 适应您的并发需求](adaptive-concurrency.md)。

为确保正确访问 AWS Systems Manager 自动化，请查看以下用户和服务角色要求。

## 验证用户的运行手册访问权限
<a name="automation-setup-user-access"></a>

确认您有权使用运行手册。如果已为您的用户、组或角色分配了管理员权限，则您有权访问 Systems Manager 自动化。如果您没有管理员权限，则管理员必须通过向您的用户、组或角色分配 `AmazonSSMFullAccess` 托管策略或提供类似权限的策略，来向您授予权限。

**重要**  
IAM policy `AmazonSSMFullAccess` 授予对 Systems Manager 进行操作的权限。但是，某些运行手册需要其他服务的权限，例如运行手册 `AWS-ReleaseElasticIP`，它需要 `ec2:ReleaseAddress` 的 IAM 权限。因此，您必须查看运行手册中采取的操作，以确保为您的用户、组或角色分配了执行运行手册包括的操作所需的权限。

## 为自动化配置服务角色（担任角色）访问权限
<a name="automation-setup-configure-role"></a>

自动化可以在服务角色（或*代入角色*）的上下文下启动。这样服务就能够代表您执行操作。如果未指定担任角色，则自动化将使用调用了自动化的用户的上下文。

不过，以下情况需要您为自动化指定服务角色：
+ 当您想限制用户对资源的权限，但希望用户运行需要提升权限的自动化时。在这种情况下，您可以创建具有提升权限的服务角色并允许用户运行自动化。
+ 创建 Systems Manager State Manager 关联，运行一个运行手册。
+ 您有运行时长预计将超过 12 小时的操作时。
+ 在运行不归 Amazon 所有并使用 `aws:executeScript` 操作调用 AWS API 操作或对 AWS 资源执行操作的运行手册时。有关信息，请参阅[使用运行手册的权限](automation-document-script-considerations.md#script-permissions)。

如果您需要为自动化创建一个服务角色，可以使用以下方法之一。

**Topics**
+ [验证用户的运行手册访问权限](#automation-setup-user-access)
+ [为自动化配置服务角色（担任角色）访问权限](#automation-setup-configure-role)
+ [通过使用 CloudFormation 为 Automation 创建服务角色](automation-setup-cloudformation.md)
+ [使用控制台为 Automation 创建服务角色](automation-setup-iam.md)
+ [设置基于身份的策略示例](automation-setup-identity-based-policies.md)
+ [允许 Automation 适应您的并发需求](adaptive-concurrency.md)
+ [为节流的操作配置自动重试](automation-throttling-retry.md)
+ [为自动化实施更改控制](automation-change-calendar-integration.md)

# 通过使用 CloudFormation 为 Automation 创建服务角色
<a name="automation-setup-cloudformation"></a>

您可以通过 AWS CloudFormation 模板为 Automation（AWS Systems Manager 中的一项工具）创建一个服务角色。创建服务角色后，可以使用参数 `AutomationAssumeRole` 在运行手册中指定服务角色。

## 使用 CloudFormation 创建服务角色
<a name="create-iam-service-role"></a>

使用 CloudFormation，通过以下过程为 Systems Manager 自动化创建所需的 AWS Identity and Access Management (IAM) 角色。

**创建所需的 IAM 角色**

1. 下载并解压缩 [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationServiceRole.zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationServiceRole.zip) 文件。此文件夹包含 `AWS-SystemsManager-AutomationServiceRole.yaml` CloudFormation 模板文件。

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择**创建堆栈**。

1. 在**指定模板**部分，选择**上传模板文件**。

1. 选择**浏览**，然后选择 `AWS-SystemsManager-AutomationServiceRole.yaml` CloudFormation 模板文件。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页面的**堆栈名称**字段中，输入名称。

1. 在**配置堆栈选项**页面上，您无需进行任何选择。选择**下一步**。

1. 在**审核**页面上，向下滚动并选择**我确认 CloudFormation 可能创建 IAM 资源**选项。

1. 选择**创建**。

大约三分钟左右，CloudFormation 会显示 **CREATE\$1IN\$1PROGRESS** 状态。创建堆栈并且您的角色准备好使用之后，状态会变为 **CREATE\$1COMPLETE**。

**重要**  
如果您运行使用 AWS Identity and Access Management (IAM) 服务角色调用其他服务的自动化工作流程，请注意必须使用权限将该服务角色配置为调用这些服务。该要求适用于所有 AWS 自动化运行手册（`AWS-*` 运行手册），例如 `AWS-ConfigureS3BucketLogging`、`AWS-CreateDynamoDBBackup` 和 `AWS-RestartEC2Instance` 运行手册等。对于您创建的任何自定义自动化运行手册，如果这些文档使用调用其他服务的操作来调用其他 AWS 服务，则此要求同样适用。例如，如果使用 `aws:executeAwsApi`、`aws:createStack` 或 `aws:copyImage` 操作，则您必须配置具有权限的服务角色来调用这些服务。您可以将 IAM 内联策略添加到该角色，从而向其他 AWS 服务授予权限。有关更多信息，请参阅 [（可选）添加自动化内联策略或客户管理型策略来调用其他 AWS 服务](automation-setup-iam.md#add-inline-policy)。

## 复制自动化的角色信息
<a name="copy-iam-role-info"></a>

使用以下过程从 CloudFormation 控制台复制关于自动化服务角色的信息。当您使用运行手册时，必须指定这些角色。

**注意**  
如果您运行 `AWS-UpdateLinuxAmi` 或 `AWS-UpdateWindowsAmi` 运行手册，则无需使用此过程来复制角色信息。这些运行手册已将必需角色指定为默认值。这些运行手册中指定的角色使用 IAM 托管式策略。

**复制角色名称**

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择您在前一个过程中创建的自动化 **Stack name (堆栈名称)**。

1. 选择**资源**选项卡。

1. 选择 **AutomationServiceRole** 的**物理 ID** 链接 IAM 控制台将打开并显示自动化服务角色的摘要。

1. 复制**角色 ARN** 旁边的 Amazon Resource Name (ARN)。该 ARN 类似于以下这样：`arn:aws:iam::12345678:role/AutomationServiceRole`。

1. 将 ARN 粘贴到文本文件供以后使用。

您已完成了为自动化配置服务角色。现在，您可在运行手册中使用自动化服务角色 ARN。

# 使用控制台为 Automation 创建服务角色
<a name="automation-setup-iam"></a>

如果需要为 Automation（AWS Systems Manager 中的一项工具）创建一个服务角色，请完成以下任务。有关自动化何时需要服务角色的更多信息，请参阅 [设置自动化](automation-setup.md)。

**Topics**
+ [任务 1：为自动化创建服务角色](#create-service-role)
+ [任务 2：将 iam:PassRole 策略附加到您的自动化角色](#attach-passrole-policy)

## 任务 1：为自动化创建服务角色
<a name="create-service-role"></a>

使用以下过程为 Systems Manager 自动化创建服务角色（或*承担角色*）。

**注意**  
您也可以在运行手册中使用此角色，例如 `AWS-CreateManagedLinuxInstance` 运行手册。使用此角色或 AWS Identity and Access Management (IAM) 角色的 Amazon Resource Name (ARN)，在运行手册中允许自动化在您的环境中执行操作，例如启动新实例和代表您执行操作。

**创建 IAM 角色并允许自动化担任该角色**

1. 通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择 **Roles (角色)**，然后选择 **Create role (创建角色)**。

1. 在 **Select type of trusted entity (选择受信任实体的类型)** 下，选择 **AWS service (Amazon Web Services 服务)**。

1. 在 **Choose a use case (选择使用场景)** 部分，选择 **Systems Manager**，然后选择 **Next: Permissions (下一步：权限)**。

1. 在**附加的权限策略**页面中，搜索 **AmazonSSMAutomationRole** 策略，选择它，然后选择**下一步：审核**。

1. 在**审核**页面上，在**角色名称**框中输入名称，然后输入描述。

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

1. 在**角色**页面中，选择刚刚创建的角色以打开**摘要**页面。记下**角色名称**和**角色 ARN**。在下一步骤中，当您将 **iam:PassRole** 策略附加到您的 IAM 账户时，将指定该角色 ARN。您还可以在运行手册中指定角色名称和 ARN。

**注意**  
`AmazonSSMAutomationRole` 策略会将自动化角色权限分配给您账户内 AWS Lambda 函数的子集。这些函数以“自动化”开头。如果计划通过 Lambda 函数使用 自动化，则 Lambda ARN 必须使用以下格式：  
`"arn:aws:lambda:*:*:function:Automation*"`  
如果现有 Lambda 函数的 ARN 未使用此格式，您还必须为自动化角色附加额外的 Lambda 策略，例如 **AWSLambdaRole** 策略。其他策略或角色必须提供对 AWS 账户 账户内 Lambda 函数更宽泛的访问权限。

创建服务角色后，我们建议编辑信任策略，以帮助防止跨服务的混淆代理问题。*混淆代理问题*是一个安全问题，即没有执行操作权限的实体可能会迫使更具权限的实体执行该操作。在 AWS 中，跨服务模拟可能会导致混淆代理问题。一个服务（*呼叫服务*）调用另一项服务（*所谓的服务*）时，可能会发生跨服务模拟。可以操纵调用服务，使用其权限以在其他情况下该服务不应有访问权限的方式对另一个客户的资源进行操作。为防止这种情况，AWS 提供可帮助您保护所有服务的数据的工具，而这些服务中的服务主体有权限访问账户中的资源。

我们建议使用资源策略中的 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键，限制 Automation 为另一项服务提供的资源访问权限。如果 `aws:SourceArn` 值不包含账户 ID，例如 Amazon S3 存储桶 ARN，您必须使用两个全局条件上下文密钥来限制权限。如果同时使用全局条件上下文密钥和包含账户 ID 的 `aws:SourceArn` 值，则 `aws:SourceAccount` 值和 `aws:SourceArn` 值中的账户在同一策略语句中使用时，必须使用相同的账户 ID。如果您只希望将一个资源与跨服务访问相关联，请使用 `aws:SourceArn`。如果您想允许该账户中的任何资源与跨服务使用操作相关联，请使用。`aws:SourceAccount``aws:SourceArn` 的值必须是自动化执行的 ARN。如果您不知道资源的完整 ARN，或正在指定多个资源，请针对 ARN 未知部分使用带有通配符 (`*`) 的 `aws:SourceArn` 全局上下文条件键。例如 `arn:aws:ssm:*:123456789012:automation-execution/*`。

以下示例演示如何使用适用于自动化的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键，防止发生混淆代理问题。

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Service": [
          "ssm.amazonaws.com"
        ]
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "aws:SourceAccount": "123456789012"
        },
        "ArnLike": {
          "aws:SourceArn": "arn:aws:ssm:*:123456789012:automation-execution/*"
        }
      }
    }
  ]
}
```

------

**要修改角色的信任策略**

1. 通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 在账户的角色列表中，请选择 Automation 服务角色的名称。

1. 选择 **信任关系** 选项卡，然后选择 **编辑信任关系**。

1. 使用适用于 Automation 的 `aws:SourceArn` 和 `aws:SourceAccount` 全局条件上下文键编辑信任策略，以防止发生混淆代理问题。

1. 要保存更改，请选择 **Update Trust Policy**（更新信任策略）。

### （可选）添加自动化内联策略或客户管理型策略来调用其他 AWS 服务
<a name="add-inline-policy"></a>

如果您运行使用 IAM 服务角色来调用其他 AWS 服务的自动化，则必须为该服务角色配置调用这些服务的权限。该要求适用于所有 AWS 自动化运行手册（`AWS-*` 运行手册），例如 `AWS-ConfigureS3BucketLogging`、`AWS-CreateDynamoDBBackup` 和 `AWS-RestartEC2Instance` 运行手册等。对于您创建的任何自定义运行手册，如果这些文档使用调用其他服务的操作来调用其他 AWS 服务，则此要求同样适用。例如，如果使用 `aws:executeAwsApi`、`aws:CreateStack` 或 `aws:copyImage` 操作等，则您必须配置具有权限的服务角色来调用这些服务。您可以将 IAM 内联策略或客户管理型策略添加到该角色，从而向其他 AWS 服务 授予权限。

**为服务角色嵌入内联策略（IAM 控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 在列表中，选择您要编辑的角色的名称。

1. 选择**权限**项卡。

1. 在**添加权限**下拉列表中，选择**附加策略**或**创建内联策略**。

1. 如果选择**附加策略**，请选中要添加的策略旁边的复选框，然后选择**添加权限**。

1. 如果选择**创建策略**，请选择 **JSON** 选项卡。

1. 输入您希望调用的 AWS 服务的 JSON 策略文档。以下是两个示例 JSON 策略文档。

   **Amazon S3 PutObject 和 GetObject 示例**

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
           }
       ]
   }
   ```

------

   **Amazon EC2 CreateSnapshot 和 DescribeSnapShots 示例**

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":"ec2:CreateSnapshot",
            "Resource":"*"
         },
         {
            "Effect":"Allow",
            "Action":"ec2:DescribeSnapshots",
            "Resource":"*"
         }
      ]
   }
   ```

------

   有关 IAM policy 语言的详细信息，请参阅《IAM 用户指南》中的 [IAM JSON 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

1. 完成后，选择**查看策略**。[策略验证程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html)将报告任何语法错误。

1. 在**查看策略**页面上，为创建的策略输入**名称**。查看策略**摘要**以查看您的策略授予的权限。然后，选择**创建策略**以保存您的工作。

1. 创建内联策略后，它会自动嵌入您的角色。

## 任务 2：将 iam:PassRole 策略附加到您的自动化角色
<a name="attach-passrole-policy"></a>

使用以下过程将 `iam:PassRole` 策略附加到您的自动化服务角色。这让 Automation 服务能够在运行自动化时将角色传递给其他服务或 Systems Manager 工具。

**将 iam:PassRole 策略附加到您的自动化角色**

1. 在刚刚创建的角色的**摘要**页面中，选择**权限**选项卡。

1. 选择 **Add inline policy (添加内联策略)**。

1. 在 **Create policy (创建策略)** 页面上，选择 **Visual editor (可视化编辑器)** 选项卡。

1. 选择**服务**，然后选择 **IAM**。

1. 选择**选择操作**。

1. 在**筛选操作**文本框中，键入 **PassRole**，然后选择 **PassRole** 选项。

1. 选择**资源**。确保已选择**特定**，然后选择**添加 ARN**。

1. 在**为角色指定 ARN** 字段中，粘贴您在任务 1 结束时复制的自动化角色 ARN。系统会自动填充**账户**和**具有路径的角色名称**字段。
**注意**  
如果希望自动化服务角色将 IAM 实例配置文件角色附加到 EC2 实例，则必须添加 IAM 实例配置文件角色的 ARN。这使自动化服务角色可以将 IAM 实例配置文件角色传递给目标 EC2 实例。

1. 选择**添加**。

1. 选择**查看策略**。

1. 在 **Review Policy (审核策略)** 页面上输入一个名称，然后选择 **Create Policy (创建策略)**。

# 设置基于身份的策略示例
<a name="automation-setup-identity-based-policies"></a>

以下部分提供了 AWS Systems Manager Automation 服务的基于 IAM 身份的策略示例。要详细了解如何使用这些示例 JSON 策略文档创建基于 IAM 身份的策略，请参阅《IAM 用户指南》**中的[创建 IAM 策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html#access_policies_create-json-editor)。

**注意**  
所有示例都包含虚构的账户 ID。不应在 AWS 自有公共文档的 Amazon 资源名称（ARN）中指定账户 ID。

 **示例** 
+  [示例 1：允许用户运行自动化文档并查看自动化执行情况](#automation-setup-identity-based-policies-example-1) 
+  [示例 2：允许用户运行自动化文档的特定版本](#automation-setup-identity-based-policies-example-2) 
+  [示例 3：允许用户执行具有特定标签的自动化文档](#automation-setup-identity-based-policies-example-3) 
+  [示例 4：当为自动化执行提供了特定的标签参数时，允许用户运行自动化文档](#automation-setup-identity-based-policies-example-4) 

## 示例 1：允许用户运行自动化文档并查看自动化执行情况
<a name="automation-setup-identity-based-policies-example-1"></a>

以下示例 IAM 策略允许用户执行以下操作：
+ 运行策略中指定的自动化文档。文档名称由以下条目确定。

  ```
  arn:aws:ssm:*:111122223333:document/{{DocumentName}}
  ```
+ 停止并向自动化执行发送信号。
+ 在自动化执行启动后查看其详细信息。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:111122223333:document/{{DocumentName}}",
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ]
        },
        {
            "Action": [
                "ssm:StopAutomationExecution",
                "ssm:GetAutomationExecution",
                "ssm:DescribeAutomationExecutions",
                "ssm:DescribeAutomationStepExecutions",
                "ssm:SendAutomationSignal"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow"
        }
    ]
}
```

------

## 示例 2：允许用户运行自动化文档的特定版本
<a name="automation-setup-identity-based-policies-example-2"></a>

以下示例 IAM 策略允许用户运行自动化文档的特定版本：
+ 自动化文档名称由以下条目确定。

  ```
  arn:aws:ssm:*:111122223333:document/{{DocumentName}}
  ```
+ 自动化文档版本由以下条目确定。

  ```
  "ssm:DocumentVersion": "5"
  ```

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:111122223333:document/{{DocumentName}}"
            ],
            "Condition": {
                "ForAnyValue:StringEquals": {
                   "ssm:DocumentVersion": ["5"]
                }
            }
        },
        {
            "Action": [
                "ssm:StartAutomationExecution"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "ssm:StopAutomationExecution",
                "ssm:GetAutomationExecution",
                "ssm:DescribeAutomationExecutions",
                "ssm:DescribeAutomationStepExecutions",
                "ssm:SendAutomationSignal"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow"
        }
    ]
}
```

------

## 示例 3：允许用户执行具有特定标签的自动化文档
<a name="automation-setup-identity-based-policies-example-3"></a>

以下示例 IAM 策略允许用户执行具有特定标签的任何自动化文档：
+ 自动化文档名称由以下条目确定。

  ```
  arn:aws:ssm:*:111122223333:document/{{DocumentName}}
  ```
+ 自动化文档标签由以下条目确定。

  ```
  "ssm:DocumentVersion": "5"
  ```

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:111122223333:document/*"
            ],
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/stage": "production"
                }
            }
        },
        {
            "Action": [
                "ssm:StartAutomationExecution"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "ssm:StopAutomationExecution",
                "ssm:GetAutomationExecution",
                "ssm:DescribeAutomationExecutions",
                "ssm:DescribeAutomationStepExecutions",
                "ssm:SendAutomationSignal"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow"
        }
    ]
}
```

------

## 示例 4：当为自动化执行提供了特定的标签参数时，允许用户运行自动化文档
<a name="automation-setup-identity-based-policies-example-4"></a>

当为自动化执行提供了特定的标签参数时，以下示例 IAM 策略向用户授予运行自动化文档的权限：
+ 运行策略中指定的自动化文档。文档名称由以下条目确定。

  ```
  arn:aws:ssm:*:111122223333:document/{{DocumentName}}
  ```
+ 必须为自动化执行提供特定的标签参数。自动化执行资源的标签参数由以下条目确定。

  ```
  "aws:ResourceTag/stage": "production"
  ```
+ 停止并向具有指定标签的自动化执行发送信号。
+ 查看有关具有指定标签的自动化执行的详细信息。
+ 为 SSM 资源添加指定标签

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": "ssm:StartAutomationExecution",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:111122223333:document/{{DocumentName}}"
            ]
        },
        {
            "Action": [
                "ssm:StartAutomationExecution",
                "ssm:StopAutomationExecution",
                "ssm:GetAutomationExecution",
                "ssm:DescribeAutomationExecutions",
                "ssm:DescribeAutomationStepExecutions",
                "ssm:SendAutomationSignal"
            ],
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ],
            "Effect": "Allow",
            "Condition": {
                "StringEquals": {
                    "aws:ResourceTag/environment": "beta"
                }
            }
        },
        {
            "Action": "ssm:AddTagsToResource",
            "Effect": "Allow",
            "Resource": [
                "arn:aws:ssm:*:111122223333:automation-execution/*"
            ]
        }
    ]
}
```

------

# 允许 Automation 适应您的并发需求
<a name="adaptive-concurrency"></a>

默认情况下，Automation 允许您一次最多运行 100 次并发自动化。Automation 还提供了一个可选设置，您可以使用该设置自动调整并发自动化配额。使用此设置，您的并发自动化配额最多可容纳 500 个并发自动化，具体取决于可用资源。

**注意**  
如果您的自动化调用 API 操作，自适应地扩展到目标可能会导致限制异常。如果在启用自适应并发的情况下运行自动化时反复出现限制异常，则可能必须请求提高 API 操作的配额（如果可用）。

**要使用 AWS 管理控制台 开启自适应并发**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**首选项**选项卡，然后选择**编辑**。

1. 选中 **Enable adaptive concurrency**（启用自适应并发）旁边的复选框。

1. 选择**保存**。

**要使用命令行开启自适应并发**
+ 打开 AWS CLI 或 Tools for Windows PowerShell，运行以下命令，在请求区域中为您的账户开启自适应并发。

------
#### [ Linux & macOS ]

  ```
  aws ssm update-service-setting \
      --setting-id /ssm/automation/enable-adaptive-concurrency \
      --setting-value True
  ```

------
#### [ Windows ]

  ```
  aws ssm update-service-setting ^
      --setting-id /ssm/automation/enable-adaptive-concurrency ^
      --setting-value True
  ```

------
#### [ PowerShell ]

  ```
  Update-SSMServiceSetting `
      -SettingId "/ssm/automation/enable-adaptive-concurrency" `
      -SettingValue "True"
  ```

------

# 为节流的操作配置自动重试
<a name="automation-throttling-retry"></a>

每个账户中可以运行的并发自动化执行数量存在限制。尝试在一个账户中同时运行多个自动化可能会导致节流问题。您可以使用自动节流重试功能为节流的自动化步骤配置重试行为。

自动化操作的自动节流重试为大规模操作提供了更具弹性的执行环境。节流重试功能支持除 `aws:executeScript` 之外的所有[自动化操作](automation-actions.md)。

节流重试设置与现有 `maxAttempts` 的步骤属性配合使用。两者都配置好后，系统首先尝试在指定的时间限制内节流重试次数，如果步骤仍然失败，再应用 `maxAttempts` 设置。

**使用AWS 管理控制台配置节流重试**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**首选项**选项卡，然后选择**编辑**。

1. 在**节流重试时间限制**字段中，输入介于 0 到 3600 秒之间的值。这指定了系统重试节流的步骤的最长时间。

1. 选择**保存**。

**使用命令行配置节流重试**
+ 打开 AWS CLI 或 Tools for Windows PowerShell，运行以下命令，在请求区域中为您的账户配置节流。

------
#### [ Linux & macOS ]

  ```
  aws ssm update-service-setting \
      --setting-id /ssm/automation/throttling-retry-time-limit \
      --setting-value 3600
  ```

------
#### [ Windows ]

  ```
  aws ssm update-service-setting ^
      --setting-id /ssm/automation/throttling-retry-time-limit ^
      --setting-value 3600
  ```

------
#### [ PowerShell ]

  ```
  Update-SSMServiceSetting `
      -SettingId "/ssm/automation/throttling-retry-time-limit" `
      -SettingValue "3600"
  ```

------

# 为自动化实施更改控制
<a name="automation-change-calendar-integration"></a>

默认情况下，自动化允许您不受日期和时间限制地使用运行手册。通过将自动化与 Change Calendar 集成，您可以对您的 AWS 账户 中的所有自动化实施更改控制。借助此设置，您账户中的 AWS Identity and Access Management（IAM）主体只能在更改日历允许的时间段内运行自动化。要了解有关使用 Change Calendar 的更多信息，请参阅 [使用 Change Calendar](systems-manager-change-calendar-working.md)。

**打开更改控制（控制台）**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**首选项**选项卡，然后选择**编辑**。

1. 选择**打开 Change Calendar 集成**旁边的复选框。

1. 在**选择更改日历**下拉列表中，选择您希望自动化遵循的更改日历。

1. 选择**保存**。

# 运行由 Systems Manager Automation 支持的自动化操作
<a name="running-simple-automations"></a>

在您运行自动化时，默认情况下，自动化将在启动该自动化的用户的上下文中运行。也就是说，例如，如果您的用户拥有管理员权限，则该自动化运行时也拥有管理员权限，并且对该自动化配置的资源拥有完全访问权限。作为最佳安全实践，建议使用配置有 AmazonSSMAutomationRole 托管式策略的 IAM 服务角色（在本例中也称为*担任*角色）运行自动化。您可能需要将其他 IAM policy 添加到您的担任角色，以使用各种运行手册。使用 IAM 服务角色运行自动化称为*委托管理*。

如果使用服务角色，则允许对 AWS 资源运行自动化，但运行自动化的用户对这些资源的访问受限（或无法访问）。例如，您可以配置一个服务角色，并将其与自动化配合使用以自动重启一个或多个 Amazon Elastic Compute Cloud (Amazon EC2) 实例。Automation 是 AWS Systems Manager 中的一项工具。自动化会重启实例，但服务角色不会授予用户访问这些实例的权限。

可以在您运行自动化的运行时中指定服务角色，也可以创建自定义自动化运行手册，并直接在运行手册中指定服务角色。无论您是在运行时还是在运行手册中指定了服务角色，服务都会在所指定服务角色的上下文中运行。如果您未指定服务角色，则系统会在用户上下文中创建临时会话并运行自动化。

**注意**  
对于预计运行时长超过 12 小时的自动化，必须指定服务角色。如果您在用户环境中启动了长时间运行的自动化，用户的临时会话会在 12 小时后过期。

委托管理可确保更高的安全性，还能更好地控制您的 AWS 资源。它还能够增强审核体验，因为针对您的资源进行的操作是由集中服务角色执行的，而不是由多个 IAM 账户执行。

**开始前的准备工作**  
在您完成以下过程之前，必须创建 IAM 服务角色并为 Automation（AWS Systems Manager 中的一项工具）配置信任关系。有关更多信息，请参阅 [任务 1：为自动化创建服务角色](automation-setup-iam.md#create-service-role)。

以下过程介绍了如何使用 Systems Manager 控制台或您首选的命令行工具运行简单的自动化。

## 运行简单的自动化（控制台）
<a name="simple-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台运行简单的自动化。

**运行简单的自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行模式**部分中，选择**简单执行**。

1. 在 **输入参数** 部分中，指定所需的输入。或者，您也可以从 **AutomationAssumeRole** 列表选择一个 IAM 服务角色。

1. （可选）选择一个 CloudWatch 警报以应用于您的自动化进行监控。要将 CloudWatch 警报附加到自动化，启动自动化的 IAM 主体必须具有 `iam:createServiceLinkedRole` 操作的权限。有关 CloudWatch 警报的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。请注意，如果您的警报激活，自动化将停止。如果使用 AWS CloudTrail，您将在跟踪中看到 API 调用。

1. 选择**执行**。

控制台将显示自动化的状态。如果自动化无法运行，请参阅 [Systems Manager 自动化故障排除](automation-troubleshooting.md)。

自动化执行完成后，您可以使用相同或修改后的参数重新运行该执行。有关更多信息，请参阅 [重新运行自动化执行](automation-rerun-executions.md)。

## 运行简单的自动化（命令行）
<a name="simple-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows 上）或 AWS Tools for PowerShell 运行简单的自动化。

**运行简单的自动化**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 运行以下命令以启动一个简单的自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --parameters runbook parameters
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --parameters runbook parameters
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
     -DocumentName runbook name `
     -Parameter runbook parameters
   ```

------

   以下是使用 `AWS-RestartEC2Instance` 运行手册重新启动指定 EC2 实例的示例。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name "AWS-RestartEC2Instance" \
       --parameters "InstanceId=i-02573cafcfEXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name "AWS-RestartEC2Instance" ^
       --parameters "InstanceId=i-02573cafcfEXAMPLE"
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
     -DocumentName AWS-RestartEC2Instance `
     -Parameter @{"InstanceId"="i-02573cafcfEXAMPLE"}
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecutionId": "4105a4fc-f944-11e6-9d32-0123456789ab"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecutionId": "4105a4fc-f944-11e6-9d32-0123456789ab"
   }
   ```

------
#### [ PowerShell ]

   ```
   4105a4fc-f944-11e6-9d32-0123456789ab
   ```

------

1. 运行以下命令以检索自动化的状态。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-automation-executions \
       --filter "Key=ExecutionId,Values=4105a4fc-f944-11e6-9d32-0123456789ab"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-automation-executions ^
       --filter "Key=ExecutionId,Values=4105a4fc-f944-11e6-9d32-0123456789ab"
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationExecutionList | `
     Where {$_.AutomationExecutionId -eq "4105a4fc-f944-11e6-9d32-0123456789ab"}
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecutionMetadataList": [
           {
               "AutomationExecutionStatus": "InProgress",
               "CurrentStepName": "stopInstances",
               "Outputs": {},
               "DocumentName": "AWS-RestartEC2Instance",
               "AutomationExecutionId": "4105a4fc-f944-11e6-9d32-0123456789ab",
               "DocumentVersion": "1",
               "ResolvedTargets": {
                   "ParameterValues": [],
                   "Truncated": false
               },
               "AutomationType": "Local",
               "Mode": "Auto",
               "ExecutionStartTime": 1564600648.159,
               "CurrentAction": "aws:changeInstanceState",
               "ExecutedBy": "arn:aws:sts::123456789012:assumed-role/Administrator/Admin",
               "LogFile": "",
               "Targets": []
           }
       ]
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecutionMetadataList": [
           {
               "AutomationExecutionStatus": "InProgress",
               "CurrentStepName": "stopInstances",
               "Outputs": {},
               "DocumentName": "AWS-RestartEC2Instance",
               "AutomationExecutionId": "4105a4fc-f944-11e6-9d32-0123456789ab",
               "DocumentVersion": "1",
               "ResolvedTargets": {
                   "ParameterValues": [],
                   "Truncated": false
               },
               "AutomationType": "Local",
               "Mode": "Auto",
               "ExecutionStartTime": 1564600648.159,
               "CurrentAction": "aws:changeInstanceState",
               "ExecutedBy": "arn:aws:sts::123456789012:assumed-role/Administrator/Admin",
               "LogFile": "",
               "Targets": []
           }
       ]
   }
   ```

------
#### [ PowerShell ]

   ```
   AutomationExecutionId       : 4105a4fc-f944-11e6-9d32-0123456789ab
   AutomationExecutionStatus   : InProgress
   AutomationType              : Local
   CurrentAction               : aws:changeInstanceState
   CurrentStepName             : startInstances
   DocumentName                : AWS-RestartEC2Instance
   DocumentVersion             : 1
   ExecutedBy                  : arn:aws:sts::123456789012:assumed-role/Administrator/Admin
   ExecutionEndTime            : 1/1/0001 12:00:00 AM
   ExecutionStartTime          : 7/31/2019 7:17:28 PM
   FailureMessage              : 
   LogFile                     : 
   MaxConcurrency              : 
   MaxErrors                   : 
   Mode                        : Auto
   Outputs                     : {}
   ParentAutomationExecutionId : 
   ResolvedTargets             : Amazon.SimpleSystemsManagement.Model.ResolvedTargets
   Target                      : 
   TargetMaps                  : {}
   TargetParameterName         : 
   Targets                     : {}
   ```

------

# 重新运行自动化执行
<a name="automation-rerun-executions"></a>

您可以重新运行 AWS Systems Manager 自动化执行，使用相同或修改后的参数重复执行任务。重新运行功能使您无需手动重新创建自动化配置即可高效地复制自动化执行，从而减少运营开销和潜在的配置错误。

当您重新运行自动化执行时，Systems Manager 会保留上次执行的原始运行手册参数、Amazon CloudWatch 警报和标签。系统使用新的执行 ID 和更新的时间戳来创建新执行。您可以重新运行任何类型的自动化执行，包括简单执行、速率控制执行、跨账户和跨区域执行以及手动执行。

## 重新运行自动化执行（控制台）
<a name="rerun-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台重新运行自动化执行。

**从自动化主页重新运行自动化执行**

访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 在执行列表中，选择要重新运行的执行。

1. 选择**重新运行执行**。

1. 在**执行自动化文档**页面上，查看原始执行中预填充的参数、执行模式和目标配置。

1. （可选）根据重新运行的需要修改任何参数、目标或其他设置。

1. 选择**执行**，使用新的执行 ID 开始重新运行。

**从执行详细信息页面重新运行自动化执行**

访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择您想重新运行的自动化的执行 ID。

1. 在执行详细信息页面上，选择**重新运行执行**。

1. 在**执行自动化文档**页面上，查看原始执行中预填充的参数、执行模式和目标配置。

1. （可选）根据重新运行的需要修改任何参数、目标或其他设置。

1. 选择**执行**，使用新的执行 ID 开始重新运行。

**将自动化执行复制到新执行**

访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择您想复制的自动化的执行 ID。

1. 在执行详细信息页面上，选择**操作**，然后选择**复制到新执行**。

1. 在**执行自动化文档**页面上，查看原始执行中预填充的参数、执行模式和目标配置。

1. （可选）根据新执行的需要修改任何参数、目标或其他设置。

1. 选择**执行**以开始新的执行。

# 运行需要审批的自动化
<a name="running-automations-require-approvals"></a>

以下过程介绍了如何使用 AWS Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 通过简单执行来运行包含审批的自动化。该自动化使用自动化操作 `aws:approve`，这会暂停自动化，直到指定的委托人批准或拒绝该操作。自动化在当前用户的上下文中运行。因此，只要您有权使用运行手册和此运行手册调用的任何操作，就无需配置其他 IAM 权限。如果您在 IAM 中拥有管理员权限，则已有权运行此运行手册。

**开始前的准备工作**  
除了运行手册所需的标准输入外，`aws:approve` 操作还需要以下两个参数：
+ 审批者列表。审批者列表必须以用户名或用户 ARN 的形式包含至少一个审批者。如果提供了多个审批者，还必须在运行手册内指定对应的最少审批数。
+ Amazon Simple Notification Service (Amazon SNS) 主题 ARN Amazon SNS 主题名称必须以 `Automation` 开头。

此过程假设您已经创建了 Amazon SNS 主题，这是提交审批请求所必需的。有关信息，请参阅《Amazon Simple Notification Service 开发人员指南》**中的[创建主题](https://docs.aws.amazon.com/sns/latest/dg/sns-getting-started.html#CreateTopic)。

## 运行包含审批者的自动化（控制台）
<a name="approval-console"></a>

**运行包含审批者的自动化**

以下过程介绍了如何使用 Systems Manager 控制台运行包含审批者的自动化。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行自动化文档**页面上，选择**简单执行**。

1. 在**输入参数** 部分，指定所需的输入参数。

   例如，如果选择了 `AWS-StartEC2InstanceWithApproval` 运行手册，则必须为 **InstanceId** 参数指定或选择实例 ID。

1. 在**审批者**部分中，指定自动化操作的审批者的用户名或用户 ARN。

1. 在 **SNSTopicARN** 部分，指定要用于发送审批通知的 SNS 主题 ARN。SNS 主题名称必须以**自动化**开头。

1. 或者，您也可以从 **AutomationAssumeRole** 列表选择一个 IAM 服务角色。如果您将超过 100 个的账户和地区设置为目标，则必须指定 `AWS-SystemsManager-AutomationAdministrationRole`。

1. 选择**执行自动化**。

指定的审批者将收到包含详细信息的 Amazon SNS 通知以批准或拒绝自动化。此审批操作从发布之日起 7 天内有效，此操作可以使用 Systems Manager 控制台或 AWS Command Line Interface (AWS CLI) 发布。

如果选择批准自动化，自动化将继续运行指定的运行手册中包含的步骤。控制台将显示自动化的状态。如果自动化无法运行，请参阅 [Systems Manager 自动化故障排除](automation-troubleshooting.md)。

**批准或拒绝自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择上一过程中运行的自动化。

1. 选择**操作**，然后选择**批准/拒绝**。

1. 选择**批准**或**拒绝**，并选择性地提供注释。

1. 选择**提交**。

## 运行包含审批者的自动化（命令行）
<a name="approval-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows 上）或 AWS Tools for PowerShell 运行包含审批者的自动化。

**运行包含审批者的自动化**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 运行以下命令以运行包含审批者的自动化。将每个*示例资源占位符*替换为您自己的信息。在文档名称部分中，指定包括自动化操作 `aws:approve` 的运行手册。

   对于 `Approvers`，指定该操作的审批者的用户名或用户 ARN。对于 `SNSTopic`，指定用于发送审批通知的 SNS 主题 ARN。Amazon SNS 主题名称必须以 `Automation` 开头。
**注意**  
审批者和 SNS 主题的参数值的具体名称取决于您选择的运行手册中指定的值。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name "AWS-StartEC2InstanceWithApproval" \
       --parameters "InstanceId=i-02573cafcfEXAMPLE,Approvers=arn:aws:iam::123456789012:role/Administrator,SNSTopicArn=arn:aws:sns:region:123456789012:AutomationApproval"
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name "AWS-StartEC2InstanceWithApproval" ^
       --parameters "InstanceId=i-02573cafcfEXAMPLE,Approvers=arn:aws:iam::123456789012:role/Administrator,SNSTopicArn=arn:aws:sns:region:123456789012:AutomationApproval"
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
       -DocumentName AWS-StartEC2InstanceWithApproval `
       -Parameters @{
           "InstanceId"="i-02573cafcfEXAMPLE"
           "Approvers"="arn:aws:iam::123456789012:role/Administrator"
           "SNSTopicArn"="arn:aws:sns:region:123456789012:AutomationApproval"
       }
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecutionId": "df325c6d-b1b1-4aa0-8003-6cb7338213c6"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecutionId": "df325c6d-b1b1-4aa0-8003-6cb7338213c6"
   }
   ```

------
#### [ PowerShell ]

   ```
   df325c6d-b1b1-4aa0-8003-6cb7338213c6
   ```

------

**批准自动化**
+ 运行以下命令来批准自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

  ```
  aws ssm send-automation-signal \
      --automation-execution-id "df325c6d-b1b1-4aa0-8003-6cb7338213c6" \
      --signal-type "Approve" \
      --payload "Comment=your comments"
  ```

------
#### [ Windows ]

  ```
  aws ssm send-automation-signal ^
      --automation-execution-id "df325c6d-b1b1-4aa0-8003-6cb7338213c6" ^
      --signal-type "Approve" ^
      --payload "Comment=your comments"
  ```

------
#### [ PowerShell ]

  ```
  Send-SSMAutomationSignal `
      -AutomationExecutionId df325c6d-b1b1-4aa0-8003-6cb7338213c6 `
      -SignalType Approve `
      -Payload @{"Comment"="your comments"}
  ```

------

  如果此命令成功，则无任何输出。

**拒绝自动化**
+ 运行以下命令来拒绝自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

  ```
  aws ssm send-automation-signal \
      --automation-execution-id "df325c6d-b1b1-4aa0-8003-6cb7338213c6" \
      --signal-type "Deny" \
      --payload "Comment=your comments"
  ```

------
#### [ Windows ]

  ```
  aws ssm send-automation-signal ^
      --automation-execution-id "df325c6d-b1b1-4aa0-8003-6cb7338213c6" ^
      --signal-type "Deny" ^
      --payload "Comment=your comments"
  ```

------
#### [ PowerShell ]

  ```
  Send-SSMAutomationSignal `
      -AutomationExecutionId df325c6d-b1b1-4aa0-8003-6cb7338213c6 `
      -SignalType Deny `
      -Payload @{"Comment"="your comments"}
  ```

------

  如果此命令成功，则无任何输出。

# 大规模运行自动化操作
<a name="running-automations-scale"></a>

借助 AWS Systems Manager Automation，您可以使用*目标*在 AWS 资源的实例集上运行自动化。此外，您还可以通过指定并发值和错误阈值来控制自动化在整个队列上的部署。并发和错误阈值功能统称为*速率控制*。并发值决定允许同时运行自动化的资源数量。Automation 还提供了一种可以选择加入的自适应并发模式。自适应并发会自动将自动化配额从 100 个同时运行的自动化配额扩展到 500 个。错误阈值决定在 Systems Manager 停止将自动化发送到其他资源之前允许自动化执行失败的次数。

有关并发性和错误阈值的更多信息，请参阅 [大规模控制自动化](running-automations-scale-controls.md)。有关目标的更多信息，请参阅 [映射自动化目标](running-automations-map-targets.md)。

以下程序介绍了如何开启自适应并发性，以及如何使用 Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 运行具有目标和速率控制的自动化。

## 运行具有目标和速率控制自动化（控制台）
<a name="scale-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台运行具有目标和速率控制的自动化。

**运行具有目标和速率控制的自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行模式**部分中，选择**速率控制**。如果要使用目标和速率控制，则必须使用此模式或**多账户和多区域**。

1. 在**目标**部分中，选择希望如何设置要在其中运行自动化的 AWS 资源。这些选项是必需的。

   1. 使用**参数**列表选择一个参数。**参数**列表中的项目由此过程开始时选择的自动化运行手册中的参数确定。通过选择参数，可以定义在其上运行自动化工作流的资源类型。

   1. 使用**目标**列表选择设置目标资源的方式。

      1. 如果选择使用参数值将资源设置为目标，请输入您在**输入参数**部分为参数选择的参数值。

      1. 如果选择使用 AWS Resource Groups 将资源设置为目标，请从**资源组**列表中选择组的名称。

      1. 如果选择使用标签将资源设置为目标，请在提供的字段中输入标签键和（可选）标签值。选择**添加**。

      1. 如果要在当前 AWS 账户 和 AWS 区域 中的所有实例上运行自动化运行手册，则选择**所有实例**。

1. 在**输入参数** 部分中，指定所需的输入。或者，您也可以从 **AutomationAssumeRole** 列表中选择一个 IAM 服务角色。
**注意**  
您可能不需要选择**输入参数**部分中的某些选项。原因是您使用标签或资源组将多个资源设置为目标。例如，如果选择了 `AWS-RestartEC2Instance` 运行手册，则无需在**输入参数** 部分中指定或选择实例 ID。自动化执行过程使用您指定的标签资源组查找要重新启动的实例。

1. 使用**速率控制**部分中的选项限制可在每个账户-区域对中运行自动化的 AWS 资源的数量。

   在**并发**部分中，选择一个选项：
   + 选择**目标**，以输入可同时运行自动化工作流目标的绝对数量。
   + 选择**百分比**，以输入可同时运行自动化工作流的目标集的百分比。

1. 在**错误阈值**部分中，选择一个选项：
   + 选择**错误**，以输入自动化停止将工作流程发送到其他资源之前允许的错误的绝对数量。
   + 选择**百分比**，以输入自动化停止将工作流程发送到其他资源之前允许的错误的百分比。

1. （可选）选择一个 CloudWatch 警报以应用于您的自动化进行监控。要将 CloudWatch 警报附加到自动化，启动自动化的 IAM 主体必须具有 `iam:createServiceLinkedRole` 操作的权限。有关 CloudWatch 警报的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。请注意，如果您的警报激活，自动化将停止。如果使用 AWS CloudTrail，您将在跟踪中看到 API 调用。

1. 选择**执行**。

要查看由速率控制自动化启动的自动化程序，请在导航窗格中，选择自动化，然后选择**显示子自动化程序**。

自动化执行完成后，您可以使用相同或修改后的参数重新运行该执行。有关更多信息，请参阅 [重新运行自动化执行](automation-rerun-executions.md)。

## 运行具有目标和速率控制的自动化（命令行）
<a name="scale-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows 上）或 AWS Tools for PowerShell 运行具有目标和速率控制的自动化。

**运行具有目标和速率控制的自动化**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 运行以下命令以查看文档列表。

------
#### [ Linux & macOS ]

   ```
   aws ssm list-documents
   ```

------
#### [ Windows ]

   ```
   aws ssm list-documents
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentList
   ```

------

   记下要使用的运行手册的名称。

1. 运行以下命令以查看有关运行手册的详细信息。用您想要查看其详细信息的运行手册的名称替换 *runbook name*。同时，记下要用于 `--target-parameter-name` 选项的参数名称（例如 `InstanceId`）。此参数确定在其上运行自动化的资源的类型。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-document \
       --name runbook name
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-document ^
       --name runbook name
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentDescription `
       -Name runbook name
   ```

------

1. 创建一个要运行的使用目标和速率控制选项的命令。将每个*示例资源占位符*替换为您自己的信息。

   *使用标签设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --targets Key=tag:key name,Values=value \
       --target-parameter-name parameter name \
       --parameters "input parameter name=input parameter value,input parameter 2 name=input parameter 2 value" \
       --max-concurrency 10 \
       --max-errors 25%
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --targets Key=tag:key name,Values=value ^
       --target-parameter-name parameter name ^
       --parameters "input parameter name=input parameter value,input parameter 2 name=input parameter 2 value" ^
       --max-concurrency 10 ^
       --max-errors 25%
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "tag:key name"
   $Targets.Values = "value"
   
   Start-SSMAutomationExecution `
       DocumentName "runbook name" `
       -Targets $Targets `
       -TargetParameterName "parameter name" `
       -Parameter @{"input parameter name"="input parameter value";"input parameter 2 name"="input parameter 2 value"} `
       -MaxConcurrency "10" `
       -MaxError "25%"
   ```

------

   *使用参数值设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --targets Key=ParameterValues,Values=value,value 2,value 3 \
       --target-parameter-name parameter name \
       --parameters "input parameter name=input parameter value" \
       --max-concurrency 10 \
       --max-errors 25%
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --targets Key=ParameterValues,Values=value,value 2,value 3 ^
       --target-parameter-name parameter name ^
       --parameters "input parameter name=input parameter value" ^
       --max-concurrency 10 ^
       --max-errors 25%
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "ParameterValues"
   $Targets.Values = "value","value 2","value 3"
   
   Start-SSMAutomationExecution `
       -DocumentName "runbook name" `
       -Targets $Targets `
       -TargetParameterName "parameter name" `
       -Parameter @{"input parameter name"="input parameter value"} `
       -MaxConcurrency "10" `
       -MaxError "25%"
   ```

------

   *使用 AWS Resource Groups 设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --targets Key=ResourceGroup,Values=Resource group nname \
       --target-parameter-name parameter name \
       --parameters "input parameter name=input parameter value" \
       --max-concurrency 10 \
       --max-errors 25%
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --targets Key=ResourceGroup,Values=Resource group name ^
       --target-parameter-name parameter name ^
       --parameters "input parameter name=input parameter value" ^
       --max-concurrency 10 ^
       --max-errors 25%
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "ResourceGroup"
   $Targets.Values = "Resource group name"
   
   Start-SSMAutomationExecution `
       -DocumentName "runbook name" `
       -Targets $Targets `
       -TargetParameterName "parameter name" `
       -Parameter @{"input parameter name"="input parameter value"} `
       -MaxConcurrency "10" `
       -MaxError "25%"
   ```

------

   *将当前 AWS 账户 和 AWS 区域 中的所有 Amazon EC2 实例设置为目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --targets "Key=AWS::EC2::Instance,Values=*"  \
       --target-parameter-name instanceId \
       --parameters "input parameter name=input parameter value" \
       --max-concurrency 10 \
       --max-errors 25%
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --targets Key=AWS::EC2::Instance,Values=* ^
       --target-parameter-name instanceId ^
       --parameters "input parameter name=input parameter value" ^
       --max-concurrency 10 ^
       --max-errors 25%
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "AWS::EC2::Instance"
   $Targets.Values = "*"
   
   Start-SSMAutomationExecution `
       -DocumentName "runbook name" `
       -Targets $Targets `
       -TargetParameterName "instanceId" `
       -Parameter @{"input parameter name"="input parameter value"} `
       -MaxConcurrency "10" `
       -MaxError "25%"
   ```

------

   该命令将会返回执行 ID。请将该 ID 复制到剪贴板。您可以使用此 ID 查看自动化的状态。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecutionId": "a4a3c0e9-7efd-462a-8594-01234EXAMPLE"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecutionId": "a4a3c0e9-7efd-462a-8594-01234EXAMPLE"
   }
   ```

------
#### [ PowerShell ]

   ```
   a4a3c0e9-7efd-462a-8594-01234EXAMPLE
   ```

------

1. 运行以下命令以查看自动化。将每个 *automation execution ID* 替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-automation-executions \
       --filter Key=ExecutionId,Values=automation execution ID
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-automation-executions ^
       --filter Key=ExecutionId,Values=automation execution ID
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationExecutionList | `
       Where {$_.AutomationExecutionId -eq "automation execution ID"}
   ```

------

1. 运行以下命令以查看有关自动化进展的详细信息。将每个 *automation execution ID* 替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-automation-execution \
       --automation-execution-id automation execution ID
   ```

------
#### [ Windows ]

   ```
   aws ssm get-automation-execution ^
       --automation-execution-id automation execution ID
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationExecution `
       -AutomationExecutionId automation execution ID
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecution": {
           "StepExecutionsTruncated": false,
           "AutomationExecutionStatus": "Success",
           "MaxConcurrency": "1",
           "Parameters": {},
           "MaxErrors": "1",
           "Outputs": {},
           "DocumentName": "AWS-StopEC2Instance",
           "AutomationExecutionId": "a4a3c0e9-7efd-462a-8594-01234EXAMPLE",
           "ResolvedTargets": {
               "ParameterValues": [
                   "i-02573cafcfEXAMPLE"
               ],
               "Truncated": false
           },
           "ExecutionEndTime": 1564681619.915,
           "Targets": [
               {
                   "Values": [
                       "DEV"
                   ],
                   "Key": "tag:ENV"
               }
           ],
           "DocumentVersion": "1",
           "ExecutionStartTime": 1564681576.09,
           "ExecutedBy": "arn:aws:sts::123456789012:assumed-role/Administrator/Admin",
           "StepExecutions": [
               {
                   "Inputs": {
                       "InstanceId": "i-02573cafcfEXAMPLE"
                   },
                   "Outputs": {},
                   "StepName": "i-02573cafcfEXAMPLE",
                   "ExecutionEndTime": 1564681619.093,
                   "StepExecutionId": "86c7b811-3896-4b78-b897-01234EXAMPLE",
                   "ExecutionStartTime": 1564681576.836,
                   "Action": "aws:executeAutomation",
                   "StepStatus": "Success"
               }
           ],
           "TargetParameterName": "InstanceId",
           "Mode": "Auto"
       }
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecution": {
           "StepExecutionsTruncated": false,
           "AutomationExecutionStatus": "Success",
           "MaxConcurrency": "1",
           "Parameters": {},
           "MaxErrors": "1",
           "Outputs": {},
           "DocumentName": "AWS-StopEC2Instance",
           "AutomationExecutionId": "a4a3c0e9-7efd-462a-8594-01234EXAMPLE",
           "ResolvedTargets": {
               "ParameterValues": [
                   "i-02573cafcfEXAMPLE"
               ],
               "Truncated": false
           },
           "ExecutionEndTime": 1564681619.915,
           "Targets": [
               {
                   "Values": [
                       "DEV"
                   ],
                   "Key": "tag:ENV"
               }
           ],
           "DocumentVersion": "1",
           "ExecutionStartTime": 1564681576.09,
           "ExecutedBy": "arn:aws:sts::123456789012:assumed-role/Administrator/Admin",
           "StepExecutions": [
               {
                   "Inputs": {
                       "InstanceId": "i-02573cafcfEXAMPLE"
                   },
                   "Outputs": {},
                   "StepName": "i-02573cafcfEXAMPLE",
                   "ExecutionEndTime": 1564681619.093,
                   "StepExecutionId": "86c7b811-3896-4b78-b897-01234EXAMPLE",
                   "ExecutionStartTime": 1564681576.836,
                   "Action": "aws:executeAutomation",
                   "StepStatus": "Success"
               }
           ],
           "TargetParameterName": "InstanceId",
           "Mode": "Auto"
       }
   }
   ```

------
#### [ PowerShell ]

   ```
   AutomationExecutionId       : a4a3c0e9-7efd-462a-8594-01234EXAMPLE
   AutomationExecutionStatus   : Success
   CurrentAction               : 
   CurrentStepName             : 
   DocumentName                : AWS-StopEC2Instance
   DocumentVersion             : 1
   ExecutedBy                  : arn:aws:sts::123456789012:assumed-role/Administrator/Admin
   ExecutionEndTime            : 8/1/2019 5:46:59 PM
   ExecutionStartTime          : 8/1/2019 5:46:16 PM
   FailureMessage              : 
   MaxConcurrency              : 1
   MaxErrors                   : 1
   Mode                        : Auto
   Outputs                     : {}
   Parameters                  : {}
   ParentAutomationExecutionId : 
   ProgressCounters            : 
   ResolvedTargets             : Amazon.SimpleSystemsManagement.Model.ResolvedTargets
   StepExecutions              : {i-02573cafcfEXAMPLE}
   StepExecutionsTruncated     : False
   Target                      : 
   TargetLocations             : {}
   TargetMaps                  : {}
   TargetParameterName         : InstanceId
   Targets                     : {tag:Name}
   ```

------
**注意**  
您也可以在控制台中监控自动化的状态。在**自动化执行**列表中，请选择您刚才运行的自动化，然后选择**执行步骤**选项卡。该选项卡显示自动化操作的状态。

# 映射自动化目标
<a name="running-automations-map-targets"></a>

通过 `Targets` 参数，可以快速定义自动化的目标资源。例如，如果需要运行一个重新启动托管实例的自动化，不必在控制台中手动选择数十个实例 ID 或在命令中键入它们，您可以通过使用 `Targets` 参数指定 Amazon Elastic Compute Cloud (Amazon EC2) 标签将实例设为目标。

运行使用目标的自动化时，AWS Systems Manager 会为每个目标创建一个子自动化。例如，如果您通过指定标签将 Amazon Elastic Block Store (Amazon EBS) 卷指定为目标，并且这些标签解析为 100 个 Amazon EBS 卷，则 Systems Manager 创建 100 个子自动化。当所有子自动化都到达最终状态时，父自动化完成。

**注意**  
在运行时指定的任何 `input parameters`（在控制台的**输入参数**部分或在命令行中使用 `parameters` 选项）都由所有子自动化自动处理。

您可以使用标签、Resource Groups 和参数值为自动化设置目标资源。此外，您还可以使用 `TargetMaps` 选项在命令行或文件中将多个参数值设为目标。下一节更详细地介绍每个设置目标选项。

## 设置目标标签
<a name="target-tags"></a>

您可以指定单个标签作为自动化目标。多个 AWS 资源支持标签，包括 Amazon Elastic Compute Cloud (Amazon EC2) 和 Amazon Relational Database Service (Amazon RDS) 实例、Amazon Elastic Block Store (Amazon EBS) 卷和快照、Resource Groups 以及 Amazon Simple Storage Service (Amazon S3) 存储桶（仅举几例）。您可以通过设置目标标签在 AWS 资源上快速运行自动化。标签是一种键值对，例如 Operating\$1System:Linux 或 Department:Finance。如果为资源指定一个特定名称，则还可以使用“Name”作为键，将资源名称用作值。

在将标签指定为自动化目标时，还可以指定目标参数。目标参数使用 `TargetParameterName` 选项。通过选择目标参数，可以定义在其上运行自动化的资源的类型。使用标签指定的目标参数必须是运行手册中定义的有效参数。例如，如果要使用标签将数十个 EC2 实例设为目标，请选择 `InstanceId` 目标参数。通过选择此参数，可以将*实例* 定义为自动化的资源类型。在创建自定义运行手册时，您必须将**目标类型**指定为 `/AWS::EC2::Instance`，以确保仅使用实例。否则，所有具有相同标签的资源都将被设置为目标。使用标签定位实例时，可能会包括已终止的实例。

下面的屏幕截图使用 `AWS-DetachEBSVolume` 运行手册。逻辑目标参数为 `VolumeId`。

![\[使用标签作为 Systems Manager Automation 的目标\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/automation-rate-control-tags-1-new.png)


`AWS-DetachEBSVolume` 运行手册还包含一个名为**目标类型**的特殊属性，设置为 `/AWS::EC2::Volume`。这意味着，如果标签键对 `Finance:TestEnv` 返回不同类型的资源（例如，EC2 实例、Amazon EBS 卷、Amazon EBS 快照），则仅使用 Amazon EBS 卷。

**重要**  
目标参数名称区分大小写。如果使用 AWS Command Line Interface (AWS CLI) 或 AWS Tools for Windows PowerShell 运行自动化，则必须完全按照运行手册中的定义输入目标参数名称。否则，系统将返回 `InvalidAutomationExecutionParametersException` 错误。您可以使用 [DescribeDocument](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribeDocument.html) API 操作来查看有关特定运行手册中可用目标参数的信息。下面是一个示例 AWS CLI 命令，其中提供有关 `AWS-DeleteSnapshot` 文档的信息。  

```
aws ssm describe-document \
    --name AWS-DeleteSnapshot
```

下面是一些使用标签设置资源目标的示例 AWS CLI 命令。

**示例 1：使用键值对将标签指定为目标以重启 Amazon EC2 实例**

此示例重新启动带有键为 *Department*、值为 *HumanResources* 的标签的所有 Amazon EC2 实例。目标参数使用运行手册中的 *InstanceId* 参数。该示例使用了一个附加参数，通过使用自动化服务角色（也称为*担任角色*）来运行自动化。

```
aws ssm start-automation-execution \
    --document-name AWS-RestartEC2Instance \
    --targets Key=tag:Department,Values=HumanResources \
    --target-parameter-name InstanceId \
    --parameters "AutomationAssumeRole=arn:aws:iam::111122223333:role/AutomationServiceRole"
```

**示例 2：使用键值对将标签指定为目标以删除 Amazon EBS 快照**

下面的示例使用 `AWS-DeleteSnapshot` 运行手册删除键为 *Name*、值为 *January2018Backups* 的所有快照。目标参数使用 *VolumeId* 参数。

```
aws ssm start-automation-execution \
    --document-name AWS-DeleteSnapshot \
    --targets Key=tag:Name,Values=January2018Backups \
    --target-parameter-name VolumeId
```

## 设置目标 AWS Resource Groups
<a name="target-resource-groups"></a>

您可以指定单个 AWS 资源组作为自动化目标。Systems Manager 为目标资源组中的每个对象创建一个子自动化。

例如，假设您的一个 Resource Groups 名为 PatchedAMIs。此资源组包括一个列表，其中有 25 个定期进行修补的 Windows Amazon Machine Images (AMIs)。如果您运行使用 `AWS-CreateManagedWindowsInstance` 运行手册并以此资源组为目标的自动化，则 Systems Manager 会为 25 个 AMIs 中的每一个创建一个子自动化。也就是说，通过将 PatchedAMIs 资源组设置为目标，自动化会从修补的 AMIs 列表中创建 25 个实例。当所有子自动化都完成处理或到达最终状态时，父自动化完成。

下面的 AWS CLI 命令适用于此 PatchAMIs 资源组示例。该命令中，`--target-parameter-name` 选项采用 *AmiId* 参数。该命令不包含定义从每个 AMI 创建的实例类型的附加参数。`AWS-CreateManagedWindowsInstance` 运行手册默认为 t2.medium 实例类型，因此该命令将创建 25 个适用于 Windows Server 的 t2.medium Amazon EC2 实例。

```
aws ssm start-automation-execution \
    --document-name AWS-CreateManagedWindowsInstance \
    --targets Key=ResourceGroup,Values=PatchedAMIs  \
    --target-parameter-name AmiId
```

下面的控制台示例使用名为 t2-micro-instances 的资源组。

![\[将具有 Systems Manager 自动化功能的 AWS 资源组设为目标\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/automation-rate-control-resource-groups-new.png)


## 设置目标参数值
<a name="target-parameter-values"></a>

您也可以将参数值设置为目标：输入 `ParameterValues` 作为键，然后输入要在其上运行自动化的特定资源值。如果指定多个值，Systems Manager 将在指定的每个值上运行子自动化。

例如，假设运行手册包含 **InstanceID** 参数。如果在运行此自动化时将 **InstanceID** 参数值设置为目标，则 Systems Manager 会为指定的每个实例 ID 值运行一个子自动化。当自动化完成每个指定实例的运行或执行失败时，父自动化完成。您最多可以将 50 个参数值设置为目标。

以下示例使用 `AWS-CreateImage` 运行手册。指定的目标参数名称为 *InstanceId*。键使用 *ParameterValues*。值为两个 Amazon EC2 实例 ID。此命令为每个实例创建一个自动化，这将从每个实例生成一个 AMI。

```
aws ssm start-automation-execution 
    --document-name AWS-CreateImage \
    --target-parameter-name InstanceId \
    --targets Key=ParameterValues,Values=i-02573cafcfEXAMPLE,i-0471e04240EXAMPLE
```

**注意**  
`AutomationAssumeRole` 不是有效的参数。运行以参数值为目标的自动化时，不要选择此项。

### 设置目标参数值映射
<a name="target-maps"></a>

`TargetMaps` 选项扩展了您设置 `ParameterValues` 目标的能力。您可以在命令行中使用 `TargetMaps` 输入一个参数值数组。在命令行中，最多可以指定 50 个参数值。如果要运行指定 50 个以上参数值的命令，请在 JSON 文件中输入这些值。然后，可以在命令行中调用该文件。

**注意**  
控制台中不支持 `TargetMaps` 选项。

在命令中使用 `TargetMaps` 选项以下面的格式指定多个参数值。将每个*示例资源占位符*替换为您自己的信息。

```
aws ssm start-automation-execution \
    --document-name runbook name \
    --target-maps “parameter=value, parameter 2=value, parameter 3=value”  “parameter 4=value, parameter 5=value, parameter 6=value”
```

如果要为 `TargetMaps` 选项输入 50 个以上的参数值，请使用以下 JSON 格式在文件中指定这些值。在提供多个参数值时，使用 JSON 文件还有助于提高可读性。

```
[

    {“parameter”: "value", “parameter 2”: "value", “parameter 3”: "value"},

    {“parameter 4”: "value", “parameter 5”: "value", "parameter 6": "value"}

]
```

使用 .json 文件扩展名保存该文件。可以使用下面的命令调用此文件。将每个*示例资源占位符*替换为您自己的信息。

```
aws ssm start-automation-execution \
    --document-name runbook name \
    –-parameters input parameters \
    --target-maps path to file/file name.json
```

您还可以从 Amazon Simple Storage Service (Amazon S3) 存储桶下载此文件，前提是您有权从存储桶读取数据。使用下面的命令格式。将每个*示例资源占位符*替换为您自己的信息。

```
aws ssm start-automation-execution \
    --document-name runbook name \
    --target-maps http://amzn-s3-demo-bucket.s3.amazonaws.com/file_name.json
```

下面是一个帮助您了解 `TargetMaps` 选项的示例方案。在此方案中，用户想要从不同的 AMIs 创建不同类型的 Amazon EC2 实例。为了执行此任务，用户创建一个名为 AMI\$1Testing 的运行手册。此运行手册定义两个输入参数：`instanceType` 和 `imageId`。

```
{
  "description": "AMI Testing",
  "schemaVersion": "0.3",
  "assumeRole": "{{assumeRole}}",
  "parameters": {
    "assumeRole": {
      "type": "String",
      "description": "Role under which to run the automation",
      "default": ""
    },
    "instanceType": {
      "type": "String",
      "description": "Type of EC2 Instance to launch for this test"
    },
    "imageId": {
      "type": "String",
      "description": "Source AMI id from which to run instance"
    }
  },
  "mainSteps": [
    {
      "name": "runInstances",
      "action": "aws:runInstances",
      "maxAttempts": 1,
      "onFailure": "Abort",
      "inputs": {
        "ImageId": "{{imageId}}",
        "InstanceType": "{{instanceType}}",
        "MinInstanceCount": 1,
        "MaxInstanceCount": 1
      }
    }
  ],
  "outputs": [
    "runInstances.InstanceIds"
  ]
}
```

然后，用户在名为 `AMI_instance_types.json` 的文件中指定以下目标参数值。

```
[
  {
    "instanceType" : ["t2.micro"],     
    "imageId" : ["ami-b70554c8"]     
  },
  {
    "instanceType" : ["t2.small"],     
    "imageId" : ["ami-b70554c8"]     
  },
  {
    "instanceType" : ["t2.medium"],     
    "imageId" : ["ami-cfe4b2b0"]     
  },
  {
    "instanceType" : ["t2.medium"],     
    "imageId" : ["ami-cfe4b2b0"]     
  },
  {
    "instanceType" : ["t2.medium"],     
    "imageId" : ["ami-cfe4b2b0"]     
  }
]
```

用户可以通过运行以下命令来运行此自动化并创建在 `AMI_instance_types.json` 中定义的五个 EC2 实例：

```
aws ssm start-automation-execution \
    --document-name AMI_Testing \
    --target-parameter-name imageId \
    --target-maps file:///home/TestUser/workspace/runinstances/AMI_instance_types.json
```

## 将所有 Amazon EC2 实例设置为目标
<a name="target-all-instances"></a>

您可以通过选择**目标**列表中的**所有实例**，在当前 AWS 账户 和 AWS 区域 中的所有 Amazon EC2 实例上运行自动化。例如，如果要重新启动 AWS 账户 和当前 AWS 区域 的所有 Amazon EC2 实例，您可以选择 `AWS-RestartEC2Instance` 运行手册，然后选择**目标**列表中的**所有实例**。

![\[将运行手册的所有 Amazon EC2 实例设置为目标\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/automation-rate-control-target-all-instances.png)


在您选择**所有实例**后，Systems Manager 将填充带有星号 (\$1) 的**实例**字段，并使字段不可更改（该字段呈灰色）。Systems Manager 还会使 **InstanceId** 字段中的**输入参数**字段不可更改。如果您选择将所有实例设置为目标，则使这些字段不可更改是预期行为。

# 大规模控制自动化
<a name="running-automations-scale-controls"></a>

您可以通过指定并发值和错误阈值来控制自动化在 AWS 资源队列上的部署。并发和错误阈值统称为*速率控制*。

**并发**  
通过并发，您可以指定允许同时运行自动化的资源数量。并发有助于在处理自动化时限制对资源的影响或停机时间。您可以指定绝对数量的资源（如 20），也可以指定目标集百分比（如 10%）。

队列系统将自动化传输到单个资源，等到初始调用完成之后，再将自动化发送到其他两个资源。系统以指数增长方式将自动化发送到更多资源，直到达到并发值。

**错误阈值**  
通过错误阈值，您可以指定在 AWS Systems Manager 停止将自动化发送到其他资源之前允许自动化失败的次数。您可以指定绝对数量的错误（如 10），也可以指定目标集百分比（如 10%）。

例如，如果指定错误的绝对数为 3，则系统将在收到第四个错误时停止发送自动化。如果指定 0，则系统会在返回第一个错误结果后停止向其他资源发送自动化。

例如，如果向 50 个实例发送自动化并将错误阈值设置为 10%，则系统会在收到第五个错误时停止向其他实例发送命令。当达到错误阈值时，允许完成已经运行自动化的调用，但是其中一些自动化也可能失败。如果需要确保错误数不超过为错误阈值指定的数量，请将**并发**值设置为 1，以便一次只处理一个自动化。

# 在多个 AWS 区域 和账户中运行自动化
<a name="running-automations-multiple-accounts-regions"></a>

您可以在中央账户的多个 AWS 区域 区域和 AWS 账户 账户或 AWS Organizations 组织部门 (OU) 中运行 AWS Systems Manager 自动化。Automation 是 AWS Systems Manager 中的一项工具。在多个区域和账户或 OU 中运行自动化可减少管理 AWS 资源所需的时间，同时提高计算环境的安全性。

例如，您可以使用自动化运行手册执行以下操作：
+ 集中实施补丁和安全更新。
+ 修复 VPC 配置或 Amazon S3 桶策略的合规性偏差。
+ 大规模管理资源，例如 Amazon Elastic Compute Cloud (Amazon EC2) EC2 实例。

下图显示了一个用户在中央账户的多个区域和账户中运行 `AWS-RestartEC2Instances` 运行手册的示例。自动化在目标区域和账户中使用指定的标签以查找实例。

![\[显示 Systems Manager 自动化在多个区域和多个账户中运行的示意图。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/automation-multi-region-and-multi-account.png)


**为自动化选择中央账户**  
如果要在 OU 中运行自动化，中央账户必须具有列出 OU 中所有账户的权限。这只能通过委派管理员账户或组织的管理账户实现。我们建议您遵循 AWS Organizations 最佳实践并使用委派管理员账户。有关 AWS Organizations 最佳实践的更多信息，请参阅 *AWS Organizations 用户指南*中的[管理账户的最佳实践](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html)。要为 Systems Manager 创建委派管理员账户，可以将 `register-delegated-administrator` 命令与 AWS CLI 一起使用，如以下示例所示。

```
aws organizations register-delegated-administrator \
    --account-id delegated admin account ID \
    --service-principal ssm.amazonaws.com
```

如果您想跨多个不受 AWS Organizations 托管的账户运行自动化，我们建议您创建一个专用账户用于自动化管理。从专用账户运行所有跨账户自动化可简化 IAM 权限管理、故障排除工作，并在操作和管理之间建立分离层。如果您使用 AWS Organizations，但只希望针对个人账户而不是 OU，也建议使用此方法。

**自动化的工作原理**  
跨多个区域和账户或 OU 运行自动化的工作方式如下：

1. 登录要配置为 Automation 中央账户的账户。

1. 使用本主题中的 [设置进行多区域和多账户自动化的管理账户权限](#setup-management-account-iam-roles) 过程创建以下 IAM 角色：
   + `AWS-SystemsManager-AutomationAdministrationRole` - 此角色为用户提供在多个账户和 OU 中运行自动化的权限。
   + `AWS-SystemsManager-AutomationExecutionRole` - 此角色为用户提供在目标账户中运行自动化的权限。

1. 选择要运行自动化的运行手册、区域、账户或 OU。
**注意**  
确保目标 OU 包含所需的账户。如果选择自定义运行手册，则必须与所有目标账户共享运行手册。有关共享运行手册的信息，请参阅 [共享 SSM 文档](documents-ssm-sharing.md)。有关使用共享运行手册的信息，请参阅 [使用共享 SSM 文档](documents-ssm-sharing.md#using-shared-documents)。

1. 运行自动化。

1. 通过 AWS Systems Manager 控制台或 AWS CLI 使用 [GetAutomationExecution](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetAutomationExecution.html)、[DescribeAutomationStepExecutions](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribeAutomationStepExecutions.html) 和 [DescribeAutomationExecutions](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribeAutomationExecutions.html) API 操作监控自动化进度。您的主账户中自动化步骤的输出将是子自动化的 `AutomationExecutionId`。要查看在目标账户中创建的子自动化的输出，请确保在您的请求中指定相应的账户、区域和 `AutomationExecutionId`。

## 设置进行多区域和多账户自动化的管理账户权限
<a name="setup-management-account-iam-roles"></a>

按照以下过程操作，使用 AWS CloudFormation 创建进行 Systems Manager 自动化多区域和多账户自动化所需的 IAM 角色。此过程介绍如何创建 `AWS-SystemsManager-AutomationAdministrationRole` 角色。您只需要在自动化中央账户中创建此角色。此过程还介绍了如何创建 `AWS-SystemsManager-AutomationExecutionRole` 角色。您必须在要设置为多区域和多账户自动化运行目标的*每一个*账户中创建该角色。我们建议使用 CloudFormation StackSets 您想要设置为多区域和多账户自动化运行目标的账户创建 `AWS-SystemsManager-AutomationExecutionRole` 角色。

**使用 CloudFormation 创建进行多区域和多账户自动化所需的 IAM 管理角色**

1. 下载并解压缩 [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationAdministrationRole.zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationAdministrationRole.zip)。

   –或者–

   如果您的账户由 AWS Organizations [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationAdministrationRole (org).zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationAdministrationRole (org).zip) 管理。

   这些文件分别包含 `AWS-SystemsManager-AutomationAdministrationRole.yaml` 和 `AWS-SystemsManager-AutomationAdministrationRole (org).yaml` CloudFormation 模板文件。

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择**创建堆栈**。

1. 在 **Specify template**（指定模板）部分中，选择 **Upload a template**（上传模板）。

1. 选择**选择文件**，然后根据您在步骤 1 中所做的选择选择 `AWS-SystemsManager-AutomationAdministrationRole.yaml` 或 `AWS-SystemsManager-AutomationAdministrationRole (org).yaml` CloudFormation 模板文件。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页面的**堆栈名称**字段中，输入名称。

1. 选择 **Next（下一步）**。

1. 在 **Configure stack options**（配置堆栈选项）页面上，为要使用的所有选项输入值。选择 **Next（下一步）**。

1. 在**审核**页面上，向下滚动并选择**我确认 CloudFormation 可能使用自定义名称创建了 IAM 资源**选项。

1. 选择**创建堆栈**。

大约三分钟左右，CloudFormation 会显示 **CREATE\$1IN\$1PROGRESS** 状态。状态变为 **CREATE\$1COMPLETE**。

在要设置为多区域和多账户自动化运行目标的*每一个*账户中，您必须重复以下过程。

**使用 CloudFormation 创建进行多区域和多账户自动化所需的 IAM 自动化角色**

1. 下载 [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationExecutionRole.zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationExecutionRole.zip)。

   - 或

   如果您的账户由 AWS Organizations [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationExecutionRole (org).zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWS-SystemsManager-AutomationExecutionRole (org).zip) 管理。

   这些文件分别包含 `AWS-SystemsManager-AutomationExecutionRole.yaml` 和 `AWS-SystemsManager-AutomationExecutionRole (org).yaml` CloudFormation 模板文件。

1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 选择**创建堆栈**。

1. 在 **Specify template**（指定模板）部分中，选择 **Upload a template**（上传模板）。

1. 选择**选择文件**，然后根据您在步骤 1 中所做的选择选择 `AWS-SystemsManager-AutomationExecutionRole.yaml` 或 `AWS-SystemsManager-AutomationExecutionRole (org).yaml` CloudFormation 模板文件。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页面的**堆栈名称**字段中，输入名称。

1. 在 **Parameters**（参数）部分的 **AdminAccountId** 字段中，输入自动化中央账户的 ID。

1. 如果您要为 AWS Organizations 环境设置此角色，则该部分中还有另一个名为 **OrganizationID** 的字段。输入 AWS 组织的 ID。

1. 选择 **Next（下一步）**。

1. 在 **Configure stack options**（配置堆栈选项）页面上，为要使用的所有选项输入值。选择 **Next（下一步）**。

1. 在**审核**页面上，向下滚动并选择**我确认 CloudFormation 可能使用自定义名称创建了 IAM 资源**选项。

1. 选择**创建堆栈**。

大约三分钟左右，CloudFormation 会显示 **CREATE\$1IN\$1PROGRESS** 状态。状态变为 **CREATE\$1COMPLETE**。

## 在多个区域和账户中运行自动化（控制台）
<a name="multiple-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台在自动化管理账户的多个区域和账户中运行自动化。

**开始前的准备工作**  
在完成以下过程之前，请记下以下信息：
+ 用于运行多区域或多账户自动化的用户或角色必须拥有 `AWS-SystemsManager-AutomationAdministrationRole` 角色的 `iam:PassRole` 权限。
+ 要在其中运行自动化的 AWS 账户 账户 ID 或 OU。
+ 将在其中运行自动化的[受 Systems Manager 支持区域](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region)。
+ 要在其中运行自动化的标签键和标签值或资源组的名称。

**在多个区域和账户中运行自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行自动化文档页面**上，选择**多账户和区域**。

1. 在**目标账户和区域**部分中，使用**账户和组织单元（OU）和根**字段指定要在其中运行自动化的不同 AWS 账户 或 AWS 组织单元（OU）。使用逗号分隔多个账户或 OU。

   1. （可选）选中**包括子 OU** 复选框以包括指定 OU 中的所有子组织单元。

   1. （可选）在**排除账户和组织单元（OU）**字段中，输入以逗号分隔的账户 ID 和 OU ID 列表，这些账户和组织单元将从上面输入的扩展实体中排除。

1. 使用**区域**列表选择要在其中运行自动化的一个或多个区域。

1. 使用**多区域和账户速率控制**选项将自动化限制为在有限区域中的有限账户运行。这些选项不限制可运行自动化的 AWS 资源的数量。

   1. 在**位置(账户-区域对)并发)**部分中，选择一个选项以限制可同时在多个账户和区域中运行的自动化的数量。例如，如果选择在位于四 (4) 个 AWS 区域 中的五 (5) 个 AWS 账户 账户中运行自动化，则 Systems Manager 在总共 20 个账户-区域对中运行自动化。您可以使用此选项指定一个绝对数量（例如 **2**），以使自动化仅同时在两个账户-区域对中运行。或者，您也可以指定可同时运行的账户-区域对的百分比。例如，对于 20 个账户-区域对，如果您指定 20%，自动化在最多五 (5) 个账户-区域对中同时运行。
      + 选择**目标**，以输入可同时运行自动化的账户-区域对的绝对数量。
      + 选择**百分比**，以输入可同时运行自动化的账户-区域对总数的百分比。

   1. 在**错误阈值**部分中，选择一个选项：
      + 选择**错误**，以输入自动化停止将自动化发送到其他资源之前允许的错误绝对数量。
      + 选择**百分比**，以输入自动化停止将工作流程发送到其他资源之前允许的错误的百分比。

1. 在**目标**部分中，选择希望如何设置要在其中运行自动化的 AWS 资源。这些选项是必需的。

   1. 使用**参数**列表选择一个参数。**参数**列表中的项目由此过程开始时选择的自动化运行手册中的参数确定。通过选择参数，可以定义在其上运行自动化工作流的资源类型。

   1. 使用**目标**列表选择设置目标资源的方式。

      1. 如果选择使用参数值将资源设置为目标，请输入您在**输入参数**部分为参数选择的参数值。

      1. 如果选择使用 AWS Resource Groups 将资源设置为目标，请从**资源组**列表中选择组的名称。

      1. 如果选择使用标签将资源设置为目标，请在提供的字段中输入标签键和（可选）标签值。选择**添加**。

      1. 如果要在当前 AWS 账户 和 AWS 区域 中的所有实例上运行自动化运行手册，则选择**所有实例**。

1. 在**输入参数** 部分中，指定所需的输入。从 **AutomationAssumeRole** 列表选择 `AWS-SystemsManager-AutomationAdministrationRole` IAM 服务角色。
**注意**  
您可能不需要选择**输入参数**部分中的某些选项。原因是您使用标签或资源组将多个区域和账户中的资源设置为目标。例如，如果选择了 `AWS-RestartEC2Instance` 运行手册，则无需在**输入参数**部分中指定或选择实例 ID。自动化使用您指定的标签以查找要重新启动的实例。

1. （可选）选择一个 CloudWatch 警报以应用于您的自动化进行监控。要将 CloudWatch 警报附加到自动化，启动自动化的 IAM 主体必须具有 `iam:createServiceLinkedRole` 操作的权限。有关 CloudWatch 警报的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。请注意，如果您的警报激活，自动化将取消，并且您定义的任何 `OnCancel` 步骤都会运行。如果使用 AWS CloudTrail，您将在跟踪中看到 API 调用。

1. 使用**速率控制**部分中的选项限制可在每个账户-区域对中运行自动化的 AWS 资源的数量。

   在**并发**部分中，选择一个选项：
   + 选择**目标**，以输入可同时运行自动化工作流目标的绝对数量。
   + 选择**百分比**，以输入可同时运行自动化工作流的目标集的百分比。

1. 在**错误阈值**部分中，选择一个选项：
   + 选择**错误**，以输入自动化停止将工作流程发送到其他资源之前允许的错误的绝对数量。
   + 选择**百分比**，以输入自动化停止将工作流程发送到其他资源之前允许的错误的百分比。

1. 选择**执行**。

自动化执行完成后，您可以使用相同或修改后的参数重新运行该执行。有关更多信息，请参阅 [重新运行自动化执行](automation-rerun-executions.md)。

## 在多个区域和账户中运行自动化（命令行）
<a name="multiple-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows 上）或 AWS Tools for PowerShell 在自动化管理账户的多个区域和账户中运行自动化。

**开始前的准备工作**  
在完成以下过程之前，请记下以下信息：
+ 要在其中运行自动化的 AWS 账户 账户 ID 或 OU。
+ 将在其中运行自动化的[受 Systems Manager 支持区域](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region)。
+ 要在其中运行自动化的标签键和标签值或资源组的名称。

**在多个区域和账户中运行自动化**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 使用以下格式创建一个命令，以便在多个区域和账户中运行自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name runbook name \
           --parameters AutomationAssumeRole=arn:aws:iam::management account ID:role/AWS-SystemsManager-AutomationAdministrationRole \
           --target-parameter-name parameter name \
           --targets Key=tag key,Values=value \
           --target-locations Accounts=account ID,account ID 2,Regions=Region,Region 2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
           --document-name runbook name ^
           --parameters AutomationAssumeRole=arn:aws:iam::management account ID:role/AWS-SystemsManager-AutomationAdministrationRole ^
           --target-parameter-name parameter name ^
           --targets Key=tag key,Values=value ^
           --target-locations Accounts=account ID,account ID 2,Regions=Region,Region 2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
       $Targets.Key = "tag key"
       $Targets.Values = "value"
       
       Start-SSMAutomationExecution `
           -DocumentName "runbook name" `
           -Parameter @{
           "AutomationAssumeRole"="arn:aws:iam::management account ID:role/AWS-SystemsManager-AutomationAdministrationRole" } `
           -TargetParameterName "parameter name" `
           -Target $Targets `
           -TargetLocation @{
           "Accounts"="account ID","account ID 2";
           "Regions"="Region","Region 2";
           "ExecutionRoleName"="AWS-SystemsManager-AutomationExecutionRole" }
   ```

------

**示例：在多个区域和账户中运行自动化**  
以下示例演示如何使用 AWS CLI 和 PowerShell 通过一条命令在多个账户和区域中运行自动化。

   **示例 1**：此示例重启整个 AWS Organizations 组织中三个区域中的 EC2 实例。这是通过定位组织的根 ID 并包括子 OU 来实现的。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name "AWS-RestartEC2Instance" \
           --target-parameter-name InstanceId \
           --targets '[{"Key":"AWS::EC2::Instance","Values":["*"]}]' \
           --target-locations '[{
               "Accounts": ["r-example"],
               "IncludeChildOrganizationUnits": true,
               "Regions": ["us-east-1", "us-east-2", "us-west-2"]
           }]'
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution \
           --document-name "AWS-RestartEC2Instance" ^
           --target-parameter-name InstanceId ^
           --targets '[{"Key":"AWS::EC2::Instance","Values":["*"]}]' ^
           --target-locations '[{
               "Accounts": ["r-example"],
               "IncludeChildOrganizationUnits": true,
               "Regions": ["us-east-1", "us-east-2", "us-west-2"]
           }]'
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
           -DocumentName "AWS-RestartEC2Instance" `
           -TargetParameterName "InstanceId" `
           -Targets '[{"Key":"AWS::EC2::Instance","Values":["*"]}]'
           -TargetLocation @{
               "Accounts"="r-example";
               "Regions"="us-east-1", "us-east-2", "us-west-2";
               "IncludeChildOrganizationUnits"=true}
   ```

------

   **示例 2**：此示例重启不同账户和区域中的特定 EC2 实例。
**注意**  
`TargetLocationMaxConcurrency` 选项在使用 AWS CLI 和 AWS SDK 时可用。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name "AWS-RestartEC2Instance" \
           --target-parameter-name InstanceId \
           --target-locations '[{
               "Accounts": ["123456789012"],
               "Targets": [{
                   "Key":"ParameterValues",
                   "Values":["i-02573cafcfEXAMPLE", "i-0471e04240EXAMPLE"]
               }],
               "TargetLocationMaxConcurrency": "100%",
               "Regions": ["us-east-1"]
           }, {
               "Accounts": ["987654321098"],
               "Targets": [{
                   "Key":"ParameterValues",
                   "Values":["i-07782c72faEXAMPLE"]
               }],
               "TargetLocationMaxConcurrency": "100%",
               "Regions": ["us-east-2"]
           }]'
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
           --document-name "AWS-RestartEC2Instance" ^
           --target-parameter-name InstanceId ^
           --target-locations '[{
               "Accounts": ["123456789012"],
               "Targets": [{
                   "Key":"ParameterValues",
                   "Values":["i-02573cafcfEXAMPLE", "i-0471e04240EXAMPLE"]
               }],
               "TargetLocationMaxConcurrency": "100%",
               "Regions": ["us-east-1"]
           }, {
               "Accounts": ["987654321098"],
               "Targets": [{
                   "Key":"ParameterValues",
                   "Values":["i-07782c72faEXAMPLE"]
               }],
               "TargetLocationMaxConcurrency": "100%",
               "Regions": ["us-east-2"]
           }]'
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
           -DocumentName "AWS-RestartEC2Instance" `
           -TargetParameterName "InstanceId" `
           -Targets '[{"Key":"AWS::EC2::Instance","Values":["*"]}]'
           -TargetLocation @({
               "Accounts"="123456789012",
               "Targets"= @{
                   "Key":"ParameterValues",
                   "Values":["i-02573cafcfEXAMPLE", "i-0471e04240EXAMPLE"]
               },
               "TargetLocationMaxConcurrency"="100%",
               "Regions"=["us-east-1"]
           }, {
               "Accounts"="987654321098",
               "Targets": @{
                   "Key":"ParameterValues",
                   "Values":["i-07782c72faEXAMPLE"]
               },
               "TargetLocationMaxConcurrency": "100%",
               "Regions"=["us-east-2"]
           })
   ```

------

   **示例 3**：此示例演示如何使用 `--target-locations-url` 选项指定应在其中运行自动化的多个 AWS 账户 和区域。此选项的值必须是可公开访问的[预签名 Amazon S3 URL](https://docs.aws.amazon.com/AmazonS3/latest/userguide/using-presigned-url.html) 中的 JSON 文件。
**注意**  
`--target-locations-url` 在使用 AWS CLI 和 AWS SDK 时可用。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name "MyCustomAutomationRunbook" \
       --target-locations-url "https://amzn-s3-demo-bucket.s3.amazonaws.com/target-locations.json"
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name "MyCustomAutomationRunbook" ^
       --target-locations-url "https://amzn-s3-demo-bucket.s3.amazonaws.com/target-locations.json"
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
       -DocumentName "MyCustomAutomationRunbook" `
       -TargetLocationsUrl "https://amzn-s3-demo-bucket.s3.amazonaws.com/target-locations.json"
   ```

------

   JSON 文件的示例内容：

   ```
   [
   { 
            "Accounts": [ "123456789012", "987654321098", "456789123012" ],
            "ExcludeAccounts": [ "111222333444", "999888444666" ],
            "ExecutionRoleName": "MyAutomationExecutionRole",
            "IncludeChildOrganizationUnits": true,
            "Regions": [ "us-east-1", "us-west-2", "ap-south-1", "ap-northeast-1" ],
            "Targets": ["Key": "AWS::EC2::Instance", "Values": ["i-2"]],
            "TargetLocationMaxConcurrency": "50%",
            "TargetLocationMaxErrors": "10",
            "TargetsMaxConcurrency": "20",
            "TargetsMaxErrors": "12"
    }
   ]
   ```

   **示例 4**：此示例重启 `123456789012` 和 `987654321098` 账户中的 EC2 实例，它们位于 `us-east-2` 和 `us-west-1` 区域中。必须使用标签键对值 `Env-PROD` 标记这些实例。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name AWS-RestartEC2Instance \
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole \
           --target-parameter-name InstanceId \
           --targets Key=tag:Env,Values=PROD \
           --target-locations Accounts=123456789012,987654321098,Regions=us-east-2,us-west-1,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
           --document-name AWS-RestartEC2Instance ^
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole ^
           --target-parameter-name InstanceId ^
           --targets Key=tag:Env,Values=PROD ^
           --target-locations Accounts=123456789012,987654321098,Regions=us-east-2,us-west-1,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
       $Targets.Key = "tag:Env"
       $Targets.Values = "PROD"
       
       Start-SSMAutomationExecution `
           -DocumentName "AWS-RestartEC2Instance" `
           -Parameter @{
           "AutomationAssumeRole"="arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole" } `
           -TargetParameterName "InstanceId" `
           -Target $Targets `
           -TargetLocation @{
           "Accounts"="123456789012","987654321098";
           "Regions"="us-east-2","us-west-1";
           "ExecutionRoleName"="AWS-SystemsManager-AutomationExecutionRole" }
   ```

------

   **示例 5**：此示例重启 `123456789012` 和 `987654321098` 账户中的 EC2 实例，它们位于 `eu-central-1` 区域中。这些实例必须是 `prod-instances` AWS 资源组的成员。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name AWS-RestartEC2Instance \
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole \
           --target-parameter-name InstanceId \
           --targets Key=ResourceGroup,Values=prod-instances \
           --target-locations Accounts=123456789012,987654321098,Regions=eu-central-1,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
           --document-name AWS-RestartEC2Instance ^
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole ^
           --target-parameter-name InstanceId ^
           --targets Key=ResourceGroup,Values=prod-instances ^
           --target-locations Accounts=123456789012,987654321098,Regions=eu-central-1,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
       $Targets.Key = "ResourceGroup"
       $Targets.Values = "prod-instances"
       
       Start-SSMAutomationExecution `
           -DocumentName "AWS-RestartEC2Instance" `
           -Parameter @{
           "AutomationAssumeRole"="arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole" } `
           -TargetParameterName "InstanceId" `
           -Target $Targets `
           -TargetLocation @{
           "Accounts"="123456789012","987654321098";
           "Regions"="eu-central-1";
           "ExecutionRoleName"="AWS-SystemsManager-AutomationExecutionRole" }
   ```

------

   **示例 6**：此示例重启 `ou-1a2b3c-4d5e6c` AWS 组织单元（OU）中的 EC2 实例。这些实例位于 `us-west-1` 和 `us-west-2` 区域中。这些实例必须是 `WebServices` AWS 资源组的成员。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
           --document-name AWS-RestartEC2Instance \
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole \
           --target-parameter-name InstanceId \
           --targets Key=ResourceGroup,Values=WebServices \
           --target-locations Accounts=ou-1a2b3c-4d5e6c,Regions=us-west-1,us-west-2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
           --document-name AWS-RestartEC2Instance ^
           --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole ^
           --target-parameter-name InstanceId ^
           --targets Key=ResourceGroup,Values=WebServices ^
           --target-locations Accounts=ou-1a2b3c-4d5e6c,Regions=us-west-1,us-west-2,ExecutionRoleName=AWS-SystemsManager-AutomationExecutionRole
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
       $Targets.Key = "ResourceGroup"
       $Targets.Values = "WebServices"
       
       Start-SSMAutomationExecution `
           -DocumentName "AWS-RestartEC2Instance" `
           -Parameter @{
           "AutomationAssumeRole"="arn:aws:iam::123456789012:role/AWS-SystemsManager-AutomationAdministrationRole" } `
           -TargetParameterName "InstanceId" `
           -Target $Targets `
           -TargetLocation @{
           "Accounts"="ou-1a2b3c-4d5e6c";
           "Regions"="us-west-1";
           "ExecutionRoleName"="AWS-SystemsManager-AutomationExecutionRole" }
   ```

------

   系统返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
           "AutomationExecutionId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE"
       }
   ```

------
#### [ Windows ]

   ```
   {
           "AutomationExecutionId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE"
       }
   ```

------
#### [ PowerShell ]

   ```
   4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

------

1. 运行以下命令以查看自动化的详细信息。将 *automation execution ID* 替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-automation-executions \
           --filters Key=ExecutionId,Values=automation execution ID
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-automation-executions ^
           --filters Key=ExecutionId,Values=automation execution ID
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationExecutionList | `
           Where {$_.AutomationExecutionId -eq "automation execution ID"}
   ```

------

1. 运行以下命令以查看自动化进程的详细信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-automation-execution \
           --automation-execution-id 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

------
#### [ Windows ]

   ```
   aws ssm get-automation-execution ^
           --automation-execution-id 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationExecution `
           -AutomationExecutionId a4a3c0e9-7efd-462a-8594-01234EXAMPLE
   ```

------
**注意**  
您也可以在控制台中监控自动化的状态。在**自动化执行**列表中，请选择您刚才运行的自动化，然后选择**执行步骤**选项卡。该选项卡显示自动化操作的状态。

**更多信息**  
[通过 AWS Systems Manager 自动化进行集中式多账户和多区域修补](https://aws.amazon.com/blogs/mt/centralized-multi-account-and-multi-region-patching-with-aws-systems-manager-automation/)

# 基于 EventBridge 事件运行自动化
<a name="running-automations-event-bridge"></a>

您可以通过指定运行手册作为 Amazon EventBridge 事件的目标来启动自动化。您可以按计划或者在特定 AWS 系统事件发生时启动自动化。例如，假设您创建一个名为 *BootStrapInstances* 的运行手册，该运行手册在实例启动时在实例上安装软件。要指定 *BootStrapInstances* 运行手册（和对应的工作流程）作为 EventBridge 事件的目标，请先创建新的 EventBridge 规则。(以下是示例规则：**Service name**：EC2，**Event Type**：EC2 实例状态更改通知，**Specific state(s)**：正在运行，**Any instance**。) 然后，您使用以下过程指定 *BootStrapInstances* 运行手册作为使用 EventBridge 控制台和 AWS Command Line Interface (AWS CLI) 的事件的目标。当新实例启动时，系统将运行自动化并安装软件。

有关创建运行手册的更多信息，请参阅 [创建您自己的运行手册](automation-documents.md)。

## 创建使用运行手册（控制台）的 EventBridge 事件
<a name="automation-cwe-target-console"></a>

使用以下过程将运行手册配置为 EventBridge 事件目标。

**将运行手册配置为 EventBridge 事件规则的目标**

1. 打开位于 [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/) 的 Amazon EventBridge 控制台。

1. 在导航窗格中，选择**规则**。

1. 选择**创建规则**。

1. 为规则输入名称和描述。

   规则不能与同一区域中的另一个规则和同一事件总线上的名称相同。

1. 对于**事件总线**，请选择要与此规则关联的事件总线。如果您希望此规则响应来自您自己的 AWS 账户的匹配事件，请选择 **defaul**（默认）。当您账户中的某个 AWS 服务发出一个事件时，它始终会发送到您账户的默认事件总线。

1. 选择触发规则的方式。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/running-automations-event-bridge.html)

1. 选择**下一步**。

1. 对于**目标类型**，选择**AWS 服务**。

1. 对于 **Target**（目标），选择 **Systems Manager Automation**。

1. 对于**文档**，选择在调用目标时要使用的运行手册。

1. 在 **Configure automation parameter(s)**（配置自动化参数）部分中，保留默认参数值（如果可用）或输入您自己的值。
**注意**  
要创建目标，您必须为每个所需的参数指定一个值。如果不指定，系统虽然会创建规则，但该规则不会运行。

1. 对于许多目标类型，EventBridge 需要权限以便将事件发送到目标。在这些情况下，EventBridge 可以创建运行事件所需的 IAM 角色：请执行以下操作之一：
   + 若要自动创建 IAM 角色，请选择 **Create a new role for this specific resource（为此特定资源创建新角色）**。
   + 要使用您之前创建的 IAM 角色，请选择 **Use existing role**（使用现有角色），然后从下拉列表中选择现有角色。请注意，您可能需要更新 IAM 角色的信任策略以包括 EventBridge。以下是示例：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "",
               "Effect": "Allow",
               "Principal": {
                   "Service": [
                       "events.amazonaws.com",
                       "ssm.amazonaws.com"
                   ]
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 选择**下一步**。

1. （可选）为规则输入一个或多个标签。有关更多信息，请参阅 *Amazon EventBridge 用户指南*中的[标记 Amazon EventBridge 资源](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-tagging.html)。

1. 选择 **Next（下一步）**。

1. 查看规则详细信息并选择**创建规则**。

## 创建一个使用运行手册的 EventBridge 事件（命令行）
<a name="automation-cwe-target-commandline"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows 上）或 AWS Tools for PowerShell 创建 EventBridge 事件规则并将运行手册配置为目标。

**将运行手册配置为 EventBridge 事件规则的目标**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 创建一个命令以指定新的 EventBridge 事件规则。将每个*示例资源占位符*替换为您自己的信息。

   *基于计划的触发器*

------
#### [ Linux & macOS ]

   ```
   aws events put-rule \
   --name "rule name" \
   --schedule-expression "cron or rate expression"
   ```

------
#### [ Windows ]

   ```
   aws events put-rule ^
   --name "rule name" ^
   --schedule-expression "cron or rate expression"
   ```

------
#### [ PowerShell ]

   ```
   Write-CWERule `
   -Name "rule name" `
   -ScheduleExpression "cron or rate expression"
   ```

------

   以下示例创建一个 EventBridge 事件规则，将在每天上午 9:00 (UTC) 启动该规则。

------
#### [ Linux & macOS ]

   ```
   aws events put-rule \
   --name "DailyAutomationRule" \
   --schedule-expression "cron(0 9 * * ? *)"
   ```

------
#### [ Windows ]

   ```
   aws events put-rule ^
   --name "DailyAutomationRule" ^
   --schedule-expression "cron(0 9 * * ? *)"
   ```

------
#### [ PowerShell ]

   ```
   Write-CWERule `
   -Name "DailyAutomationRule" `
   -ScheduleExpression "cron(0 9 * * ? *)"
   ```

------

   *基于事件的触发器*

------
#### [ Linux & macOS ]

   ```
   aws events put-rule \
   --name "rule name" \
   --event-pattern "{\"source\":[\"aws.service\"],\"detail-type\":[\"service event detail type\"]}"
   ```

------
#### [ Windows ]

   ```
   aws events put-rule ^
   --name "rule name" ^
   --event-pattern "{\"source\":[\"aws.service\"],\"detail-type\":[\"service event detail type\"]}"
   ```

------
#### [ PowerShell ]

   ```
   Write-CWERule `
   -Name "rule name" `
   -EventPattern '{"source":["aws.service"],"detail-type":["service event detail type"]}'
   ```

------

   以下示例创建一个 EventBridge 事件规则，将在区域中的任何 EC2 实例更改状态时启动该规则。

------
#### [ Linux & macOS ]

   ```
   aws events put-rule \
   --name "EC2InstanceStateChanges" \
   --event-pattern "{\"source\":[\"aws.ec2\"],\"detail-type\":[\"EC2 Instance State-change Notification\"]}"
   ```

------
#### [ Windows ]

   ```
   aws events put-rule ^
   --name "EC2InstanceStateChanges" ^
   --event-pattern "{\"source\":[\"aws.ec2\"],\"detail-type\":[\"EC2 Instance State-change Notification\"]}"
   ```

------
#### [ PowerShell ]

   ```
   Write-CWERule `
   -Name "EC2InstanceStateChanges" `
   -EventPattern '{"source":["aws.ec2"],"detail-type":["EC2 Instance State-change Notification"]}'
   ```

------

   该命令返回新 EventBridge 规则的详细信息，类似于以下内容。

------
#### [ Linux & macOS ]

   ```
   {
   "RuleArn": "arn:aws:events:us-east-1:123456789012:rule/automationrule"
   }
   ```

------
#### [ Windows ]

   ```
   {
   "RuleArn": "arn:aws:events:us-east-1:123456789012:rule/automationrule"
   }
   ```

------
#### [ PowerShell ]

   ```
   arn:aws:events:us-east-1:123456789012:rule/EC2InstanceStateChanges
   ```

------

1. 创建一个命令以将运行手册指定为在步骤 2 中创建的 EventBridge 事件规则的目标。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws events put-targets \
   --rule rule name \
   --targets '{"Arn": " arn:aws:ssm:region:account ID:automation-definition/runbook name","Input":"{\"Message\":[\"{\\\"Key\\\":\\\"key name\\\",\\\"Values\\\":[\\\"value\\\"]}\"]}","Id": "target ID","RoleArn": "arn:aws:iam::123456789012:role/service-role/EventBridge service role"}'
   ```

------
#### [ Windows ]

   ```
   aws events put-targets ^
   --rule rule name ^
   --targets '{"Arn": "arn:aws:ssm:region:account ID:automation-definition/runbook name","Input":"{\"Message\":[\"{\\\"Key\\\":\\\"key name\\\",\\\"Values\\\":[\\\"value\\\"]}\"]}","Id": "target ID","RoleArn": "arn:aws:iam::123456789012:role/service-role/EventBridge service role"}'
   ```

------
#### [ PowerShell ]

   ```
   $Target = New-Object Amazon.CloudWatchEvents.Model.Target
   $Target.Id = "target ID"
   $Target.Arn = "arn:aws:ssm:region:account ID:automation-definition/runbook name"
   $Target.RoleArn = "arn:aws:iam::123456789012:role/service-role/EventBridge service role"
   $Target.Input = '{"input parameter":["value"],"AutomationAssumeRole":["arn:aws:iam::123456789012:role/AutomationServiceRole"]}'
   
   Write-CWETarget `
   -Rule "rule name" `
   -Target $Target
   ```

------

   以下示例创建一个 EventBridge 事件目标，它使用 `AWS-StartEC2Instance` 运行手册启动指定的实例 ID。

------
#### [ Linux & macOS ]

   ```
   aws events put-targets \
   --rule DailyAutomationRule \
   --targets '{"Arn": "arn:aws:ssm:region:*:automation-definition/AWS-StartEC2Instance","Input":"{\"InstanceId\":[\"i-02573cafcfEXAMPLE\"],\"AutomationAssumeRole\":[\"arn:aws:iam::123456789012:role/AutomationServiceRole\"]}","Id": "Target1","RoleArn": "arn:aws:iam::123456789012:role/service-role/AWS_Events_Invoke_Start_Automation_Execution_1213609520"}'
   ```

------
#### [ Windows ]

   ```
   aws events put-targets ^
   --rule DailyAutomationRule ^
   --targets '{"Arn": "arn:aws:ssm:region:*:automation-definition/AWS-StartEC2Instance","Input":"{\"InstanceId\":[\"i-02573cafcfEXAMPLE\"],\"AutomationAssumeRole\":[\"arn:aws:iam::123456789012:role/AutomationServiceRole\"]}","Id": "Target1","RoleArn": "arn:aws:iam::123456789012:role/service-role/AWS_Events_Invoke_Start_Automation_Execution_1213609520"}'
   ```

------
#### [ PowerShell ]

   ```
   $Target = New-Object Amazon.CloudWatchEvents.Model.Target
   $Target.Id = "Target1"
   $Target.Arn = "arn:aws:ssm:region:*:automation-definition/AWS-StartEC2Instance"
   $Target.RoleArn = "arn:aws:iam::123456789012:role/service-role/AWS_Events_Invoke_Start_Automation_Execution_1213609520"
   $Target.Input = '{"InstanceId":["i-02573cafcfEXAMPLE"],"AutomationAssumeRole":["arn:aws:iam::123456789012:role/AutomationServiceRole"]}'
   
   Write-CWETarget `
   -Rule "DailyAutomationRule" `
   -Target $Target
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
   "FailedEntries": [],
   "FailedEntryCount": 0
   }
   ```

------
#### [ Windows ]

   ```
   {
   "FailedEntries": [],
   "FailedEntryCount": 0
   }
   ```

------
#### [ PowerShell ]

   如果命令在 PowerShell 中成功，则没有输出。

------

# 要按步骤运行自动化
<a name="automation-working-executing-manually"></a>

以下过程介绍了如何通过手动执行模式使用 AWS Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 运行自动化。通过使用手动执行模式，自动化在两个步骤之间从*等待*状态开始，在*等待*状态暂停。这允许您控制自动化何时继续，如果您需要先查看某个步骤的结果，然后再继续，这会很有用。

自动化在当前用户的上下文中运行。因此，只要您有权使用运行手册和此运行手册调用的任何操作，就无需配置其他 IAM 权限。如果您在 IAM 中拥有管理员权限，则已有权运行此自动化。

## 按步骤运行自动化（控制台）
<a name="automation-working-executing-manually-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台按步骤手动运行自动化。

**要按步骤运行自动化，请执行以下操作**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行模式**部分中，选择**手动执行**。

1. 在**输入参数**部分中，指定所需的输入。或者，您也可以从 **AutomationAssumeRole** 列表选择一个 IAM 服务角色。

1. 选择**执行**。

1. 当您准备好开始自动化的第一步时，选择**执行此步骤**。自动化将执行步骤 1，并在运行您在此过程的步骤 3 中选择的运行手册中指定的任何后续步骤之前暂停。如果运行手册具有多个步骤，则必须为每个步骤选择**执行此步骤**以让自动化继续。每次选择**执行此步骤**，操作就会运行。
**注意**  
控制台将显示自动化的状态。如果自动化无法运行某个步骤，请参阅 [Systems Manager 自动化故障排除](automation-troubleshooting.md)。

1. 在完成运行手册中指定的所有步骤后，选择**完成并查看结果**以完成自动化并查看结果。

自动化执行完成后，您可以使用相同或修改后的参数重新运行该执行。有关更多信息，请参阅 [重新运行自动化执行](automation-rerun-executions.md)。

## 按步骤运行自动化（命令行）
<a name="automation-working-executing-manually-commandline"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux、macOS 或 Windows 中）或 AWS Tools for PowerShell 按步骤手动运行自动化。

**要按步骤运行自动化，请执行以下操作：**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 运行以下命令以启动一个手动自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name runbook name \
       --mode Interactive \
       --parameters runbook parameters
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name runbook name ^
       --mode Interactive ^
       --parameters runbook parameters
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
       -DocumentName runbook name `
       -Mode Interactive `
       -Parameter runbook parameters
   ```

------

   以下是使用 `AWS-RestartEC2Instance` 运行手册重新启动指定 EC2 实例的示例。

------
#### [ Linux & macOS ]

   ```
   aws ssm start-automation-execution \
       --document-name "AWS-RestartEC2Instance" \
       --mode Interactive \
       --parameters "InstanceId=i-02573cafcfEXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm start-automation-execution ^
       --document-name "AWS-RestartEC2Instance" ^
       --mode Interactive ^
       --parameters "InstanceId=i-02573cafcfEXAMPLE"
   ```

------
#### [ PowerShell ]

   ```
   Start-SSMAutomationExecution `
       -DocumentName AWS-RestartEC2Instance `
       -Mode Interactive 
       -Parameter @{"InstanceId"="i-02573cafcfEXAMPLE"}
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "AutomationExecutionId": "ba9cd881-1b36-4d31-a698-0123456789ab"
   }
   ```

------
#### [ Windows ]

   ```
   {
       "AutomationExecutionId": "ba9cd881-1b36-4d31-a698-0123456789ab"
   }
   ```

------
#### [ PowerShell ]

   ```
   ba9cd881-1b36-4d31-a698-0123456789ab
   ```

------

1. 在准备好开始执行自动化的第一步时，运行以下命令。将每个*示例资源占位符*替换为您自己的信息。自动化将执行步骤 1，并在运行您在该过程的步骤 1 中选择的运行手册中指定的任何后续步骤之前暂停。如果运行手册具有多个步骤，则必须为每个步骤运行以下命令以使自动化继续执行。

------
#### [ Linux & macOS ]

   ```
   aws ssm send-automation-signal \
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab \
       --signal-type StartStep \
       --payload StepName="stopInstances"
   ```

------
#### [ Windows ]

   ```
   aws ssm send-automation-signal ^
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab ^
       --signal-type StartStep ^
       --payload StepName="stopInstances"
   ```

------
#### [ PowerShell ]

   ```
   Send-SSMAutomationSignal `
       -AutomationExecutionId ba9cd881-1b36-4d31-a698-0123456789ab `
       -SignalType StartStep 
       -Payload @{"StepName"="stopInstances"}
   ```

------

   如果此命令成功，则无任何输出。

1. 运行以下命令以检索自动化中的每个步骤执行的状态。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-automation-step-executions \
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-automation-step-executions ^
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMAutomationStepExecution `
       -AutomationExecutionId ba9cd881-1b36-4d31-a698-0123456789ab
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
       "StepExecutions": [
           {
               "StepName": "stopInstances",
               "Action": "aws:changeInstanceState",
               "ExecutionStartTime": 1557167178.42,
               "ExecutionEndTime": 1557167220.617,
               "StepStatus": "Success",
               "Inputs": {
                   "DesiredState": "\"stopped\"",
                   "InstanceIds": "[\"i-02573cafcfEXAMPLE\"]"
               },
               "Outputs": {
                   "InstanceStates": [
                       "stopped"
                   ]
               },
               "StepExecutionId": "654243ba-71e3-4771-b04f-0123456789ab",
               "OverriddenParameters": {},
               "ValidNextSteps": [
                   "startInstances"
               ]
           },
           {
               "StepName": "startInstances",
               "Action": "aws:changeInstanceState",
               "ExecutionStartTime": 1557167273.754,
               "ExecutionEndTime": 1557167480.73,
               "StepStatus": "Success",
               "Inputs": {
                   "DesiredState": "\"running\"",
                   "InstanceIds": "[\"i-02573cafcfEXAMPLE\"]"
               },
               "Outputs": {
                   "InstanceStates": [
                       "running"
                   ]
               },
               "StepExecutionId": "8a4a1e0d-dc3e-4039-a599-0123456789ab",
               "OverriddenParameters": {}
           }
       ]
   }
   ```

------
#### [ Windows ]

   ```
   {
       "StepExecutions": [
           {
               "StepName": "stopInstances",
               "Action": "aws:changeInstanceState",
               "ExecutionStartTime": 1557167178.42,
               "ExecutionEndTime": 1557167220.617,
               "StepStatus": "Success",
               "Inputs": {
                   "DesiredState": "\"stopped\"",
                   "InstanceIds": "[\"i-02573cafcfEXAMPLE\"]"
               },
               "Outputs": {
                   "InstanceStates": [
                       "stopped"
                   ]
               },
               "StepExecutionId": "654243ba-71e3-4771-b04f-0123456789ab",
               "OverriddenParameters": {},
               "ValidNextSteps": [
                   "startInstances"
               ]
           },
           {
               "StepName": "startInstances",
               "Action": "aws:changeInstanceState",
               "ExecutionStartTime": 1557167273.754,
               "ExecutionEndTime": 1557167480.73,
               "StepStatus": "Success",
               "Inputs": {
                   "DesiredState": "\"running\"",
                   "InstanceIds": "[\"i-02573cafcfEXAMPLE\"]"
               },
               "Outputs": {
                   "InstanceStates": [
                       "running"
                   ]
               },
               "StepExecutionId": "8a4a1e0d-dc3e-4039-a599-0123456789ab",
               "OverriddenParameters": {}
           }
       ]
   }
   ```

------
#### [ PowerShell ]

   ```
   Action: aws:changeInstanceState
   ExecutionEndTime     : 5/6/2019 19:45:46
   ExecutionStartTime   : 5/6/2019 19:45:03
   FailureDetails       : 
   FailureMessage       : 
   Inputs               : {[DesiredState, "stopped"], [InstanceIds, ["i-02573cafcfEXAMPLE"]]}
   IsCritical           : False
   IsEnd                : False
   MaxAttempts          : 0
   NextStep             : 
   OnFailure            : 
   Outputs              : {[InstanceStates, Amazon.Runtime.Internal.Util.AlwaysSendList`1[System.String]]}
   OverriddenParameters : {}
   Response             : 
   ResponseCode         : 
   StepExecutionId      : 8fcc9641-24b7-40b3-a9be-0123456789ab
   StepName             : stopInstances
   StepStatus           : Success
   TimeoutSeconds       : 0
   ValidNextSteps       : {startInstances}
   ```

------

1. 在完成所选运行手册中指定的所有步骤后，运行以下命令以完成自动化。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm stop-automation-execution \
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab \
       --type Complete
   ```

------
#### [ Windows ]

   ```
   aws ssm stop-automation-execution ^
       --automation-execution-id ba9cd881-1b36-4d31-a698-0123456789ab ^
       --type Complete
   ```

------
#### [ PowerShell ]

   ```
   Stop-SSMAutomationExecution `
       -AutomationExecutionId ba9cd881-1b36-4d31-a698-0123456789ab `
       -Type Complete
   ```

------

   如果此命令成功，则无任何输出。

# 使用 State Manager 关联调度自动化
<a name="scheduling-automations-state-manager-associations"></a>

您可以通过创建与运行手册的State Manager关联启动自动化。State Manager是 AWS Systems Manager 中的一项工具。通过创建与运行手册的 State Manager 关联，您可以将不同类型的 AWS 资源设置为目标。例如，您可以创建强制 AWS 资源进入预期状态的关联，包括：
+ 将 Systems Manager 角色附加到 Amazon Elastic Compute Cloud (Amazon EC2) 实例，以使其成为*托管实例*。
+ 对安全组强制实施所需的入口和出口规则。
+ 创建或删除 Amazon DynamoDB 备份。
+ 创建或删除 Amazon Elastic Block Store (Amazon EBS) 快照。
+ 关闭 Amazon Simple Storage Service (Amazon S3) 存储桶的读写权限。
+ 启动、重新启动或停止托管实例和 Amazon Relational Database Service (Amazon RDS) 实例。
+ 将修补程序应用到 Linux、macOS 和 Windows AMIs。

可以使用以下过程通过 AWS Systems Manager 控制台 和 AWS Command Line Interface (AWS CLI) 创建 State Manager 关联以运行自动化。有关关联的一般信息以及有关创建使用 SSM `Command` 文档或 `Policy` 文档的关联的信息，请参阅 [创建关联](state-manager-associations-creating.md)。

**开始前的准备工作**  
请注意以下重要详细信息，然后再使用 State Manager 运行自动化。
+ 您必须先验证是否已为 Automation（AWS Systems Manager 中的一项工具）配置权限，然后才能创建运行某个运行手册的关联。有关更多信息，请参阅 [设置自动化](automation-setup.md)。
+ 运行多个运行手册的 State Manager 关联将计入在您的 AWS 账户 中并发运行的自动化的最大数。一次最多可以运行 100 个并发自动化。有关信息，请参阅《Amazon Web Services 一般参考》**中的 [Systems Manager service quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。
+ 运行自动化时，State Manager 不记录自动化在 AWS CloudTrail 中发起的 API 操作。
+ Systems Manager 自动创建服务相关角色，以便 State Manager 有权调用 Systems Manager 自动化 API 操作。如果需要，您可以从 AWS CLI 或 AWS Tools for PowerShell 中运行以下命令以自行创建服务相关角色。

------
#### [ Linux & macOS ]

  ```
  aws iam create-service-linked-role \
  --aws-service-name ssm.amazonaws.com
  ```

------
#### [ Windows ]

  ```
  aws iam create-service-linked-role ^
  --aws-service-name ssm.amazonaws.com
  ```

------
#### [ PowerShell ]

  ```
  New-IAMServiceLinkedRole `
  -AWSServiceName ssm.amazonaws.com
  ```

------

  有关服务相关角色的更多信息，请参阅 [将服务关联角色用于 Systems Manager](using-service-linked-roles.md)。

## 创建运行自动化的关联（控制台）
<a name="create-automation-association-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台创建运行自动化的 State Manager 关联。

**创建 State Manager 关联以运行自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **State Manager**，然后选择**创建关联**。

1. 在**名称** 字段中指定名称。您可以自由选择，但我们建议您这样做。

1. 在**文档**列表中，选择运行手册。使用搜索栏来筛选 **Document type : Equal : Automation** 运行手册。使用搜索栏右侧的数字可查看更多运行手册。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 选择**简单执行**来通过指定一个或多个目标的资源 ID 在这些目标上运行自动化。选择**速率控制**可以通过指定设置目标选项（如标签或 AWS Resource Groups）来在 AWS 资源队列上运行自动化。您还可以通过指定并发和错误阈值来控制跨各个资源的自动化的执行。

   如果您选择**速率控制**，将显示**目标**部分。

1. 在**目标**部分中，选择一种设置资源目标的方法。

   1. （必需）在**参数** 列表中，选择一个参数。**参数**列表中的项目由此过程开始时选择的运行手册中的参数确定。通过选择参数，可以定义自动化运行的资源类型。

   1. （必需）在**目标**列表中，选择一种设置资源目标的方法。
      + **资源组**：从**资源组**列表中选择组的名称。有关在运行手册中将 AWS Resource Groups 设置为目标的更多信息，请参阅 [设置目标 AWS Resource Groups](running-automations-map-targets.md#target-resource-groups)。
      + **标签**：在提供的字段中输入标签键和标签值（可选）。选择**添加**。有关在运行手册中设置标签目标的更多信息，请参阅 [设置目标标签](running-automations-map-targets.md#target-tags)。
      + **参数值**：在**输入参数**部分输入值。如果指定多个值，Systems Manager 将在指定的每个值上运行子自动化。

        例如，假设运行手册包含 **InstanceID** 参数。如果在运行此自动化时将 **InstanceID** 参数值设置为目标，则 Systems Manager 会为指定的每个实例 ID 值运行一个子自动化。当自动化完成每个指定实例的运行或执行失败时，父自动化完成。您最多可以将 50 个参数值设置为目标。有关在运行手册中设置参数值目标的更多信息，请参阅 [设置目标参数值](running-automations-map-targets.md#target-parameter-values)。

1. 在**输入参数**部分，指定所需的输入参数。

   如果选择使用标签或资源组将资源设置为目标，则不需要选择**输入参数**部分中的某些选项。例如，如果选择 `AWS-RestartEC2Instance` 运行手册，并且选择使用标签将实例设置为目标，则无需在**输入参数**部分中指定或选择实例 ID。自动化使用您指定的标签查找要重新启动的实例。
**重要**  
您必须在 **AutomationAssumeRole** 字段中指定一个角色 ARN。State Manager 使用担任角色来调用运行手册中指定的 AWS 服务并代表您运行自动化关联。

1. 如果您希望定期运行关联，请在**指定计划**部分中，选择**按计划**。如果您选择此选项，则使用提供的选项使用 Cron 或 Rate 表达式创建计划。有关 State Manager 的 Cron 和 Rate 表达式的更多信息，请参阅 [适用于关联的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md#reference-cron-and-rate-expressions-association)。
**注意**  
Rate 表达式是运行多个运行手册的 State Manager 关联的首选计划机制。如果您达到了并发运行自动化的最大数，Rate 表达式会为运行关联提供更多灵活性。使用速率计划，Systems Manager 可以在收到并发自动化已达最大值并已被节流的通知后，立即重试自动化。

   如果您希望运行关联一次，请选择**无计划**。

1. （可选）在 **Rate Control**（速率控制）部分中，选择 **Concurrency**（并发）和 **Error threshold**（错误阈值）选项来控制跨各个 AWS 资源的自动化部署。

   1. 在**并发**部分中，选择一个选项：
      + 选择**目标**，以输入可同时运行自动化的目标的绝对数量。
      + 选择**百分比**，以输入可同时运行自动化的目标集的百分比。

   1. 在**错误阈值**部分中，选择一个选项：
      + 选择**错误**，以输入自动化停止将自动化发送到其他资源之前允许的错误绝对数量。
      + 选择**百分比**，以输入自动化停止将自动化发送到其他资源之前允许的错误的百分比。

   有关使用自动化的目标和速率控制的更多信息，请参阅 [大规模运行自动化操作](running-automations-scale.md)。

1. 选择**创建关联**。
**重要**  
在创建关联时，将针对指定目标立即运行关联。然后，关联基于您选择的 Cron 或 Rate 表达式运行。如果您选择了**无计划**，则关联不会再次运行。

## 创建关联以运行自动化（命令行）
<a name="create-automation-association-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows Server 上）或 AWS Tools for PowerShell 创建 State Manager 关联以运行自动化。

**开始前的准备工作**  
在您完成以下过程之前，请确保创建了包含运行运行手册所需权限的 IAM 服务角色，并为 Automation（AWS Systems Manager 中的一项工具）配置了信任关系。有关更多信息，请参阅 [任务 1：为自动化创建服务角色](automation-setup-iam.md#create-service-role)。

**创建关联以运行自动化**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 运行以下命令以查看文档列表。

------
#### [ Linux & macOS ]

   ```
   aws ssm list-documents
   ```

------
#### [ Windows ]

   ```
   aws ssm list-documents
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentList
   ```

------

   记下要用于关联的运行手册的名称。

1. 运行以下命令以查看有关运行手册的详细信息。在下面的命令中，将 *runbook name* 替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-document \
   --name runbook name
   ```

   记下要用于 `--automation-target-parameter-name` 选项的参数名称（例如 `InstanceId`）。此参数确定在其上运行自动化的资源的类型。

------
#### [ Windows ]

   ```
   aws ssm describe-document ^
   --name runbook name
   ```

   记下要用于 `--automation-target-parameter-name` 选项的参数名称（例如 `InstanceId`）。此参数确定在其上运行自动化的资源的类型。

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentDescription `
   -Name runbook name
   ```

   记下要用于 `AutomationTargetParameterName` 选项的参数名称（例如 `InstanceId`）。此参数确定在其上运行自动化的资源的类型。

------

1. 创建一个命令以使用 State Manager 关联运行自动化。将每个*示例资源占位符*替换为您自己的信息。

   *使用标签设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm create-association \
   --association-name association name \
   --targets Key=tag:key name,Values=value \
   --name runbook name \
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole \
   --automation-target-parameter-name target parameter \
   --schedule "cron or rate expression"
   ```

**注意**  
如果您使用 AWS CLI 创建关联，请使用 `--targets` 参数指定关联的目标实例。不要使用 `--instance-id` 参数。`--instance-id` 参数是一个旧参数。

------
#### [ Windows ]

   ```
   aws ssm create-association ^
   --association-name association name ^
   --targets Key=tag:key name,Values=value ^
   --name runbook name ^
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole ^
   --automation-target-parameter-name target parameter ^
   --schedule "cron or rate expression"
   ```

**注意**  
如果您使用 AWS CLI 创建关联，请使用 `--targets` 参数指定关联的目标实例。不要使用 `--instance-id` 参数。`--instance-id` 参数是一个旧参数。

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "tag:key name"
   $Targets.Values = "value"
   
   New-SSMAssociation `
   -AssociationName "association name" `
   -Target $Targets `
   -Name "runbook name" `
   -Parameters @{
   "AutomationAssumeRole"="arn:aws:iam::123456789012:role/RunbookAssumeRole" } `
   -AutomationTargetParameterName "target parameter" `
   -ScheduleExpression "cron or rate expression"
   ```

**注意**  
如果您使用 AWS Tools for PowerShell 创建关联，请使用 `Target` 参数指定关联的目标实例。不要使用 `InstanceId` 参数。`InstanceId` 参数是一个旧参数。

------

   *使用参数值设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm create-association \
   --association-name association name \
   --targets Key=ParameterValues,Values=value,value 2,value 3 \
   --name runbook name \
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole \
   --automation-target-parameter-name target parameter \
   --schedule "cron or rate expression"
   ```

------
#### [ Windows ]

   ```
   aws ssm create-association ^
   --association-name association name ^
   --targets Key=ParameterValues,Values=value,value 2,value 3 ^
   --name runbook name ^
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole ^
   --automation-target-parameter-name target parameter ^
   --schedule "cron or rate expression"
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "ParameterValues"
   $Targets.Values = "value","value 2","value 3"
   
   New-SSMAssociation `
   -AssociationName "association name" `
   -Target $Targets `
   -Name "runbook name" `
   -Parameters @{
   "AutomationAssumeRole"="arn:aws:iam::123456789012:role/RunbookAssumeRole"} `
   -AutomationTargetParameterName "target parameter" `
   -ScheduleExpression "cron or rate expression"
   ```

------

   *使用 AWS Resource Groups 设置目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm create-association \
   --association-name association name \
   --targets Key=ResourceGroup,Values=resource group name \
   --name runbook name \
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole \
   --automation-target-parameter-name target parameter \
   --schedule "cron or rate expression"
   ```

------
#### [ Windows ]

   ```
   aws ssm create-association ^
   --association-name association name ^
   --targets Key=ResourceGroup,Values=resource group name ^
   --name runbook name ^
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole ^
   --automation-target-parameter-name target parameter ^
   --schedule "cron or rate expression"
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "ResourceGroup"
   $Targets.Values = "resource group name"
   
   New-SSMAssociation `
   -AssociationName "association name" `
   -Target $Targets `
   -Name "runbook name" `
   -Parameters @{
   "AutomationAssumeRole"="arn:aws:iam::123456789012:role/RunbookAssumeRole"} `
   -AutomationTargetParameterName "target parameter" `
   -ScheduleExpression "cron or rate expression"
   ```

------

   *将多个账户和区域设置为目标*

------
#### [ Linux & macOS ]

   ```
   aws ssm create-association \
   --association-name association name \
   --targets Key=ResourceGroup,Values=resource group name \
   --name runbook name \
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole \
   --automation-target-parameter-name target parameter \
   --schedule "cron or rate expression" \ 
   --target-locations Accounts=111122223333,444455556666,444455556666,Regions=region,region
   ```

------
#### [ Windows ]

   ```
   aws ssm create-association ^
   --association-name association name ^
   --targets Key=ResourceGroup,Values=resource group name ^
   --name runbook name ^
   --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/RunbookAssumeRole ^
   --automation-target-parameter-name target parameter ^
   --schedule "cron or rate expression" ^ 
   --target-locations Accounts=111122223333,444455556666,444455556666,Regions=region,region
   ```

------
#### [ PowerShell ]

   ```
   $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target
   $Targets.Key = "ResourceGroup"
   $Targets.Values = "resource group name"
   
   New-SSMAssociation `
   -AssociationName "association name" `
   -Target $Targets `
   -Name "runbook name" `
   -Parameters @{
   "AutomationAssumeRole"="arn:aws:iam::123456789012:role/RunbookAssumeRole"} `
   -AutomationTargetParameterName "target parameter" `
   -ScheduleExpression "cron or rate expression" `
   -TargetLocations @{
       "Accounts"=["111122223333,444455556666,444455556666"],
       "Regions"=["region,region"]
   ```

------

   该命令返回新关联的详细信息，类似于以下内容。

------
#### [ Linux & macOS ]

   ```
   {
   "AssociationDescription": {
       "ScheduleExpression": "cron(0 7 ? * MON *)",
       "Name": "AWS-StartEC2Instance",
       "Parameters": {
           "AutomationAssumeRole": [
               "arn:aws:iam::123456789012:role/RunbookAssumeRole"
           ]
       },
       "Overview": {
           "Status": "Pending",
           "DetailedStatus": "Creating"
       },
       "AssociationId": "1450b4b7-bea2-4e4b-b340-01234EXAMPLE",
       "DocumentVersion": "$DEFAULT",
       "AutomationTargetParameterName": "InstanceId",
       "LastUpdateAssociationDate": 1564686638.498,
       "Date": 1564686638.498,
       "AssociationVersion": "1",
       "AssociationName": "CLI",
       "Targets": [
           {
               "Values": [
                   "DEV"
               ],
               "Key": "tag:ENV"
           }
       ]
   }
   }
   ```

------
#### [ Windows ]

   ```
   {
   "AssociationDescription": {
       "ScheduleExpression": "cron(0 7 ? * MON *)",
       "Name": "AWS-StartEC2Instance",
       "Parameters": {
           "AutomationAssumeRole": [
               "arn:aws:iam::123456789012:role/RunbookAssumeRole"
           ]
       },
       "Overview": {
           "Status": "Pending",
           "DetailedStatus": "Creating"
       },
       "AssociationId": "1450b4b7-bea2-4e4b-b340-01234EXAMPLE",
       "DocumentVersion": "$DEFAULT",
       "AutomationTargetParameterName": "InstanceId",
       "LastUpdateAssociationDate": 1564686638.498,
       "Date": 1564686638.498,
       "AssociationVersion": "1",
       "AssociationName": "CLI",
       "Targets": [
           {
               "Values": [
                   "DEV"
               ],
               "Key": "tag:ENV"
           }
       ]
   }
   }
   ```

------
#### [ PowerShell ]

   ```
   Name                  : AWS-StartEC2Instance
   InstanceId            : 
   Date                  : 8/1/2019 7:31:38 PM
   Status.Name           : 
   Status.Date           : 
   Status.Message        : 
   Status.AdditionalInfo :
   ```

------

**注意**  
如果使用标签在一个或多个目标实例上创建关联，然后从某一实例中删除标签，则该实例将不再运行该关联。该实例不再与 State Manager 文档关联。

## 对 State Manager 关联运行的自动化进行故障排除
<a name="troubleshooting-automation-associations"></a>

Systems Manager 自动化强制要求每个账户、每个区域最多有 100 个并发自动化和 1000 个排队自动化。如果使用运行手册的 State Manager 关联显示**已失败**状态和详细状态 **AutomationExecutionLimitExceeded**，则表明您的自动化可能已达到了限制。因此，Systems Manager 会限制自动化。要解决此问题，请执行以下操作：
+ 为关联使用不同的 Rate 或 Cron 表达式。例如，如果关联计划为每 30 分钟运行一次，则更改表达式，使其每小时或每两小时运行一次。
+ 删除状态为**待处理**的现有自动化。通过删除这些自动化，将清除当前队列。

# 使用维护窗口计划自动化
<a name="scheduling-automations-maintenance-windows"></a>

您可通过将运行手册配置为维护时段的注册任务来启动自动化。通过将运行手册注册为注册任务，维护时段将在计划维护期间内运行自动化。

例如，假设您创建了一个名为 `CreateAMI` 的运行手册，该运行手册创建了一个注册为维护时段目标的 Amazon Machine Image (AMI）实例。要指定 `CreateAMI` 运行手册（和对应的工作流程）作为维护时段内的注册任务，您首先要创建一个维护时段并注册目标。然后，使用以下过程将 `CreateAMI` 文档指定为维护时段内的注册任务。当维护时段在计划期间内启动时，系统将运行自动化并创建注册目标的 AMI。

有关创建自动化运行手册的信息，请参阅 [创建您自己的运行手册](automation-documents.md)。Automation 是 AWS Systems Manager 中的一项工具。

可以使用以下过程通过 AWS Systems Manager 控制台、AWS Command Line Interface (AWS CLI) 或 AWS Tools for Windows PowerShell 将自动化配置为维护时段的注册任务。

## 在维护时段中注册自动化任务（控制台）
<a name="register-automation-task-maintenance-window-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台将自动化配置为维护时段的注册任务。

**开始前的准备工作**  
在完成以下过程之前，您必须创建维护时段并注册至少一个目标。有关更多信息，请参阅以下流程：
+ [使用控制台创建维护时段](sysman-maintenance-create-mw.md).
+ [使用控制台为维护时段分配目标](sysman-maintenance-assign-targets.md)

**将自动化配置为维护时段的注册任务**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在左侧导航窗格中，选择 **Maintenance Windows**，然后选择您要向其注册自动化任务的维护时段。

1. 选择**操作**。然后选择**注册自动化任务**以使用运行手册在目标上运行您选择的自动化。

1. 对于**名称**，输入任务的名称。

1. 对于**说明**，输入说明。

1. 对于**文)**，选择定义要运行的任务的运行手册。

1. 对于**文档版本**，选择要使用的运行手册版本。

1. 对于**任务优先级**，选择一个优先级。`1` 是最高优先级。维护时段中的任务按优先级顺序计划，具有相同优先级的任务则并行计划。

1. 在**目标**部分，如果您选择的运行手册在资源上运行任务，则通过手动指定标签或选择实例来标识您要对其运行此自动化的目标。
**注意**  
如果要通过输入参数而不是目标传递资源，则无需指定维护时段目标。  
在许多情况下，您无需显式指定自动化任务的目标。例如，假设您要创建 自动化 类型的任务，以使用 `AWS-UpdateLinuxAmi` 运行手册为 Linux 更新 Amazon Machine Image (AMI)。在该任务运行时，已使用最新可用的 Linux 分发版本的程序包和 Amazon 软件更新了 AMI。从 AMI 创建的新实例已经安装了这些更新。由于在运行手册的输入参数中指定了要进行更新的 AMI 的 ID，无需在维护时段任务中再次指定目标。

   有关不需要目标的维护时段任务的信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

1. （可选）对于**速率控制**：
**注意**  
如果您正在运行的任务没有指定目标，则不需要指定速率控制。
   + 对于**并发**，指定要同时对其运行自动化的目标的数量或百分比。

     如果通过选择键值对选择了目标，但不确定有多少个目标使用所选标签，则可以通过指定百分比来限制可同时运行的自动化的数量。

     当维护时段运行时，每个目标将启动一个新的自动化。每个 AWS 账户 限制 100 个并发自动化。如果您指定的并发速率大于 100，会有 100 个以上的并发执行自动添加到执行队列。有关信息，请参阅《Amazon Web Services 一般参考》**中的 [Systems Manager service quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。
   + 对于**错误阈值**，指定此自动化在一定数量或百分比的目标上失败后何时停止在其他目标上运行这些工作流程。例如，如果您指定三个错误，在收到第四个错误时，Systems Manager 会停止运行自动化。仍在处理自动化的目标也可能发送错误。

1. 在**输入参数**部分中，为运行手册指定参数。对于运行手册，系统将自动填充某些值。您可以保留或更换这些值。
**重要**  
对于运行手册，您可以选择性地指定自动化担任角色。如果您不为此参数指定角色，那么自动化将担任您在步骤 11 中选择的维护时段服务角色。因此，您必须确保所选择的维护时段服务角色具有适当的 AWS Identity and Access Management (IAM) 权限来执行在运行手册中定义的操作。  
例如，Systems Manager 的服务相关角色没有 IAM 权限 `ec2:CreateSnapshot`，而这是运行运行手册 `AWS-CopySnapshot` 所必需的。在这种情况下，您必须使用自定义的维护时段服务角色或指定具有 `ec2:CreateSnapshot` 权限的 Automation 担任角色。有关信息，请参阅[设置自动化](automation-setup.md)。

1. 在 **IAM service role**（IAM 服务角色）区域中，选择一个角色以向 Systems Manager 提供启动自动化的权限。

   要为维护时段任务创建自定义服务角色，请参阅[设置 Maintenance Windows](setting-up-maintenance-windows.md)。

1. 选择**注册自动化任务**。

## 在维护时段中注册自动化任务（命令行）
<a name="register-automation-task-maintenance-window-cli"></a>

以下过程介绍了如何使用 AWS CLI（在 Linux 或 Windows Server 上）或 AWS Tools for PowerShell 将自动化配置为维护时段的注册任务。

**开始前的准备工作**  
在完成以下过程之前，您必须创建维护时段并注册至少一个目标。有关更多信息，请参阅以下流程：
+ [步骤 1：使用 AWS CLI 创建维护时段](mw-cli-tutorial-create-mw.md).
+ [步骤 2：使用 AWS CLI 将目标节点注册到维护时段](mw-cli-tutorial-targets.md)

**将自动化配置为维护时段的注册任务**

1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 创建一个命令以将自动化配置为维护时段的注册任务。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm register-task-with-maintenance-window \
   --window-id window ID \
   --name task name \
   --task-arn runbook name \
   --targets Key=targets,Values=value \
   --service-role-arn IAM role arn \
   --task-type AUTOMATION \
   --task-invocation-parameters task parameters \
   --priority task priority \
   --max-concurrency 10% \
   --max-errors 5
   ```

**注意**  
如果使用 AWS CLI 将自动化配置为注册任务，请使用 `--Task-Invocation-Parameters` 参数指定在任务运行时为其传递的参数。不要使用 `--Task-Parameters` 参数。`--Task-Parameters` 参数是一个旧参数。  
对于没有指定目标的维护时段任务，您无法为 `--max-errors` 和 `--max-concurrency` 提供值。作为替代方式，系统会插入一个占位符值 `1`，该值可能会在响应诸如 [https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html) 等命令时发出报告。这些值不影响任务的运行，可以忽略。  
有关不需要目标的维护时段任务的信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

------
#### [ Windows ]

   ```
   aws ssm register-task-with-maintenance-window ^
   --window-id window ID ^
   --name task name ^
   --task-arn runbook name ^
   --targets Key=targets,Values=value ^
   --service-role-arn IAM role arn ^
   --task-type AUTOMATION ^
   --task-invocation-parameters task parameters ^
   --priority task priority ^
   --max-concurrency 10% ^
   --max-errors 5
   ```

**注意**  
如果使用 AWS CLI 将自动化配置为注册任务，请使用 `--task-invocation-parameters` 参数指定在任务运行时为其传递的参数。不要使用 `--task-parameters` 参数。`--task-parameters` 参数是一个旧参数。  
对于没有指定目标的维护时段任务，您无法为 `--max-errors` 和 `--max-concurrency` 提供值。作为替代方式，系统会插入一个占位符值 `1`，该值可能会在响应诸如 [https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html) 等命令时发出报告。这些值不影响任务的运行，可以忽略。  
有关不需要目标的维护时段任务的信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

------
#### [ PowerShell ]

   ```
   Register-SSMTaskWithMaintenanceWindow `
   -WindowId window ID `
   -Name "task name" `
   -TaskArn "runbook name" `
   -Target @{ Key="targets";Values="value" } `
   -ServiceRoleArn "IAM role arn" `
   -TaskType "AUTOMATION" `
   -Automation_Parameter @{ "task parameter"="task parameter value"} `
   -Priority task priority `
   -MaxConcurrency 10% `
   -MaxError 5
   ```

**注意**  
如果使用 AWS Tools for PowerShell 将自动化配置为注册任务，请使用 `-Automation_Parameter` 参数指定在任务运行时为其传递的参数。不要使用 `-TaskParameters` 参数。`-TaskParameters` 参数是一个旧参数。  
对于没有指定目标的维护时段任务，您无法为 `-MaxError` 和 `-MaxConcurrency` 提供值。作为替代方式，系统会插入一个占位符值 1，该值可能会在响应诸如 `Get-SSMMaintenanceWindowTaskList` 和 `Get-SSMMaintenanceWindowTask` 等命令时发出报告。这些值不影响任务的运行，可以忽略。  
有关不需要目标的维护时段任务的信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

------

   以下示例将自动化配置为具有优先级 1 的维护时段注册任务。它还演示了省略 `--targets`、`--max-errors` 和 `--max-concurrency` 选项以执行无目标维护时段任务。自动化使用 `AWS-StartEC2Instance` 文档和指定的自动化担任角色启动在维护时段中注册为目标的 EC2 实例。在任何给定时间，维护时段最多在 5 个实例上同时运行自动化。此外，如果错误计数超过 1，注册任务将以特定执行间隔在更多实例上停止运行。

------
#### [ Linux & macOS ]

   ```
   aws ssm register-task-with-maintenance-window \
   --window-id mw-0c50858d01EXAMPLE \
   --name StartEC2Instances \
   --task-arn AWS-StartEC2Instance \
   --service-role-arn arn:aws:iam::123456789012:role/MaintenanceWindowRole \
   --task-type AUTOMATION \
   --task-invocation-parameters "{\"Automation\":{\"Parameters\":{\"InstanceId\":[\"{{TARGET_ID}}\"],\"AutomationAssumeRole\":[\"arn:aws:iam::123456789012:role/AutomationAssumeRole\"]}}}" \
   --priority 1
   ```

------
#### [ Windows ]

   ```
   aws ssm register-task-with-maintenance-window ^
   --window-id mw-0c50858d01EXAMPLE ^
   --name StartEC2Instances ^
   --task-arn AWS-StartEC2Instance ^
   --service-role-arn arn:aws:iam::123456789012:role/MaintenanceWindowRole ^
   --task-type AUTOMATION ^
   --task-invocation-parameters "{\"Automation\":{\"Parameters\":{\"InstanceId\":[\"{{TARGET_ID}}\"],\"AutomationAssumeRole\":[\"arn:aws:iam::123456789012:role/AutomationAssumeRole\"]}}}" ^
   --priority 1
   ```

------
#### [ PowerShell ]

   ```
   Register-SSMTaskWithMaintenanceWindow `
   -WindowId mw-0c50858d01EXAMPLE `
   -Name "StartEC2" `
   -TaskArn "AWS-StartEC2Instance" `
   -ServiceRoleArn "arn:aws:iam::123456789012:role/MaintenanceWindowRole" `
   -TaskType "AUTOMATION" `
   -Automation_Parameter @{ "InstanceId"="{{TARGET_ID}}";"AutomationAssumeRole"="arn:aws:iam::123456789012:role/AutomationAssumeRole" } `
   -Priority 1
   ```

------

   该命令返回新的注册任务的详细信息，类似于以下内容。

------
#### [ Linux & macOS ]

   ```
   {
   "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE"
   }
   ```

------
#### [ Windows ]

   ```
   {
   "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE"
   }
   ```

------
#### [ PowerShell ]

   ```
   4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

------

1. 要查看注册的任务，请运行以下命令。将 *maintenance windows ID* 替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-tasks \
   --window-id maintenance window ID
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-tasks ^
   --window-id maintenance window ID
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMMaintenanceWindowTaskList `
   -WindowId maintenance window ID
   ```

------

   系统将返回类似于以下内容的信息。

------
#### [ Linux & macOS ]

   ```
   {
   "Tasks": [
       {
           "ServiceRoleArn": "arn:aws:iam::123456789012:role/MaintenanceWindowRole",
           "MaxErrors": "1",
           "TaskArn": "AWS-StartEC2Instance",
           "MaxConcurrency": "1",
           "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
           "TaskParameters": {},
           "Priority": 1,
           "WindowId": "mw-0c50858d01EXAMPLE",
           "Type": "AUTOMATION",
           "Targets": [
           ],
           "Name": "StartEC2"
       }
   ]
   }
   ```

------
#### [ Windows ]

   ```
   {
   "Tasks": [
       {
           "ServiceRoleArn": "arn:aws:iam::123456789012:role/MaintenanceWindowRole",
           "MaxErrors": "1",
           "TaskArn": "AWS-StartEC2Instance",
           "MaxConcurrency": "1",
           "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
           "TaskParameters": {},
           "Priority": 1,
           "WindowId": "mw-0c50858d01EXAMPLE",
           "Type": "AUTOMATION",
           "Targets": [
           ],
           "Name": "StartEC2"
       }
   ]
   }
   ```

------
#### [ PowerShell ]

   ```
   Description    : 
   LoggingInfo    : 
   MaxConcurrency : 5
   MaxErrors      : 1
   Name           : StartEC2
   Priority       : 1
   ServiceRoleArn : arn:aws:iam::123456789012:role/MaintenanceWindowRole
   Targets        : {}
   TaskArn        : AWS-StartEC2Instance
   TaskParameters : {}
   Type           : AUTOMATION
   WindowId       : mw-0c50858d01EXAMPLE
   WindowTaskId   : 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

------

# Systems Manager 自动化操作参考
<a name="automation-actions"></a>

此参考介绍可在自动化运行手册中指定的自动化操作。Automation 是 AWS Systems Manager 中的一项工具。这些操作不能用于其他类型的 Systems Manager (SSM) 文档。有关其他 SSM 文档类型插件的信息，请参阅 [命令文档插件参考](documents-command-ssm-plugin-reference.md)。

Systems Manager 自动化会运行自动化运行手册中定义的步骤。每个步骤都与特定操作关联。此操作确定本步的输入、行为和输出。在运行手册的 `mainSteps` 部分定义步骤。

您无需指定操作或步骤的输出。由与本步关联的操作预先确定输出。当您在运行手册中指定步骤输入时，可以引用前面某步中的一个或多个输出。例如，您可以使 `aws:runInstances` 的输出可用于后续的 `aws:runCommand` 操作。还可以在运行手册的 `Output` 部分引用前面步骤中的输出。

**重要**  
如果您运行使用 AWS Identity and Access Management (IAM) 服务角色调用其他服务的自动化工作流程，请注意必须使用权限将该服务角色配置为调用这些服务。该要求适用于所有 AWS 自动化运行手册（`AWS-*` 运行手册），例如 `AWS-ConfigureS3BucketLogging`、`AWS-CreateDynamoDBBackup` 和 `AWS-RestartEC2Instance` 运行手册等。对于您创建的任何自定义自动化运行手册，如果这些文档使用调用其他服务的操作来调用其他 AWS 服务，则此要求同样适用。例如，如果使用 `aws:executeAwsApi`、`aws:createStack` 或 `aws:copyImage` 操作，则您必须配置具有权限的服务角色来调用这些服务。您可以将 IAM 内联策略添加到该角色，从而向其他 AWS 服务授予权限。有关更多信息，请参阅 [（可选）添加自动化内联策略或客户管理型策略来调用其他 AWS 服务](automation-setup-iam.md#add-inline-policy)。

**Topics**
+ [所有操作共享的属性](#automation-common)
+ [`aws:approve` – 暂停自动化以进行手动批准](automation-action-approve.md)
+ [`aws:assertAwsResourceProperty` - 断言 AWS 资源状态或事件状态](automation-action-assertAwsResourceProperty.md)
+ [`aws:branch` – 运行条件自动化步骤](automation-action-branch.md)
+ [`aws:changeInstanceState` – 更改或声明实例状态](automation-action-changestate.md)
+ [`aws:copyImage` – 复制或加密Amazon Machine Image](automation-action-copyimage.md)
+ [`aws:createImage` – 创建亚马逊机器映像](automation-action-create.md)
+ [`aws:createStack` – 创建 CloudFormation 堆栈。](automation-action-createstack.md)
+ [`aws:createTags` - 为 AWS 资源创建标签](automation-action-createtag.md)
+ [`aws:deleteImage` – 删除亚马逊机器映像](automation-action-delete.md)
+ [`aws:deleteStack` - 删除 CloudFormation 堆栈。](automation-action-deletestack.md)
+ [`aws:executeAutomation` - 运行另一个自动化](automation-action-executeAutomation.md)
+ [`aws:executeAwsApi` - 调用并运行 AWS API 操作](automation-action-executeAwsApi.md)
+ [`aws:executeScript` - 运行脚本](automation-action-executeScript.md)
+ [`aws:executeStateMachine` - 运行 AWS Step Functions 状态机。](automation-action-executeStateMachine.md)
+ [`aws:invokeWebhook` – 调用 Automation Webhook 集成](invoke-webhook.md)
+ [`aws:invokeLambdaFunction` – 调用 AWS Lambda 函数](automation-action-lamb.md)
+ [`aws:loop` – 迭代自动化中的步骤](automation-action-loop.md)
+ [`aws:pause` - 暂停自动化](automation-action-pause.md)
+ [`aws:runCommand` - 在托管实例上运行命令](automation-action-runcommand.md)
+ [`aws:runInstances` – 启动 Amazon EC2 实例](automation-action-runinstance.md)
+ [`aws:sleep` - 延迟自动化](automation-action-sleep.md)
+ [`aws:updateVariable` – 更新运行手册变量的值](automation-action-update-variable.md)
+ [`aws:waitForAwsResourceProperty` - 等待 AWS 资源属性](automation-action-waitForAwsResourceProperty.md)
+ [自动化系统变量](automation-variables.md)

## 所有操作共享的属性
<a name="automation-common"></a>

通用属性是位于所有操作中的参数或选项。一些选项定义了步骤的行为，例如，等待步骤完成的时间以及在步骤失败时采取的措施。以下属性是所有操作的通用属性。

[description](#descriptProp)  
您提供的描述运行手册或步骤目的的信息。  
类型：字符串  
必需：否

[name](#nameProp)  
在运行手册的所有步骤名称中必须唯一的标识符。  
类型：字符串  
允许的模式：[a-zA-Z0-9\$1]\$1\$1  
必需：是

[action](#actProp)  
步骤要运行的操作的名称。[`aws:runCommand` - 在托管实例上运行命令](automation-action-runcommand.md) 是可在此处指定的操作的示例。本文档提供有关所有可用操作的详细信息。  
类型：字符串  
必需：是

[maxAttempts](#maxProp)  
在发生故障的情况下应重试步骤的次数。如果值大于 1，则直到所有重试尝试失败后，才会将此步骤视为失败。默认值是 1。  
类型：整数  
必需：否

[timeoutSeconds](#timeProp)  
步骤的超时值。如果超时并且 `maxAttempts` 的值大于 1，则本步未考虑超时，直至已尝试所有重试。  
类型：整数  
必需：否

[onFailure](#failProp)  
指示自动化在失败时是应停止、继续还是转到其他步骤。该选项的默认值为 abort。  
类型：字符串  
有效值：Abort \$1 Continue \$1 step:*step\$1name*  
必需：否

[onCancel](#canProp)  
指示在用户取消自动化时，自动化应该转到哪个步骤。自动化将最多运行两分钟的取消工作流程。  
类型：字符串  
有效值：Abort \$1 step:*step\$1name*  
必需：否  
`onCancel` 属性不支持移动到以下操作：  
+ `aws:approve`
+ `aws:copyImage`
+ `aws:createImage`
+ `aws:createStack`
+ `aws:createTags`
+ `aws:loop`
+ `aws:pause`
+ `aws:runInstances`
+ `aws:sleep`

[isEnd](#endProp)  
此选项在特定步骤结束时停止自动化。如果步骤失败或成功，自动化执行将停止。默认值为 False。  
类型：布尔值  
有效值：true \$1 false  
必需：否

[nextStep](#nextProp)  
指定在成功完成自动化中的一个步骤后，接下来处理哪个步骤。  
类型：字符串  
必需：否

[isCritical](#critProp)  
将一个步骤指定为成功完成自动化的关键步骤。如果具有此分派的步骤失败，自动化会将自动化的最终状态报告为失败。仅当您在步骤中明确定义此属性时，才会计算该属性。如果 `onFailure` 属性在某个步骤中设定为 `Continue`，则此值默认为 False。否则，该选项的默认值为 True。  
类型：布尔值  
有效值：true \$1 false  
必需：否

[inputs](#inProp)  
特定于操作的属性。  
类型：映射  
必需：是

### 示例
<a name="automation-demo"></a>

```
---
description: "Custom Automation Example"
schemaVersion: '0.3'
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  AutomationAssumeRole:
    type: String
    description: "(Required) The ARN of the role that allows Automation to perform
      the actions on your behalf. If no role is specified, Systems Manager Automation
      uses your IAM permissions to run this runbook."
    default: ''
  InstanceId:
      type: String
      description: "(Required) The Instance Id whose root EBS volume you want to restore the latest Snapshot."
      default: ''
mainSteps:
- name: getInstanceDetails
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: DescribeInstances
    InstanceIds:
    - "{{ InstanceId }}"
  outputs:
    - Name: availabilityZone
      Selector: "$.Reservations[0].Instances[0].Placement.AvailabilityZone"
      Type: String
    - Name: rootDeviceName
      Selector: "$.Reservations[0].Instances[0].RootDeviceName"
      Type: String
  nextStep: getRootVolumeId
- name: getRootVolumeId
  action: aws:executeAwsApi
  maxAttempts: 3
  onFailure: Abort
  inputs:
    Service: ec2
    Api: DescribeVolumes
    Filters:
    -  Name: attachment.device
       Values: ["{{ getInstanceDetails.rootDeviceName }}"]
    -  Name: attachment.instance-id
       Values: ["{{ InstanceId }}"]
  outputs:
    - Name: rootVolumeId
      Selector: "$.Volumes[0].VolumeId"
      Type: String
  nextStep: getSnapshotsByStartTime
- name: getSnapshotsByStartTime
  action: aws:executeScript
  timeoutSeconds: 45
  onFailure: Abort
  inputs:
    Runtime: python3.8
    Handler: getSnapshotsByStartTime
    InputPayload:
      rootVolumeId : "{{ getRootVolumeId.rootVolumeId }}"
    Script: |-
      def getSnapshotsByStartTime(events,context):
        import boto3

        #Initialize client
        ec2 = boto3.client('ec2')
        rootVolumeId = events['rootVolumeId']
        snapshotsQuery = ec2.describe_snapshots(
          Filters=[
            {
              "Name": "volume-id",
              "Values": [rootVolumeId]
            }
          ]
        )
        if not snapshotsQuery['Snapshots']:
          noSnapshotFoundString = "NoSnapshotFound"
          return { 'noSnapshotFound' : noSnapshotFoundString }
        else:
          jsonSnapshots = snapshotsQuery['Snapshots']
          sortedSnapshots = sorted(jsonSnapshots, key=lambda k: k['StartTime'], reverse=True)
          latestSortedSnapshotId = sortedSnapshots[0]['SnapshotId']
          return { 'latestSnapshotId' : latestSortedSnapshotId }
  outputs:
  - Name: Payload
    Selector: $.Payload
    Type: StringMap
  - Name: latestSnapshotId
    Selector: $.Payload.latestSnapshotId
    Type: String
  - Name: noSnapshotFound
    Selector: $.Payload.noSnapshotFound
    Type: String 
  nextStep: branchFromResults
- name: branchFromResults
  action: aws:branch
  onFailure: Abort
  onCancel: step:startInstance
  inputs:
    Choices:
    - NextStep: createNewRootVolumeFromSnapshot
      Not:
        Variable: "{{ getSnapshotsByStartTime.noSnapshotFound }}"
        StringEquals: "NoSnapshotFound"
  isEnd: true
- name: createNewRootVolumeFromSnapshot
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: CreateVolume
    AvailabilityZone: "{{ getInstanceDetails.availabilityZone }}"
    SnapshotId: "{{ getSnapshotsByStartTime.latestSnapshotId }}"
  outputs:
    - Name: newRootVolumeId
      Selector: "$.VolumeId"
      Type: String
  nextStep: stopInstance
- name: stopInstance
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: StopInstances
    InstanceIds:
    - "{{ InstanceId }}"
  nextStep: verifyVolumeAvailability
- name: verifyVolumeAvailability
  action: aws:waitForAwsResourceProperty
  timeoutSeconds: 120
  inputs:
    Service: ec2
    Api: DescribeVolumes
    VolumeIds:
    - "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
    PropertySelector: "$.Volumes[0].State"
    DesiredValues:
    - "available"
  nextStep: verifyInstanceStopped
- name: verifyInstanceStopped
  action: aws:waitForAwsResourceProperty
  timeoutSeconds: 120
  inputs:
    Service: ec2
    Api: DescribeInstances
    InstanceIds:
    - "{{ InstanceId }}"
    PropertySelector: "$.Reservations[0].Instances[0].State.Name"
    DesiredValues:
    - "stopped"
  nextStep: detachRootVolume
- name: detachRootVolume
  action: aws:executeAwsApi
  onFailure: Abort
  isCritical: true
  inputs:
    Service: ec2
    Api: DetachVolume
    VolumeId: "{{ getRootVolumeId.rootVolumeId }}"
  nextStep: verifyRootVolumeDetached
- name: verifyRootVolumeDetached
  action: aws:waitForAwsResourceProperty
  timeoutSeconds: 30
  inputs:
    Service: ec2
    Api: DescribeVolumes
    VolumeIds:
    - "{{ getRootVolumeId.rootVolumeId }}"
    PropertySelector: "$.Volumes[0].State"
    DesiredValues:
    - "available"
  nextStep: attachNewRootVolume
- name: attachNewRootVolume
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: AttachVolume
    Device: "{{ getInstanceDetails.rootDeviceName }}"
    InstanceId: "{{ InstanceId }}"
    VolumeId: "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
  nextStep: verifyNewRootVolumeAttached
- name: verifyNewRootVolumeAttached
  action: aws:waitForAwsResourceProperty
  timeoutSeconds: 30
  inputs:
    Service: ec2
    Api: DescribeVolumes
    VolumeIds:
    - "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
    PropertySelector: "$.Volumes[0].Attachments[0].State"
    DesiredValues:
    - "attached"
  nextStep: startInstance
- name: startInstance
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: StartInstances
    InstanceIds:
    - "{{ InstanceId }}"
```

# `aws:approve` – 暂停自动化以进行手动批准
<a name="automation-action-approve"></a>

临时暂停自动化，直至指定委托人批准或拒绝操作。在达到所需批准数后，自动化执行将恢复。您可以将批准步骤插入到运行手册的 `mainSteps` 部分。

**注意**  
此操作并不支持多账户和区域自动化。此操作的默认超时时间为 7 天（604800 秒），最长时间为 30 天（2592000 秒）。您可以通过指定 `aws:approve` 步骤的 `timeoutSeconds` 参数来限制或延长超时。

在以下示例中，`aws:approve` 操作临时暂停自动化，直至一个审批者接受或拒绝自动化。批准后，此自动化将运行简单的 PowerShell 命令。

------
#### [ YAML ]

```
---
description: RunInstancesDemo1
schemaVersion: '0.3'
assumeRole: "{{ assumeRole }}"
parameters:
  assumeRole:
    type: String
  message:
    type: String
mainSteps:
- name: approve
  action: aws:approve
  timeoutSeconds: 1000
  onFailure: Abort
  inputs:
    NotificationArn: arn:aws:sns:us-east-2:12345678901:AutomationApproval
    Message: "{{ message }}"
    MinRequiredApprovals: 1
    Approvers:
    - arn:aws:iam::12345678901:user/AWS-User-1
- name: run
  action: aws:runCommand
  inputs:
    InstanceIds:
    - i-1a2b3c4d5e6f7g
    DocumentName: AWS-RunPowerShellScript
    Parameters:
      commands:
      - date
```

------
#### [ JSON ]

```
{
   "description":"RunInstancesDemo1",
   "schemaVersion":"0.3",
   "assumeRole":"{{ assumeRole }}",
   "parameters":{
      "assumeRole":{
         "type":"String"
      },
      "message":{
         "type":"String"
      }
   },
   "mainSteps":[
      {
         "name":"approve",
         "action":"aws:approve",
         "timeoutSeconds":1000,
         "onFailure":"Abort",
         "inputs":{
            "NotificationArn":"arn:aws:sns:us-east-2:12345678901:AutomationApproval",
            "Message":"{{ message }}",
            "MinRequiredApprovals":1,
            "Approvers":[
               "arn:aws:iam::12345678901:user/AWS-User-1"
            ]
         }
      },
      {
         "name":"run",
         "action":"aws:runCommand",
         "inputs":{
            "InstanceIds":[
               "i-1a2b3c4d5e6f7g"
            ],
            "DocumentName":"AWS-RunPowerShellScript",
            "Parameters":{
               "commands":[
                  "date"
               ]
            }
         }
      }
   ]
}
```

------

您可以在控制台中批准或拒绝等待批准的自动化。

**批准或拒绝等待的自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择状态为**正在等待**的自动化旁边的选项。  
![\[访问批准/拒绝自动化页面\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/automation-approve-action-aws.png)

1. 选择**批准/拒绝**。

1. 查看自动化的详细信息。

1. 选择**批准**或**拒绝**，键入评论（可选），然后选择**提交**。

**输入示例**

------
#### [ YAML ]

```
NotificationArn: arn:aws:sns:us-west-1:12345678901:Automation-ApprovalRequest
Message: Please approve this step of the Automation.
MinRequiredApprovals: 3
Approvers:
- IamUser1
- IamUser2
- arn:aws:iam::12345678901:user/IamUser3
- arn:aws:iam::12345678901:role/IamRole
```

------
#### [ JSON ]

```
{
   "NotificationArn":"arn:aws:sns:us-west-1:12345678901:Automation-ApprovalRequest",
   "Message":"Please approve this step of the Automation.",
   "MinRequiredApprovals":3,
   "Approvers":[
      "IamUser1",
      "IamUser2",
      "arn:aws:iam::12345678901:user/IamUser3",
      "arn:aws:iam::12345678901:role/IamRole"
   ]
}
```

------

NotificationArn  
用于批准自动化的 Amazon Resource Name (即 ARN，属于 Amazon Simple Notification Service (Amazon SNS)) 的主题。当您在运行手册中指定 `aws:approve` 步骤时，自动化 将向此主题发送消息，以让委托人知道必须批准或拒绝自动化步骤。Amazon SNS 主题的标题必须使用前缀“自动化”。  
类型：字符串  
必需：否

消息  
发送批准请求时要包含在 Amazon SNS 主题中的信息。最大消息长度为 4096 个字符。  
类型：字符串  
必需：否

MinRequiredApprovals  
恢复自动化所需的最小批准数。如果您未指定值，系统将默认为 1。此参数的值必须为正数。此参数的值不能超过 `Approvers` 参数定义的审批者数。  
类型：整数  
必需：否

Approvers  
能够批准或拒绝操作的经 AWS 身份验证的委托人的列表。最大审批者数量为 10。您可使用以下任意格式指定委托人：  
+ 一个用户名称
+ 用户 ARN
+ IAM 角色 ARN
+ IAM 担任角色 ARN
类型：StringList  
是否必需：是

EnhancedApprovals  
此输入仅用于 Change Manager 模板。能够批准或拒绝操作的经过 AWS 身份验证的主体、IAM 主体的类型以及最少批准者数量的列表。以下是示例：  

```
schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
    - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 604800
    inputs:
        Message: Please approve this change request
        MinRequiredApprovals: 3
        EnhancedApprovals:
        Approvers:
            - approver: John Stiles
            type: IamUser
            minRequiredApprovals: 0
            - approver: Ana Carolina Silva
            type: IamUser
            minRequiredApprovals: 0
            - approver: GroupOfThree
            type: IamGroup
            minRequiredApprovals: 0
            - approver: RoleOfTen
            type: IamRole
            minRequiredApprovals: 0
```
类型：StringList  
是否必需：是

**输出**

ApprovalStatus  
步骤的批准状态。状态可以为下列状态之一：已批准、已拒绝或正在等待。“正在等待”意味着自动化正在等待来自审批者的输入。  
类型：字符串

ApproverDecisions  
包括每位审批者的批准决定的 JSON 映射。  
类型：MapList

# `aws:assertAwsResourceProperty` - 断言 AWS 资源状态或事件状态
<a name="automation-action-assertAwsResourceProperty"></a>

`aws:assertAwsResourceProperty` 操作可用于对特定自动化步骤的资源状态或事件状态进行断言。

**注意**  
`aws:assertAwsResourceProperty` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

有关如何使用此操作的更多示例，请参阅 [其他运行手册示例](automation-document-examples.md)。

**Input**  
由您选择的 API 操作定义的输入。

------
#### [ YAML ]

```
action: aws:assertAwsResourceProperty
inputs:
  Service: The official namespace of the service
  Api: The API operation or method name
  API operation inputs or parameters: A value
  PropertySelector: Response object
  DesiredValues:
  - Desired property values
```

------
#### [ JSON ]

```
{
  "action": "aws:assertAwsResourceProperty",
  "inputs": {
    "Service":"The official namespace of the service",
    "Api":"The API operation or method name",
    "API operation inputs or parameters":"A value",
    "PropertySelector": "Response object",
    "DesiredValues": [
      "Desired property values"
    ]
  }
}
```

------

服务  
包含要运行的 API 操作的 AWS 服务命名空间。例如，Systems Manager 的命名空间为 `ssm`。Amazon EC2 的命名空间为 `ec2`。您可以在《AWS CLI 命令参考》的[可用服务](https://docs.aws.amazon.com/cli/latest/reference/#available-services)部分查看支持的 AWS 服务命名空间列表。  
类型：字符串  
是否必需：是

API  
要运行的 API 操作的名称。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看 API 操作（也称为方法）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon Relational Database Service (Amazon RDS) 的所有 API 操作（方法）。  
类型：字符串  
是否必需：是

API 操作输入  
一个或多个 API 操作输入。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看可用的输入（也称为参数）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法。选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法并向下滚动以查看可用的参数，例如 **DBInstanceIdentifier**、**Name** 和 **Values**。使用以下格式指定多个输入。  

```
inputs:
  Service: The official namespace of the service
  Api: The API operation name
  API input 1: A value
  API Input 2: A value
  API Input 3: A value
```

```
"inputs":{
      "Service":"The official namespace of the service",
      "Api":"The API operation name",
      "API input 1":"A value",
      "API Input 2":"A value",
      "API Input 3":"A value"
}
```
类型：由选择的 API 操作决定  
是否必需：是

PropertySelector  
响应对象中特定属性的 JSONPath。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看响应对象。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法：选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法，然后向下滚动到**响应结构**部分。**DBInstances** 被列为响应对象。  
类型：字符串  
是否必需：是

DesiredValues  
要继续自动化的预期状态。如果指定布尔值，则必须使用大写字母，例如 True 或 False。  
类型：StringList  
是否必需：是

# `aws:branch` – 运行条件自动化步骤
<a name="automation-action-branch"></a>

`aws:branch` 操作让您能够创建一个动态自动化，该自动化在一个步骤中评估不同选择，然后根据评估结果跳转到运行手册中的另一个步骤。

在为步骤指定 `aws:branch` 操作时，请指定自动化必须评估的 `Choices`。`Choices` 可以基于您在运行手册的 `Parameters` 部分中指定的值，也可以基于上一步的输出生成的动态值。自动化使用布尔表达式评估每个选择。如果第一个选择为真，则自动化跳转到为此选择指定的步骤。如果第一个选择为假，则自动化评估下一个选择。自动化继续评估每个选择，直到遇到结果为真的选择。然后，自动化跳转到为结果为真的选择指定的步骤。

如果所有选择都为假，则自动化检查该步骤是否包含 `default` 值。默认值定义当所有选择都为假时自动化应跳转到的步骤。如果没有为该步骤指定 `default` 值，则自动化处理运行手册中的下一个步骤。

`aws:branch` 操作通过组合使用 `And`、`Not` 和 `Or` 运算符来支持复杂的选择评估。有关如何使用 `aws:branch` 的更多信息，包括使用不同运算符的示例运行手册和示例，请参阅 [在运行手册中使用条件语句](automation-branch-condition.md)。

**Input**  
在步骤中指定一个或多个 `Choices`。`Choices` 可以基于您在运行手册的 `Parameters` 部分中指定的值，也可以基于上一步的输出生成的动态值。下面是一个评估参数的 YAML 示例。

```
mainSteps:
- name: chooseOS
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runWindowsCommand
      Variable: "{{Name of a parameter defined in the Parameters section. For example: OS_name}}"
      StringEquals: windows
    - NextStep: runLinuxCommand
      Variable: "{{Name of a parameter defined in the Parameters section. For example: OS_name}}"
      StringEquals: linux
    Default:
      sleep3
```

下面是一个评估上一步输出的 YAML 示例。

```
mainSteps:
- name: chooseOS
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runPowerShellCommand
      Variable: "{{Name of a response object. For example: GetInstance.platform}}"
      StringEquals: Windows
    - NextStep: runShellCommand
      Variable: "{{Name of a response object. For example: GetInstance.platform}}"
      StringEquals: Linux
    Default:
      sleep3
```

Choices  
自动化 在确定下一个要处理的步骤时应评估的一个或多个表达式。通过使用布尔表达式对选择进行评估。每个选择都必须定义以下选项：  
+ **NextStep**：当指定的选择为真时，要处理的运行手册中的下一个步骤。
+ **变量**：指定在运行手册的 `Parameters` 部分中定义的参数名称。或指定来自运行手册中上一步的输出对象。有关为 `aws:branch` 创建变量的更多信息，请参阅 [关于创建输出变量](automation-branch-condition.md#branch-action-output)。
+ **运算**：用于评估选择的标准。`aws:branch` 操作支持以下运算：

**字符串运算**
  + 字符串等于
  + EqualsIgnoreCase
  + StartsWith
  + EndsWith
  + 包含

**数值运算**
  + NumericEquals
  + NumericGreater
  + NumericLesser
  + NumericGreaterOrEquals
  + NumericLesser
  + NumericLesserOrEquals

**布尔运算**
  + BooleanEquals
**重要**  
创建运行手册时，系统将验证运行手册中的每个操作。在尝试创建运行手册时，如果某个操作不受支持，系统会返回错误。

默认  
当所有 `Choices` 都为假时，自动化应跳转到的步骤的名称。  
类型：字符串  
必需：否

**注意**  
`aws:branch` 操作支持 `And`、`Or` 和 `Not` 运算符。有关使用运算符的 `aws:branch` 的示例，请参阅 [在运行手册中使用条件语句](automation-branch-condition.md)。

# `aws:changeInstanceState` – 更改或声明实例状态
<a name="automation-action-changestate"></a>

更改或断言实例的状态。

此操作可在断言模式下使用（不要运行 API 来更改状态，而应验证实例是否处于预期状态。) 要使用断言模式，请将 `CheckStateOnly` 参数设置为 True。在 Windows Server 上运行 Sysprep 命令时，此模式很有用。该命令是一种可在后台长时间运行的异步命令。您可以确保在创建 Amazon Machine Image (AMI) 之前停止实例。

**注意**  
此操作的默认超时值为 3600 秒（1 小时）。您可以通过指定 `aws:changeInstanceState` 步骤的 `timeoutSeconds` 参数来限制或延长超时。

**注意**  
`aws:changeInstanceState` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**输入**

------
#### [ YAML ]

```
name: stopMyInstance
action: aws:changeInstanceState
maxAttempts: 3
timeoutSeconds: 3600
onFailure: Abort
inputs:
  InstanceIds:
  - i-1234567890abcdef0
  CheckStateOnly: true
  DesiredState: stopped
```

------
#### [ JSON ]

```
{
    "name":"stopMyInstance",
    "action": "aws:changeInstanceState",
    "maxAttempts": 3,
    "timeoutSeconds": 3600,
    "onFailure": "Abort",
    "inputs": {
        "InstanceIds": ["i-1234567890abcdef0"],
        "CheckStateOnly": true,
        "DesiredState": "stopped"
    }
}
```

------

InstanceIds  
实例的 ID。  
类型：StringList  
是否必需：是

CheckStateOnly  
如果为 false，请将实例状态设置为预期状态。如果为 true，请使用轮询断言预期状态。  
默认值：`false`  
类型：布尔值  
必需：否

DesiredState  
预期状态。设置为 `running` 时，此操作在完成之前等待 Amazon EC2 的状态变为 `Running`、实例状态变为 `OK`、系统状态变为 `OK`。  
类型：字符串  
有效值：`running` \$1`stopped` \$1`terminated`  
是否必需：是

Force  
如果设置此项，则强制停止实例。则该实例没有机会来刷新文件系统缓存或文件系统元数据。如果您使用此选项，则必须执行文件系统检查和修复流程。我们不建议将该选项用于 Windows Server 的 EC2 实例。  
类型：布尔值  
必需：否

AdditionalInfo  
预留。  
类型：字符串  
必需：否

**Output**  
无

# `aws:copyImage` – 复制或加密Amazon Machine Image
<a name="automation-action-copyimage"></a>

将 Amazon Machine Image (AMI) 从任何 AWS 区域 复制到当前区域中。此操作还可以对新的 AMI 进行加密。

**注意**  
`aws:copyImage` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作支持大多数 `CopyImage` 参数。有关更多信息，请参阅 [CopyImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CopyImage.html)。

以下示例是在首尔地区创建 AMI 的副本（`SourceImageID`：ami-0fe10819。`SourceRegion`：ap-northeast-2）。新的 AMI 将复制到您启动自动化操作的区域。将对复制的 AMI 进行加密，因为可选 `Encrypted` 标记将设置为 `true`。

------
#### [ YAML ]

```
name: createEncryptedCopy
action: aws:copyImage
maxAttempts: 3
onFailure: Abort
inputs:
  SourceImageId: ami-0fe10819
  SourceRegion: ap-northeast-2
  ImageName: Encrypted Copy of LAMP base AMI in ap-northeast-2
  Encrypted: true
```

------
#### [ JSON ]

```
{   
    "name": "createEncryptedCopy",
    "action": "aws:copyImage",
    "maxAttempts": 3,
    "onFailure": "Abort",
    "inputs": {
        "SourceImageId": "ami-0fe10819",
        "SourceRegion": "ap-northeast-2",
        "ImageName": "Encrypted Copy of LAMP base AMI in ap-northeast-2",
        "Encrypted": true
    }   
}
```

------

SourceRegion  
源 AMI 当前所在的区域。  
类型：字符串  
是否必需：是

SourceImageId  
要从源区域复制的 AMI ID。  
类型：字符串  
是否必需：是

ImageName  
新映像的名称。  
类型：字符串  
是否必需：是

ImageDescription  
目标映像的描述。  
类型：字符串  
必需：否

已加密  
对目标 AMI 进行加密。  
类型：布尔值  
必需：否

KmsKeyId  
在复制操作期间对映像快照进行加密时要使用的 AWS KMS key 的完整 Amazon Resource Name (ARN)。有关更多信息，请参阅 [CopyImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/api_copyimage.html)。  
类型：字符串  
必需：否

ClientToken  
您为确保请求幂等性而提供的唯一、区分大小写的标识符。有关更多信息，请参阅 [CopyImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/api_copyimage.html)。  
类型：字符串  
必需：否Output

ImageId  
已复制映像的 ID。

ImageState  
已复制映像的状态。  
有效值：`available` \$1`pending` \$1`failed`

# `aws:createImage` – 创建亚马逊机器映像
<a name="automation-action-create"></a>

从正在运行、正在停止或已停止的实例创建 Amazon Machine Image（AMI），并轮询 `ImageState` 是否为 `available`。

**注意**  
`aws:createImage` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作支持以下 `CreateImage` 参数。有关更多信息，请参阅 [CreateImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateImage.html)。

------
#### [ YAML ]

```
name: createMyImage
action: aws:createImage
maxAttempts: 3
onFailure: Abort
inputs:
  InstanceId: i-1234567890abcdef0
  ImageName: AMI Created on{{global:DATE_TIME}}
  NoReboot: true
  ImageDescription: My newly created AMI
```

------
#### [ JSON ]

```
{
    "name": "createMyImage",
    "action": "aws:createImage",
    "maxAttempts": 3,
    "onFailure": "Abort",
    "inputs": {
        "InstanceId": "i-1234567890abcdef0",
        "ImageName": "AMI Created on{{global:DATE_TIME}}",
        "NoReboot": true,
        "ImageDescription": "My newly created AMI"
    }
}
```

------

InstanceId  
实例的 ID。  
类型：字符串  
是否必需：是

ImageName  
映像的名称。  
类型：字符串  
是否必需：是

ImageDescription  
映像的描述。  
类型：字符串  
必需：否

NoReboot  
一种布尔文本。  
默认情况下，Amazon Elastic Compute Cloud (Amazon EC2) 会尝试关闭并重新启动实例，然后再创建映像。如果**不重启**选项设置为 `true`，则 Amazon EC2 在创建映像前不会关闭实例。如果使用此选项，则无法保证所创建映像上的文件系统的完整性。  
如果您希望在从实例创建 AMI 映像后，该实例不运行，请先使用 [`aws:changeInstanceState` – 更改或声明实例状态](automation-action-changestate.md) 插件停止实例，然后在 **NoReboot** 选项设置为 `true` 的情况下使用此 `aws:createImage` 操作。  
类型：布尔值  
必需：否

BlockDeviceMappings  
适用于实例的块储存设备。  
类型：映射  
必需：否Output

ImageId  
新建映像的 ID。  
类型：字符串

ImageState  
映像的当前状态。如果状态为可用，则表示映像已成功注册，并且可用于启动实例。  
类型：字符串

# `aws:createStack` – 创建 CloudFormation 堆栈。
<a name="automation-action-createstack"></a>

从模板创建 AWS CloudFormation 堆栈。

**注意**  
`aws:createStack` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

有关创建 CloudFormation 堆栈的补充信息，请参阅 *AWS CloudFormationAPI 参考*中的 [CreateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)。

**输入**

------
#### [ YAML ]

```
name: makeStack
action: aws:createStack
maxAttempts: 1
onFailure: Abort
inputs:
  Capabilities:
  - CAPABILITY_IAM
  StackName: myStack
  TemplateURL: http://s3.amazonaws.com/amzn-s3-demo-bucket/myStackTemplate
  TimeoutInMinutes: 5
  Parameters:
    - ParameterKey: LambdaRoleArn
      ParameterValue: "{{LambdaAssumeRole}}"
    - ParameterKey: createdResource
      ParameterValue: createdResource-{{automation:EXECUTION_ID}}
```

------
#### [ JSON ]

```
{
    "name": "makeStack",
    "action": "aws:createStack",
    "maxAttempts": 1,
    "onFailure": "Abort",
    "inputs": {
        "Capabilities": [
            "CAPABILITY_IAM"
        ],
        "StackName": "myStack",
        "TemplateURL": "http://s3.amazonaws.com/amzn-s3-demo-bucket/myStackTemplate",
        "TimeoutInMinutes": 5,
        "Parameters": [
          {
            "ParameterKey": "LambdaRoleArn",
            "ParameterValue": "{{LambdaAssumeRole}}"
          },
          {
            "ParameterKey": "createdResource",
            "ParameterValue": "createdResource-{{automation:EXECUTION_ID}}"
          }
    }
}
```

------

功能  
必须在 CloudFormatio 可以创建某些堆栈之前指定的值列表。一些堆栈模板中包含的资源会影响您的 AWS 账户中的权限。对于这些堆栈，您必须通过指定此参数来明确确认它们的功能。  
有效值包括 `CAPABILITY_IAM`、`CAPABILITY_NAMED_IAM` 和 `CAPABILITY_AUTO_EXPAND`。  
**CAPABILITY\$1IAM 和 CAPABILITY\$1NAMED\$1IAM**  
如果包含 IAM 资源，您可以指定任意一个功能。如果包含具有自定义名称的 IAM 资源，则必须指定 `CAPABILITY_NAMED_IAM`。如果您不指定此参数，则此操作会返回 `InsufficientCapabilities` 错误。以下资源要求您指定 `CAPABILITY_IAM` 或 `CAPABILITY_NAMED_IAM`。
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-accesskey.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-group.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-instanceprofile.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-policy.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-resource-iam-role.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-user.html)
+ [https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-properties-iam-addusertogroup.html)
如果您的堆栈模板包含这些资源，我们建议您查看与之关联的所有权限并在必要时编辑其权限。  
有关更多信息，请参阅[确认 CloudFormation 模板中的 IAM 资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html#capabilities)。  
**CAPABILITY\$1AUTO\$1EXPAND**  
某些模板包含宏。宏对模板执行自定义处理，包括查找并替换等简单操作，以及整个模板的大幅转换。因此，用户通常会从已处理的模板创建更改集，这样他们便能在实际创建堆栈之前查看宏导致的更改。如果堆栈模板包含一个或多个宏，并且您选择直接从已处理的模板创建堆栈，而不首先查看更改集中生成的更改，则必须确认此功能。
有关更多信息，请参阅 *AWS CloudFormation用户指南*中的[使用 AWS CloudFormation 宏对模板执行自定义处理](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-macros.html)。  
类型：字符串的数组  
有效值：`CAPABILITY_IAM | CAPABILITY_NAMED_IAM | CAPABILITY_AUTO_EXPAND`  
必需：否

ClientRequestToken  
该 CreateStack 请求的唯一标识符。如果将此步骤中的 maxAttempts 设置为大于 1 的值，请指定此令牌。通过指定此令牌，CloudFormation 知道您未在尝试使用相同的名称创建新堆栈。  
类型：字符串  
必需：否  
长度限制：最小长度为 1。最大长度为 128。  
模式：[a-zA-Z0-9][-a-zA-Z0-9]\$1

DisableRollback  
如果堆栈创建失败，请设置为 `true` 以关闭堆栈回滚。  
Conditional：您可以指定 `DisableRollback` 参数或 `OnFailure` 参数，但不能同时指定。  
默认值：`false`  
类型：布尔值  
必需：否

NotificationARNs  
用于发布堆栈相关事件的 Amazon Simple Notification Service (Amazon SNS) 主题 ARN。您可以使用 Amazon SNS 控制台 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home) 查找 SNS 主题 ARN。  
类型：字符串的数组  
数组成员：最多 5 项。  
必需：否

OnFailure  
如果堆栈创建失败，确定要执行的操作。您必须指定 `DO_NOTHING`、`ROLLBACK` 或 `DELETE`。  
Conditional：您可以指定 `OnFailure` 参数或 `DisableRollback` 参数，但不能同时指定。  
默认值：`ROLLBACK`  
类型：字符串  
有效值:` DO_NOTHING | ROLLBACK | DELETE`  
必需：否

参数  
指定堆栈输入参数的 `Parameter` 结构列表。有关更多信息，请参阅[参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Parameter.html)数据类型。  
类型：[参数](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Parameter.html)对象数组   
必需：否

ResourceTypes  
您有权用于此创建堆栈操作的模板资源类型。例如，`AWS::EC2::Instance`、`AWS::EC2::*` 或 `Custom::MyCustomInstance`。使用以下语法描述模板资源类型。  
+ 对于所有 AWS 资源：

  ```
  AWS::*
  ```
+ 对于所有自定义资源：

  ```
  Custom::*
  ```
+ 对于指定自定义资源：

  ```
  Custom::logical_ID
  ```
+ 对于特定 AWS 服务的所有资源：

  ```
  AWS::service_name::*
  ```
+ 对于特定的 AWS 资源：

  ```
  AWS::service_name::resource_logical_ID
  ```
如果资源类型列表不包括您创建的资源，那么堆栈创建将会失败。默认情况下，CloudFormation 授予对所有资源类型的权限。IAM 将此参数用于 IAM policy 中特定于云的条件密钥。有关更多信息，请参阅[使用 AWS Identity and Access Management 控制访问](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/using-iam-template.html)。  
类型：字符串的数组  
长度约束：最小长度为 1。最大长度为 256。  
必需：否

RoleARN  
CloudFormation 用于创建堆栈的 IAM 角色的 Amazon Resource Name (ARN)。CloudFormation 使用角色的凭证代表您进行调用。CloudFormation 始终将此角色用于堆栈上的所有未来操作。只要用户有权对堆栈进行操作，CloudFormation 会使用此角色，即使用户无权传递它。确保该角色授予最少的权限。  
如果您不指定值，则 CloudFormation 会使用之前与堆栈关联的角色。如果角色不可用，则 CloudFormation 会使用您的用户凭证生成的一个临时会话。  
类型：字符串  
长度约束：最小长度为 20。最大长度为 2048。  
必需：否

StackName  
与堆栈关联的名称。名称在您创建堆栈的区域中必须是唯一的。  
堆栈名称只能包含字母数字字符（区分大小写）和连字符。该名称必须以字母字符开头，且不得超过 128 个字符。
类型：字符串  
是否必需：是

StackPolicyBody  
包含堆栈策略正文的结构。有关更多信息，请参阅[防止更新堆栈资源](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/protect-stack-resources.html)。  
Conditional：您可以指定 `StackPolicyBody` 参数或 `StackPolicyURL` 参数，但不能同时指定。  
类型：字符串  
长度限制：最小长度为 1。长度上限为 16384。  
必需：否

StackPolicyURL  
包含堆栈策略的文件的位置。URL 指向的策略必须位于与堆栈处于同一区域的 S3 存储桶中。堆栈策略允许的最大文件大小为 16 KB。  
Conditional：您可以指定 `StackPolicyBody` 参数或 `StackPolicyURL` 参数，但不能同时指定。  
类型：字符串  
长度限制：最小长度为 1。长度上限为 1350。  
必需：否

Tags  
与此堆栈关联的键值对。CloudFormation 还可以将这些标签传播到堆栈中创建的资源。您可以指定最多 10 个标签。  
类型：[标签](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_Tag.html)对象数组   
必需：否

TemplateBody  
包含最小长度为 1 字节、最大长度为 51200 字节的模板正文的结构。有关更多信息，请参阅[模板剖析](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)。  
Conditional：您可以指定 `TemplateBody` 参数或 `TemplateURL` 参数，但不能同时指定。  
类型：字符串  
长度限制：最小长度为 1。  
必需：否

TemplateURL  
包含模板正文的文件的位置。URL 必须指向一个位于 S3 存储桶中的模板。模板允许的最大大小为 460800 字节。有关更多信息，请参阅[模板剖析](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/template-anatomy.html)。  
Conditional：您可以指定 `TemplateBody` 参数或 `TemplateURL` 参数，但不能同时指定。  
类型：字符串  
长度限制：最小长度为 1。最大长度为 1024。  
必需：否

TimeoutInMinutes  
堆栈状态变为 `CREATE_FAILED` 前允许经过的时间。如果未设置 `DisableRollback` 或将其设置为 `false`，堆栈将被回滚。  
类型：整数  
有效范围：最小值为 1。  
必需：否

## 输出
<a name="automation-action-createstack-output"></a>

StackId  
堆栈的唯一标识符。  
类型：字符串

StackStatus  
堆栈的当前状态。  
类型：字符串  
有效值：`CREATE_IN_PROGRESS | CREATE_FAILED | CREATE_COMPLETE | ROLLBACK_IN_PROGRESS | ROLLBACK_FAILED | ROLLBACK_COMPLETE | DELETE_IN_PROGRESS | DELETE_FAILED | DELETE_COMPLETE | UPDATE_IN_PROGRESS | UPDATE_COMPLETE_CLEANUP_IN_PROGRESS | UPDATE_COMPLETE | UPDATE_ROLLBACK_IN_PROGRESS | UPDATE_ROLLBACK_FAILED | UPDATE_ROLLBACK_COMPLETE_CLEANUP_IN_PROGRESS | UPDATE_ROLLBACK_COMPLETE | REVIEW_IN_PROGRESS`  
是否必需：是

StackStatusReason  
与堆栈状态相关联的成功或失败消息。  
类型：字符串  
必需：否  
有关更多信息，请参阅 [CreateStack](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_CreateStack.html)。

## 安全注意事项
<a name="automation-action-createstack-security"></a>

您必须将以下策略分配给 IAM 自动化担任角色，才可以使用 `aws:createStack` 操作。有关担任角色的更多信息，请参阅 [任务 1：为自动化创建服务角色](automation-setup-iam.md#create-service-role)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "sqs:*",
            "cloudformation:CreateStack",
            "cloudformation:DescribeStacks"
         ],
         "Resource":"*"
      }
   ]
}
```

------

# `aws:createTags` - 为 AWS 资源创建标签
<a name="automation-action-createtag"></a>

为 Amazon Elastic Compute Cloud (Amazon EC2) 实例或 AWS Systems Manager 托管实例创建新标签。

**注意**  
`aws:createTags` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作支持大多数 Amazon EC2 `CreateTags` 和 Systems Manager `AddTagsToResource` 参数。有关更多信息，请参阅 [CreateTags](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/api_createtags.html) 和 [AddTagsToResource](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/api_addtagstoresource.html)。

以下示例说明如何为 Amazon Machine Image (AMI) 和实例添加标签以作为特定部门的生产资源。

------
#### [ YAML ]

```
name: createTags
action: aws:createTags
maxAttempts: 3
onFailure: Abort
inputs:
  ResourceType: EC2
  ResourceIds:
  - ami-9a3768fa
  - i-02951acd5111a8169
  Tags:
  - Key: production
    Value: ''
  - Key: department
    Value: devops
```

------
#### [ JSON ]

```
{
    "name": "createTags",
    "action": "aws:createTags",
    "maxAttempts": 3,
    "onFailure": "Abort",
    "inputs": {
        "ResourceType": "EC2",
        "ResourceIds": [
            "ami-9a3768fa",
            "i-02951acd5111a8169"
        ],
        "Tags": [
            {
                "Key": "production",
                "Value": ""
            },
            {
                "Key": "department",
                "Value": "devops"
            }
        ]
    }
}
```

------

ResourceIds  
要为其添加标签的资源的 ID。如果资源类型不是“EC2”，则此字段只能包含单个项目。  
类型：字符串列表  
是否必需：是

标签  
要与资源关联的标签。  
类型：映射列表  
是否必需：是

ResourceType  
要为其添加标签的资源的类型。如果未提供，则使用默认值“EC2”。  
类型：字符串  
必需：否  
有效值: `EC2` \$1 `ManagedInstance` \$1 `MaintenanceWindow` \$1 `Parameter`

**Output**  
无

# `aws:deleteImage` – 删除亚马逊机器映像
<a name="automation-action-delete"></a>

删除指定 Amazon Machine Image (AMI) 和所有的相关快照。

**注意**  
`aws:deleteImage` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作仅支持一个参数。有关更多信息，请参阅 [DeregisterImage](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeregisterImage.html) 和 [DeleteSnapshot](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_DeleteSnapshot.html) 的相关文档。

------
#### [ YAML ]

```
name: deleteMyImage
action: aws:deleteImage
maxAttempts: 3
timeoutSeconds: 180
onFailure: Abort
inputs:
  ImageId: ami-12345678
```

------
#### [ JSON ]

```
{
    "name": "deleteMyImage",
    "action": "aws:deleteImage",
    "maxAttempts": 3,
    "timeoutSeconds": 180,
    "onFailure": "Abort",
    "inputs": {
        "ImageId": "ami-12345678"
    }
}
```

------

ImageId  
要删除的映像的 ID。  
类型：字符串  
是否必需：是

**Output**  
无

# `aws:deleteStack` - 删除 CloudFormation 堆栈。
<a name="automation-action-deletestack"></a>

删除 AWS CloudFormation 堆栈。

**注意**  
`aws:deleteStack` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**输入**

------
#### [ YAML ]

```
name: deleteStack
action: aws:deleteStack
maxAttempts: 1
onFailure: Abort
inputs:
  StackName: "{{stackName}}"
```

------
#### [ JSON ]

```
{
   "name":"deleteStack",
   "action":"aws:deleteStack",
   "maxAttempts":1,
   "onFailure":"Abort",
   "inputs":{
      "StackName":"{{stackName}}"
   }
}
```

------

ClientRequestToken  
此 `DeleteStack` 请求的唯一标识符。如果您计划重试请求以便 CloudFormation 知道您未在尝试删除同名堆栈，请指定此令牌。您可以重试 `DeleteStack` 请求以验证 CloudFormation 是否收到了它们。  
类型：字符串  
长度限制：最小长度为 1。最大长度为 128。  
模式：[a-zA-Z][-a-zA-Z0-9]\$1  
必需：否

RetainResources.member.N  
此输入仅适用于处于 `DELETE_FAILED` 状态的堆栈。您想要保留的资源的逻辑资源 ID 的列表。在删除时，CloudFormation 删除堆栈，但不删除保留资源。  
如果无法删除某个资源（例如非空 S3 存储桶），但需要删除堆栈，则保留资源会很有用。  
类型：字符串数组  
必需：否

RoleARN  
CloudFormation 用于创建堆栈的 AWS Identity and Access Management (IAM) 角色的 Amazon Resource Name (ARN)。CloudFormation 使用角色的凭证代表您进行调用。CloudFormation 始终将此角色用于堆栈上的所有未来操作。只要用户有权对堆栈进行操作，CloudFormation 会使用此角色，即使用户无权传递它。确保该角色授予最少的权限。  
如果您不指定值，则 CloudFormation 会使用之前与堆栈关联的角色。如果角色不可用，则 CloudFormation 会使用您的用户凭证生成的一个临时会话。  
类型：字符串  
长度约束：最小长度为 20。最大长度为 2048。  
必需：否

StackName  
与堆栈关联的名称或唯一堆栈 ID。  
类型：字符串  
是否必需：是

## 安全注意事项
<a name="automation-action-deletestack-security"></a>

您必须将以下策略分配给 IAM 自动化担任角色，才可以使用 `aws:deleteStack` 操作。有关担任角色的更多信息，请参阅 [任务 1：为自动化创建服务角色](automation-setup-iam.md#create-service-role)。

------
#### [ JSON ]

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Effect":"Allow",
         "Action":[
            "sqs:*",
            "cloudformation:DeleteStack",
            "cloudformation:DescribeStacks"
         ],
         "Resource":"*"
      }
   ]
}
```

------

# `aws:executeAutomation` - 运行另一个自动化
<a name="automation-action-executeAutomation"></a>

通过调用辅助运行手册运行辅助自动化。借助此操作，您可以为最常见的操作创建运行手册，并在自动化过程中引用这些运行手册。因为无需跨类似运行手册复制步骤，此操作可以简化您的运行手册。

辅助自动化将在启动主自动化的用户环境中运行。这意味着第二个自动化将使用与启动第一个自动化的用户相同的 AWS Identity and Access Management（IAM）角色或用户。

**重要**  
如果您在使用担任角色（使用 iam:passRole 策略的角色）的辅助自动化中指定参数，则启动主要自动化的用户或角色必须具有在辅助自动化中传递指定的担任角色的权限。有关为自动化设置担任角色的更多信息，请参阅 [使用控制台为 Automation 创建服务角色](automation-setup-iam.md)。

**输入**

------
#### [ YAML ]

```
name: Secondary_Automation
action: aws:executeAutomation
maxAttempts: 3
timeoutSeconds: 3600
onFailure: Abort
inputs:
  DocumentName: secondaryAutomation
  RuntimeParameters:
    instanceIds:
    - i-1234567890abcdef0
```

------
#### [ JSON ]

```
{
   "name":"Secondary_Automation",
   "action":"aws:executeAutomation",
   "maxAttempts":3,
   "timeoutSeconds":3600,
   "onFailure":"Abort",
   "inputs":{
      "DocumentName":"secondaryAutomation",
      "RuntimeParameters":{
         "instanceIds":[
            "i-1234567890abcdef0"
         ]
      }
   }
}
```

------

DocumentName  
要在步骤中运行的辅助运行手册的名称。对于相同 AWS 账户中的运行手册，指定运行手册名称。对于从其他 AWS 账户分享的运行手册，指定运行手册的 Amazon Resource Name (ARN)。有关使用共享运行手册的信息，请参阅 [使用共享 SSM 文档](documents-ssm-sharing.md#using-shared-documents)。  
类型：字符串  
是否必需：是

DocumentVersion  
要运行的辅助运行手册的版本。如果未指定，自动化将运行默认运行手册版本。  
类型：字符串  
必需：否

MaxConcurrency  
此任务可以并行运行的最大目标数。您可以指定一个数字或一个百分比（如 10 或 10%）。  
类型：字符串  
必需：否

MaxErrors  
系统停止在其他目标上运行自动化之前允许的错误数。您可以指定绝对数量的错误（如 10），也可以指定目标集百分比（如 10%）。例如，如果您指定 3，系统将在收到第四个错误时停止运行自动化。如果指定 0，则系统会在返回第一个错误结果后停止在其他资源上运行自动化。如果您在 50 个资源上运行自动化并将 `MaxErrors` 设置为 10%，则系统在收到第六个错误时停止在其他目标上运行自动化。  
当达到 `MaxErrors` 阈值时，允许完成已经运行的自动化，但是其中一些自动化也可能失败。如果您需要确保失败的自动化不会超过指定的 `MaxErrors`，将 `MaxConcurrency` 设置为 1，因此一次进行一个自动化。  
类型：字符串  
必需：否

RuntimeParameters  
辅助运行手册所需的参数。映射使用以下格式：\$1"parameter1" : "value1", "parameter2" : "value2" \$1  
类型：映射  
必需：否

Tags  
分配给资源的可选元数据。您最多可以为自动化指定 5 个标签。  
类型：MapList  
必需：否

TargetLocations  
位置是要在其中运行自动化的 AWS 区域 和/或 AWS 账户 的组合。必须指定至少 1 个项目，最多可以指定 100 个项目。为此参数指定值时，输出不会返回到父自动化。如果需要，则必须后续调用 API 操作，以检索子自动化的输出。  
类型：MapList  
必需：否

TargetMaps  
运行手册参数到目标资源的键-值映射列表。`Targets` 和 `TargetMaps` 不能一起指定。  
类型：MapList  
必需：否

TargetParameterName  
用作速率控制自动化目标资源的参数的名称。当您指定 `Targets` 时需要  
类型：字符串  
必需：否

Targets  
指向目标资源的键-值映射列表。当您指定 `TargetParameterName` 时需要  
类型：MapList  
必需：否Output

Output  
辅助自动化生成的输出。您可以使用以下格式引用输出：*Secondary\$1Automation\$1Step\$1Name*.Output  
类型：StringList  
示例如下：  

```
- name: launchNewWindowsInstance
  action: 'aws:executeAutomation'
  onFailure: Abort
  inputs:
    DocumentName: launchWindowsInstance
  nextStep: getNewInstanceRootVolume
- name: getNewInstanceRootVolume
  action: 'aws:executeAwsApi'
  onFailure: Abort
  inputs:
    Service: ec2
    Api: DescribeVolumes
    Filters:
    - Name: attachment.device
      Values:
      - /dev/sda1
    - Name: attachment.instance-id
      Values:
      - '{{launchNewWindowsInstance.Output}}'
  outputs:
  - Name: rootVolumeId
    Selector: '$.Volumes[0].VolumeId'
    Type: String
  nextStep: snapshotRootVolume
- name: snapshotRootVolume
  action: 'aws:executeAutomation'
  onFailure: Abort
  inputs:
    DocumentName: AWS-CreateSnapshot
    RuntimeParameters:
    VolumeId:
    - '{{getNewInstanceRootVolume.rootVolumeId}}'
    Description:
    - 'Initial root snapshot for {{launchNewWindowsInstance.Output}}'
```

ExecutionId  
辅助自动化的 ID。  
类型：字符串

Status  
辅助自动化的状态。  
类型：字符串

# `aws:executeAwsApi` - 调用并运行 AWS API 操作
<a name="automation-action-executeAwsApi"></a>

调用并运行 AWS API 操作。支持大多数 API 操作，但某些 API 操作未经过测试。不支持流式处理 API 操作，例如 [GetObject](https://docs.aws.amazon.com/AmazonS3/latest/API/RESTObjectGET.html) 操作。如果不确定要使用的 API 操作是否属于流式操作，请查看该服务的 [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html) 文档，判断该 API 是否需要流式输入或输出。我们会定期更新此操作使用的 Boto3 版本。但是，在新的 Boto3 版本发布后，可能需要长达几周的时间才能将更改反映到此操作中。每个 `aws:executeAwsApi` 操作最多可以运行 25 秒。有关如何使用此操作的更多示例，请参阅 [其他运行手册示例](automation-document-examples.md)。

**注意**  
`aws:executeAwsApi` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**输入**  
由您选择的 API 操作定义的输入。

------
#### [ YAML ]

```
action: aws:executeAwsApi
inputs:
  Service: The official namespace of the service
  Api: The API operation or method name
  API operation inputs or parameters: A value
outputs: # These are user-specified outputs
- Name: The name for a user-specified output key
  Selector: A response object specified by using jsonpath format
  Type: The data type
```

------
#### [ JSON ]

```
{
   "action":"aws:executeAwsApi",
   "inputs":{
      "Service":"The official namespace of the service",
      "Api":"The API operation or method name",
      "API operation inputs or parameters":"A value"
   },
   "outputs":[ These are user-specified outputs
      {
         "Name":"The name for a user-specified output key",
         "Selector":"A response object specified by using JSONPath format",
         "Type":"The data type"
      }
   ]
}
```

------

服务  
包含要运行的 API 操作的 AWS 服务命名空间。您可以在 适用于 Python (Boto3) 的 AWS SDK 的[可用服务](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)中查看支持的 AWS 服务命名空间列表。可以在**客户端**部分找到此命名空间。例如，Systems Manager 的命名空间为 `ssm`。Amazon Elastic Compute Cloud (Amazon EC2) 的命名空间为 `ec2`。  
类型：字符串  
是否必需：是

API  
要运行的 API 操作的名称。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看 API 操作（也称为方法）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon Relational Database Service (Amazon RDS) 的所有 API 操作（方法）。  
类型：字符串  
是否必需：是

API 操作输入  
一个或多个 API 操作输入。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看可用的输入（也称为参数）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法。选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法并向下滚动以查看可用的参数，例如 **DBInstanceIdentifier**、**Name** 和 **Values**。  

```
inputs:
  Service: The official namespace of the service
  Api: The API operation name
  API input 1: A value
  API Input 2: A value
  API Input 3: A value
```

```
"inputs":{
      "Service":"The official namespace of the service",
      "Api":"The API operation name",
      "API input 1":"A value",
      "API Input 2":"A value",
      "API Input 3":"A value"
}
```
类型：由选择的 API 操作确定  
是否必需：是

**输出**  
输出由用户根据所选 API 操作的响应指定。

名称  
输出的名称。  
类型：字符串  
是否必需：是

选择器  
响应对象中特定属性的 JSONPath。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看响应对象。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法：选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法，然后向下滚动到**响应结构**部分。**DBInstances** 被列为响应对象。  
类型：Integer、Boolean、String、StringList、StringMap 或 MapList  
是否必需：是

Type  
响应元素的数据类型。  
类型：可变  
是否必需：是

# `aws:executeScript` - 运行脚本
<a name="automation-action-executeScript"></a>

使用指定的运行时和处理程序提供的 Python 或 PowerShell 脚本。每个 `aws:executeScript` 操作最多可以运行 600 秒（10 分钟）时间。您可以通过指定 `aws:executeScript` 步骤的 `timeoutSeconds` 参数来限制超时。

在函数中使用 return 语句将输出添加到输出有效负载中。有关为您的 `aws:executeScript` 操作定义输出的示例，请参阅[示例 2：脚本化运行手册](automation-authoring-runbooks-scripted-example.md)。您还可以将运行手册中 `aws:executeScript` 操作的输出发送到您指定的 Amazon CloudWatch Logs 日志组。有关更多信息，请参阅 [使用 CloudWatch Logs 记录自动化操作输出](automation-action-logging.md)。

如果想要将 `aws:executeScript` 操作的输出发送到 CloudWatch Logs，或者如果您为 `aws:executeScript` 操作指定的脚本调用 AWS API 操作，则始终需要 AWS Identity and Access Management (IAM) 服务角色（或承担角色）运行运行手册。

**注意**  
`aws:executeScript` 操作不支持自动节流重试。如果您的脚本发出的 AWS API 调用可能会受到节流，则必须在脚本代码中实现自己的重试逻辑。

`aws:executeScript` 操作包含以下预安装的 PowerShell 核心模块。
+ Microsoft.PowerShell.Host
+ Microsoft.PowerShell.Management
+ Microsoft.PowerShell.Security
+ Microsoft.PowerShell.Utility
+ PackageManagement
+ PowerShellGet

要使用未预装的 PowerShell 核心模块，脚本必须安装带有 `-Force` 标志的模块，如以下命令所示。不支持 `AWSPowerShell.NetCore` 模块。用您想要安装的模块替换 *ModuleName*。

```
Install-Module ModuleName -Force
```

要在脚本中使用 PowerShell 核心 cmdlet，我们建议您使用 `AWS.Tools` 模块，如以下命令所示。将每个*示例资源占位符*替换为您自己的信息。
+ Amazon S3 cmdlet。

  ```
  Install-Module AWS.Tools.S3 -Force
  Get-S3Bucket -BucketName amzn-s3-demo-bucket
  ```
+ Amazon EC2 cmdlet

  ```
  Install-Module AWS.Tools.EC2 -Force
  Get-EC2InstanceStatus -InstanceId instance-id
  ```
+ 通用或独立于服务的 AWS Tools for Windows PowerShell cmdlet。

  ```
  Install-Module AWS.Tools.Common -Force
  Get-AWSRegion
  ```

如果脚本除了使用 PowerShell 核心 cmdlet 之外还初始化新对象，则还必须导入模块，如以下命令所示。

```
Install-Module AWS.Tools.EC2 -Force
Import-Module AWS.Tools.EC2

$tag = New-Object Amazon.EC2.Model.Tag
$tag.Key = "Tag"
$tag.Value = "TagValue"

New-EC2Tag -Resource i-02573cafcfEXAMPLE -Tag $tag
```

有关安装和导入 `AWS.Tools` 模块以及在运行手册中使用 PowerShell 核心 cmdlet 的示例，请参阅 [自动化运行手册的视觉对象设计体验](automation-visual-designer.md)。

**Input**  
提供运行脚本所需的信息。将每个*示例资源占位符*替换为您自己的信息。

**注意**  
Python 脚本的附件可以是 .py 文件或包含该脚本的 .zip 文件。PowerShell 脚本必须存储在 .zip 文件中。

------
#### [ YAML ]

```
action: "aws:executeScript"
inputs: 
 Runtime: runtime
 Handler: "functionName"
 InputPayload: 
  scriptInput: '{{parameterValue}}'
 Script: |-
   def functionName(events, context):
   ...
 Attachment: "scriptAttachment.zip"
```

------
#### [ JSON ]

```
{
    "action": "aws:executeScript",
    "inputs": {
        "Runtime": "runtime",
        "Handler": "functionName",
        "InputPayload": {
            "scriptInput": "{{parameterValue}}"
        },
        "Attachment": "scriptAttachment.zip"
    }
}
```

------

运行时  
用于运行所提供脚本的运行时语言。`aws:executeScript` 支持下表中的运行时。      
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/automation-action-executeScript.html)
类型：字符串  
是否必需：是  
对于 python 运行时系统，环境提供 512 MB 的内存和 512 MB 的磁盘空间。对于 PowerShell 运行时，环境会提供 1024 MB 的内存和 512 MB 的磁盘空间。

处理程序  
函数的名称。您必须确保在处理程序中定义的函数具有两个参数：`events` 和 `context`。PowerShell 运行时不支持此参数。  
类型：字符串  
必需：是（Python）\$1 不支持（PowerShell）

InputPayload  
将传递给处理程序的第一个参数的 JSON 或 YAML 对象。这可用于将输入数据传递给脚本。  
类型：字符串  
必需：否  

```
description: Tag an instance
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
    AutomationAssumeRole:
        type: String
        description: '(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
    InstanceId:
        type: String
        description: (Required) The ID of the EC2 instance you want to tag.
mainSteps:
  - name: tagInstance
    action: 'aws:executeScript'
    inputs:
        Runtime: "python3.11"
        Handler: tagInstance
        InputPayload:
            instanceId: '{{InstanceId}}'
        Script: |-
          def tagInstance(events,context):
            import boto3

            #Initialize client
            ec2 = boto3.client('ec2')
            instanceId = events['instanceId']
            tag = {
                "Key": "Env",
                "Value": "ExamplePython"
            }
            print(f"Adding tag {tag} to instance id {instanceId}")
            ec2.create_tags(
                Resources=[instanceId],
                Tags=[tag]
            )
            return tag
    outputs:
      - Type: String
        Name: TagKey
        Selector: $.Payload.Key
outputs:
  - tagInstance.TagKey
```

```
description: Tag an instance
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
  AutomationAssumeRole:
    type: String
    description: (Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.
  InstanceId:
    type: String
    description: (Required) The ID of the EC2 instance you want to tag.
mainSteps:
  - name: tagInstance
    action: aws:executeScript
    isEnd: true
    inputs:
      Runtime: PowerShell 7.4
      InputPayload:
        instanceId: '{{InstanceId}}'
      Script: |-
        Install-Module AWS.Tools.EC2 -Force
        Import-Module AWS.Tools.EC2

        $input = $env:InputPayload | ConvertFrom-Json

        $tag = New-Object Amazon.EC2.Model.Tag
        $tag.Key = "Env"
        $tag.Value = "ExamplePowerShell"

        Write-Information "Adding tag key: $($tag.Key) and value: $($tag.Value) to instance id $($input.instanceId)"
        New-EC2Tag -Resource $input.instanceId -Tag $tag

        return $tag
    outputs:
      - Type: String
        Name: TagKey
        Selector: $.Payload.Key
outputs:
  - tagInstance.TagKey
```

Script  
要在自动化期间运行的嵌入式脚本。  
类型：字符串  
必需：否 (Python) \$1 是 (PowerShell)

附件  
可以由操作调用的单独脚本文件或 .zip 文件的名称。指定与您在 `Attachments` 请求参数中指定的文档附件文件的 `Name` 相同的值。有关更多信息，请参阅 *AWS Systems Manager API 参考*中的[附件](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreateDocument.html#systemsmanager-CreateDocument-request-Attachments)。如果您使用附件提供脚本，还必须在您的运行手册的顶级元素部分中定义一个 `files` 部分。有关更多信息，请参阅 [架构版本 0.3](documents-schemas-features.md#automation-doc-syntax-examples)。  
要为 Python 调用文件，请在 `Handler` 中使用 `filename.method_name` 格式。  
Python 脚本的附件可以是 .py 文件或包含该脚本的 .zip 文件。PowerShell 脚本必须存储在 .zip 文件中。
当在附件中包含 Python 库时，我们建议在每个模块目录中添加一个空`__init__.py` 文件。这允许您从脚本内容的附件中的库导入模块。例如：`from library import module`  
类型：字符串  
必需：否Output

有效载荷  
函数返回的对象的 JSON 表示形式。返回最多 100KB 的数据。如果输出列表，则最多返回 100 个项目。

## 通过 aws:executeScript 使用附件
<a name="automation-action-executeScript-attachments"></a>

附件提供了一种强大的方法，可以将复杂的脚本、多个模块和外部依赖项打包并重复用于 `aws:executeScript` 操作。在您需要执行以下操作时，请使用附件：
+ 将多个 Python 模块或 PowerShell 脚本打包在一起。
+ 在多个运行手册中重复使用相同的脚本逻辑。
+ 在脚本中包含外部库或依赖项。
+ 通过分离复杂的脚本逻辑，保持运行手册定义简洁。
+ 在团队或自动化工作流之间共享脚本包。

### 附件结构和打包
<a name="automation-action-executeScript-attachment-structure"></a>

您可以附加单个文件或包含多个文件的 zip 包。具体结构取决于使用案例：

**单个文件附件**  
对于简单的脚本，您可以附加单个 `.py` 文件 (Python) 或包含单个 PowerShell 脚本的 `.zip` 文件。

**多模块包**  
对于需要多个模块的复杂自动化，请创建具有以下建议结构的 zip 包：

```
my-automation-package.zip
├── main.py                    # Entry point script
├── utils/
│   ├── __init__.py           # Required for Python module imports
│   ├── helper_functions.py   # Utility functions
│   └── aws_operations.py     # AWS-specific operations
├── config/
│   ├── __init__.py
│   └── settings.py           # Configuration settings
└── requirements.txt          # Optional: document dependencies
```

**重要**  
对于 Python 包，您必须在每个包含 Python 模块的目录中包含一个空的 `__init__.py` 文件。这样您就可以使用标准的 Python 导入语法（例如 `from utils import helper_functions`）来导入模块。

**PowerShell 包结构**  
PowerShell 附件必须打包为 zip 文件，其结构如下：

```
my-powershell-package.zip
├── Main.ps1                  # Entry point script
├── Modules/
│   ├── HelperFunctions.ps1   # Utility functions
│   └── AWSOperations.ps1     # AWS-specific operations
└── Config/
    └── Settings.ps1          # Configuration settings
```

### 创建带附件的运行手册
<a name="automation-action-executeScript-attachment-workflow"></a>

请按照以下步骤创建带附件的运行手册：

1. **将附件上传到 Amazon S3**

   将脚本文件或 zip 包上传到自动化角色可访问的 S3 存储桶。请记下 S3 URI，以便在下一步中使用。

   ```
   aws s3 cp my-automation-package.zip s3://my-automation-bucket/scripts/
   ```

1. **计算附件校验和**

   计算附件文件的 SHA-256 校验和以进行安全验证：

   ```
   # Linux/macOS
   shasum -a 256 my-automation-package.zip
   
   # Windows PowerShell
   Get-FileHash -Algorithm SHA256 my-automation-package.zip
   ```

1. **在运行手册中定义 files 部分**

   在运行手册的顶层添加 `files` 部分以引用附件：

   ```
   files:
     my-automation-package.zip:
       checksums:
         sha256: "your-calculated-checksum-here"
   ```

1. **在 executeScript 步骤中引用附件**

   使用 `Attachment` 参数来引用上传的文件：

   ```
   - name: runMyScript
     action: aws:executeScript
     inputs:
       Runtime: python3.11
       Handler: main.process_data
       Attachment: my-automation-package.zip
       InputPayload:
         inputData: "{{InputParameter}}"
   ```

## aws:executeScript 附件示例
<a name="automation-action-executeScript-examples"></a>

以下示例演示了使用附件和 `aws:executeScript` 操作的不同方法。

### 示例 1：单个文件附件
<a name="automation-action-executeScript-single-file-example"></a>

此示例展示如何使用单个 Python 文件作为附件来处理 EC2 实例数据。

**附件文件：process\$1instance.py**  
创建一个包含以下内容的 Python 文件：

```
import boto3
import json

def process_instance_data(events, context):
    """Process EC2 instance data and return formatted results."""
    try:
        instance_id = events.get('instanceId')
        if not instance_id:
            raise ValueError("instanceId is required")
        
        ec2 = boto3.client('ec2')
        
        # Get instance details
        response = ec2.describe_instances(InstanceIds=[instance_id])
        instance = response['Reservations'][0]['Instances'][0]
        
        # Format the response
        result = {
            'instanceId': instance_id,
            'instanceType': instance['InstanceType'],
            'state': instance['State']['Name'],
            'availabilityZone': instance['Placement']['AvailabilityZone'],
            'tags': {tag['Key']: tag['Value'] for tag in instance.get('Tags', [])}
        }
        
        print(f"Successfully processed instance {instance_id}")
        return result
        
    except Exception as e:
        print(f"Error processing instance: {str(e)}")
        raise
```

**完整运行手册**  
以下是使用单个文件附件的完整运行手册：

```
description: Process EC2 instance data using single file attachment
schemaVersion: '0.3'
assumeRole: '{{AutomationAssumeRole}}'
parameters:
  AutomationAssumeRole:
    type: String
    description: (Required) IAM role for automation execution
  InstanceId:
    type: String
    description: (Required) EC2 instance ID to process

files:
  process_instance.py:
    checksums:
      sha256: "abc123def456..."

mainSteps:
  - name: processInstance
    action: aws:executeScript
    inputs:
      Runtime: python3.11
      Handler: process_instance.process_instance_data
      Attachment: process_instance.py
      InputPayload:
        instanceId: '{{InstanceId}}'
    outputs:
      - Type: StringMap
        Name: InstanceData
        Selector: $.Payload

outputs:
  - processInstance.InstanceData
```

### 示例 2：多模块包
<a name="automation-action-executeScript-multi-module-example"></a>

此示例演示如何使用包含多个 Python 模块的 zip 包进行复杂的 S3 存储桶操作。

**包结构**  
创建具有以下结构的 zip 包：

```
s3-operations.zip
├── main.py
├── utils/
│   ├── __init__.py
│   ├── s3_helper.py
│   └── validation.py
└── config/
    ├── __init__.py
    └── settings.py
```

**main.py（入口点）**  
编排操作的主脚本：

```
from utils.s3_helper import S3Operations
from utils.validation import validate_bucket_name
from config.settings import get_default_settings

def cleanup_s3_bucket(events, context):
    """Clean up S3 bucket based on specified criteria."""
    try:
        bucket_name = events.get('bucketName')
        max_age_days = events.get('maxAgeDays', 30)
        
        # Validate inputs
        if not validate_bucket_name(bucket_name):
            raise ValueError(f"Invalid bucket name: {bucket_name}")
        
        # Initialize S3 operations
        s3_ops = S3Operations()
        settings = get_default_settings()
        
        # Perform cleanup
        deleted_objects = s3_ops.delete_old_objects(
            bucket_name, 
            max_age_days,
            settings['dry_run']
        )
        
        result = {
            'bucketName': bucket_name,
            'deletedCount': len(deleted_objects),
            'deletedObjects': deleted_objects[:10],  # Return first 10 for brevity
            'dryRun': settings['dry_run']
        }
        
        print(f"Cleanup completed for bucket {bucket_name}")
        return result
        
    except Exception as e:
        print(f"Error during S3 cleanup: {str(e)}")
        raise
```

## aws:executeScript 附件故障排除
<a name="automation-action-executeScript-troubleshooting"></a>

使用以下指导来解决 `aws:executeScript` 附件的常见问题：

**模块导入错误**  
如果在使用多模块包时收到导入错误：
+ 确保在包含 Python 模块的每个目录中都包含一个空的 `__init__.py` 文件。
+ 验证导入语句是否与 zip 包中的实际文件和目录结构相匹配。
+ 始终使用相对导入（例如 `from .utils import helper`）或绝对导入（例如 `from utils import helper`）。

**未找到附件错误**  
如果自动化未能找到附件：
+ 验证 `Attachment` 参数值是否与 `files` 部分中的键完全匹配。
+ 在 `files` 部分中检查 S3 存储桶路径和文件名是否正确。
+ 确保自动化角色对附件 S3 位置具有 `s3:GetObject` 权限。
+ 验证运行手册中的校验和是否与实际文件校验和匹配。

**处理程序函数错误**  
如果收到与处理程序相关的错误：
+ 对于 Python：在 `Handler` 参数中使用格式 `filename.function_name`（例如 `main.process_data`）。
+ 确保处理程序函数只接受两个参数：`events` 和 `context`。
+ 对于 PowerShell：请勿指定 `Handler` 参数；脚本将直接运行。

**脚本执行失败**  
如果脚本在执行过程中失败：
+ 检查自动化执行历史记录，获取详细的错误消息和堆栈跟踪。
+ 使用 `print()` 语句 (Python) 或 `Write-Information` (PowerShell) 添加调试输出。
+ 验证自动化角色是否已被授予所有必需的 AWS 权限。
+ 在将脚本逻辑打包为附件之前，请在本地测试脚本逻辑。

**退出代码和错误处理**  
要正确处理错误并返回退出代码：
+ 在 Python 中：使用 `raise Exception("error message")` 指示脚本失败。
+ 在 PowerShell 中：使用 `throw "error message"` 或 `Write-Error` 指示失败。
+ 从函数返回结构化数据以提供详细的成功/失败信息。
+ 使用 try-catch 块优雅地处理异常并提供有意义的错误消息。

# `aws:executeStateMachine` - 运行 AWS Step Functions 状态机。
<a name="automation-action-executeStateMachine"></a>

运行 AWS Step Functions 状态机。

**注意**  
`aws:executeStateMachine` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**输入**

此操作支持 Step Functions [StartExecution](https://docs.aws.amazon.com/step-functions/latest/apireference/API_StartExecution.html) API 操作的大多数参数。

**所需的 AWS Identity and Access Management (IAM) 权限**
+ `states:DescribeExecution`
+ `states:StartExecution`
+ `states:StopExecution`

------
#### [ YAML ]

```
name: executeTheStateMachine
action: aws:executeStateMachine
inputs:
  stateMachineArn: StateMachine_ARN
  input: '{"parameters":"values"}'
  name: name
```

------
#### [ JSON ]

```
{
    "name": "executeTheStateMachine",
    "action": "aws:executeStateMachine",
    "inputs": {
        "stateMachineArn": "StateMachine_ARN",
        "input": "{\"parameters\":\"values\"}",
        "name": "name"
    }
}
```

------

stateMachineArn  
Step Functions 状态机的 Amazon Resource Name (ARN)。  
类型：字符串  
是否必需：是

name  
执行的名称。  
类型：字符串  
必需：否

input  
包含执行的 JSON 输入数据的字符串。  
类型：字符串  
必需：否

**输出**  
此操作预定义了以下输出。

执行 Arn  
执行的 ARN。  
类型：字符串

input  
包含执行的 JSON 输入数据的字符串。长度限制适用于有效负载大小，在 UTF-8 编码中以字节表示。  
类型：字符串

name  
执行的名称。  
类型：字符串

output  
执行的 JSON 输出数据。长度限制适用于有效负载大小，在 UTF-8 编码中以字节表示。  
类型：字符串

startDate  
开始执行的日期。  
类型：字符串

stateMachineArn  
状态机的执行的 ARN。  
类型：字符串

status  
执行的当前状态。  
类型：字符串

停止日期  
如果执行已经结束，则为执行停止的日期。  
类型：字符串

# `aws:invokeWebhook` – 调用 Automation Webhook 集成
<a name="invoke-webhook"></a>

调用指定的自动化 Webhook 集成。有关创建 Automation 集成的信息，请参阅 [为 Automation 创建 Webhook 集成](creating-webhook-integrations.md)。

**注意**  
`aws:invokeWebhook` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**注意**  
要使用 `aws:invokeWebhook` 操作，您的用户或服务角色必须允许以下操作：  
ssm:GetParameter
kms:Decrypt
只有当您使用客户托管密钥加密集成的参数时，才需要 AWS Key Management Service (AWS KMS) `Decrypt` 操作的权限。

**Input**  
提供您希望调用的 Automation 集成的信息。

------
#### [ YAML ]

```
action: "aws:invokeWebhook"
inputs: 
 IntegrationName: "exampleIntegration"
 Body: "Request body"
```

------
#### [ JSON ]

```
{
    "action": "aws:invokeWebhook",
    "inputs": {
        "IntegrationName": "exampleIntegration",
        "Body": "Request body"
    }
}
```

------

IntegrationName  
Automation 集成的名称。例如 `exampleIntegration`。您指定的集成必须已存在。  
类型：字符串  
是否必需：是

Body  
调用 Webhook 集成时要发送的有效负载。  
类型：字符串  
必需：否Output

响应  
从 Webhook 提供商响应中收到的文本。

ResponseCode  
从 Webhook 提供商响应中收到的 HTTP 状态代码。

# `aws:invokeLambdaFunction` – 调用 AWS Lambda 函数
<a name="automation-action-lamb"></a>

调用指定的 AWS Lambda 函数。

**注意**  
每个 `aws:invokeLambdaFunction` 操作最多可以运行 300 秒（5 分钟）。您可以通过指定 `aws:invokeLambdaFunction` 步骤的 `timeoutSeconds` 参数来限制超时。

**注意**  
`aws:invokeLambdaFunction` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作支持 Lambda 服务的大多数调用参数。有关更多信息，请参阅[调用](https://docs.aws.amazon.com/lambda/latest/dg/API_Invoke.html)。

------
#### [ YAML ]

```
name: invokeMyLambdaFunction
action: aws:invokeLambdaFunction
maxAttempts: 3
timeoutSeconds: 120
onFailure: Abort
inputs:
  FunctionName: MyLambdaFunction
```

------
#### [ JSON ]

```
{
    "name": "invokeMyLambdaFunction",
    "action": "aws:invokeLambdaFunction",
    "maxAttempts": 3,
    "timeoutSeconds": 120,
    "onFailure": "Abort",
    "inputs": {
        "FunctionName": "MyLambdaFunction"
    }
}
```

------

FunctionName  
Lambda 函数的名称。此函数必须存在。  
类型：字符串  
是否必需：是

限定词  
函数版本或别名。  
类型：字符串  
必需：否

InvocationType  
调用类型。默认值为 `RequestResponse`。  
类型：字符串  
有效值：`Event` \$1`RequestResponse` \$1`DryRun`  
必需：否

LogType  
如果默认值为 `Tail`，则调用类型必须是 `RequestResponse`。Lambda 返回 Lambda 函数生成的最后 4KB 日志数据，采用 base64 编码。  
类型：字符串  
有效值：`None` \$1 `Tail`  
必需：否

ClientContext  
特定于客户端的信息。  
必需：否

InputPayload  
传递给处理程序的第一个参数的 YAML 或 JSON 对象。可以使用此输入将数据传递给函数。与传统 `Payload` 输入相比，此输入提供了更大的灵活性和支持。如果为操作同时定义了 `InputPayload` 和 `Payload`，则 `InputPayload` 优先，不使用 `Payload` 值。  
类型：StringMap  
必需：否

有效载荷  
传递给处理程序的第一个参数的 JSON 字符串。这可以用于将输入数据传递给函数。我们建议使用 `InputPayload` 输入来添加功能性。  
类型：字符串  
必需：否Output

StatusCode  
HTTP 状态代码

FunctionError  
如果存在，则表明执行函数时发生错误。响应负载中包含错误详细信息。

LogResult  
Lambda 函数调用的 base64 编码日志。只有在调用类型为 `RequestResponse` 并且请求了日志时，日志才存在。

有效负载  
Lambda 函数返回的对象的 JSON 表示形式。只有在调用类型为 `RequestResponse` 时才存在有效负载。

以下是来自 `AWS-PatchInstanceWithRollback` 运行手册的部分，演示了如何引用来自 `aws:invokeLambdaFunction` 操作的输出。

------
#### [ YAML ]

```
- name: IdentifyRootVolume
  action: aws:invokeLambdaFunction
  inputs:
    FunctionName: "IdentifyRootVolumeLambda-{{automation:EXECUTION_ID}}"
    Payload: '{"InstanceId": "{{InstanceId}}"}'
- name: PrePatchSnapshot
  action: aws:executeAutomation
  inputs:
    DocumentName: "AWS-CreateSnapshot"
    RuntimeParameters:
      VolumeId: "{{IdentifyRootVolume.Payload}}"
      Description: "ApplyPatchBaseline restoration case contingency"
```

------
#### [ JSON ]

```
{
    "name": "IdentifyRootVolume",
    "action": "aws:invokeLambdaFunction",
    "inputs": {
      "FunctionName": "IdentifyRootVolumeLambda-{{automation:EXECUTION_ID}}",
      "Payload": "{\"InstanceId\": \"{{InstanceId}}\"}"
    }
  },
  {
    "name": "PrePatchSnapshot",
    "action": "aws:executeAutomation",
    "inputs": {
      "DocumentName": "AWS-CreateSnapshot",
      "RuntimeParameters": {
        "VolumeId": "{{IdentifyRootVolume.Payload}}",
        "Description": "ApplyPatchBaseline restoration case contingency"
      }
    }
  }
```

------

# `aws:loop` – 迭代自动化中的步骤
<a name="automation-action-loop"></a>

此操作在自动化运行手册中的步骤子集上进行迭代。您可以选择 `do while` 或 `for each` 样式循环。要构造 `do while` 循环，请使用 `LoopCondition` 输入参数。要构造 `for each` 循环，请使用 `Iterators` 和 `IteratorDataType` 输入参数。使用 `aws:loop` 操作时，请仅指定 `Iterators` 或 `LoopCondition` 输入参数。最大迭代次数为 100。

`onCancel` 属性仅可用于在循环中定义的步骤。`aws:loop` 操作不支持 `onCancel` 属性。`onFailure` 属性可用于 `aws:loop` 操作，但只有在出现导致该步骤失败的意外错误时使用该属性。如果您为循环中的步骤定义 `onFailure` 属性，则 `aws:loop` 操作将继承这些属性，并在出现故障时相应做出反应。

**示例**  
以下是如何构造不同类型的循环操作的示例。

------
#### [ do while ]

```
name: RepeatMyLambdaFunctionUntilOutputIsReturned
action: aws:loop
inputs:
    Steps:
    - name: invokeMyLambda
        action: aws:invokeLambdaFunction
        inputs:
        FunctionName: LambdaFunctionName
        outputs:
        - Name: ShouldRetry
            Selector: $.Retry
            Type: Boolean
    LoopCondition:
        Variable: "{{ invokeMyLambda.ShouldRetry }}"
        BooleanEquals: true
    MaxIterations: 3
```

------
#### [ for each ]

```
name: stopAllInstancesWithWaitTime
action: aws:loop
inputs:
    Iterators: "{{ DescribeInstancesStep.InstanceIds }}"
    IteratorDataType: "String"
    Steps:
    - name: stopOneInstance
        action: aws:changeInstanceState
        inputs:
        InstanceIds:
            - "{{stopAllInstancesWithWaitTime.CurrentIteratorValue}}"
        CheckStateOnly: false
        DesiredState: stopped
    - name: wait10Seconds
        action: aws:sleep
        inputs:
        Duration: PT10S
```

------

**Input**  
输入如下。

迭代器  
要迭代的步骤的项目列表。迭代器的最大数为 100。  
类型：StringList  
必需：否

IteratorDataType  
用于指定 `Iterators` 数据类型的可选参数。可将此参数的值与 `Iterators` 输入参数一起提供。如果您没有为此参数和 `Iterators` 指定值，则必须为 `LoopCondition` 参数指定值。  
类型：字符串  
有效值：Boolean \$1 Integer \$1 String \$1 StringMap  
默认：字符串  
必需：否

LoopCondition  
由 `Variable` 和要评估的运算符条件组成。如果您没有为此参数指定值，则必须为 `Iterators` 和 `IteratorDataType` 参数指定值。您可以通过组合使用 `And`、`Not` 和 `Or` 运算符来使用复杂的运算符评估。循环中的步骤完成后会对条件进行评估。如果条件为 `true` 并且尚未达到 `MaxIterations` 值，则循环中的步骤将再次运行。运算符条件如下：  

**字符串运算**
+ 字符串等于
+ EqualsIgnoreCase
+ StartsWith
+ EndsWith
+ 包含

**数值运算**
+ NumericEquals
+ NumericGreater
+ NumericLesser
+ NumericGreaterOrEquals
+ NumericLesser
+ NumericLesserOrEquals

**布尔运算**
+ BooleanEquals
类型：StringMap  
必需：否

MaxIterations  
循环中步骤运行的最大次数。一旦达到为此输入指定的值，即使 `LoopCondition` 仍是 `true`，或者 `Iterators` 参数中仍然存在对象，循环也会停止运行。  
类型：整数  
有效值：1-100  
必需：否

Steps  
要在循环中运行的步骤列表。这些功能类似于嵌套运行手册。在这些步骤中，您可以使用语法 `{{loopStepName.CurrentIteratorValue}}` 访问 `for each` 循环的当前迭代器值。您还可以使用语法 `{{loopStepName.CurrentIteration}}` 访问两种循环类型的当前迭代的整数值。  
类型：步骤列表  
是否必需：是Output

CurrentIteration  
当前循环迭代为整数。迭代值从 1 开始。  
类型：整数

CurrentIteratorValue  
当前迭代器的值为字符串。此输出仅存在于 `for each` 循环中。  
类型：字符串

# `aws:pause` - 暂停自动化
<a name="automation-action-pause"></a>

此操作会暂停自动化。暂停后的自动化状态为*正在等待*。要继续自动化，请使用信号类型为 `Resume` 的 [SendAutomationSignal](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendAutomationSignal.html) API 操作。我们建议使用 `aws:sleep` 或 `aws:approve` 操作对您的工作流进行更精细的控制。

**注意**  
此操作的默认超时时间为 7 天（604800 秒），最长时间为 30 天（2592000 秒）。您可以通过指定 `aws:pause` 步骤的 `timeoutSeconds` 参数来限制或延长超时。

**Input**  
输入如下。

------
#### [ YAML ]

```
name: pauseThis
action: aws:pause
timeoutSeconds: 1209600
inputs: {}
```

------
#### [ JSON ]

```
{
    "name": "pauseThis",
    "action": "aws:pause",
    "timeoutSeconds": "1209600",
    "inputs": {}
}
```

------Output

无  


# `aws:runCommand` - 在托管实例上运行命令
<a name="automation-action-runcommand"></a>

运行指定的命令。

**注意**  
自动化仅支持 AWS Systems Manager Run Command 操作的一个*output*。一个运行手册可以包括多个 Run Command 操作，但一次仅一个操作支持 output。

**Input**  
此操作支持大多数 send command 参数。有关更多信息，请参阅 [SendCommand](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_SendCommand.html)。

------
#### [ YAML ]

```
- name: checkMembership
  action: 'aws:runCommand'
  inputs:
    DocumentName: AWS-RunPowerShellScript
    InstanceIds:
      - '{{InstanceIds}}'
    Parameters:
      commands:
        - (Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain
```

------
#### [ JSON ]

```
{
    "name": "checkMembership",
    "action": "aws:runCommand",
    "inputs": {
        "DocumentName": "AWS-RunPowerShellScript",
        "InstanceIds": [
            "{{InstanceIds}}"
        ],
        "Parameters": {
            "commands": [
                "(Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain"
            ]
        }
    }
}
```

------

DocumentName  
如果命令类型文档属于您或 AWS，请指定文档的名称。如果您使用的是另一个 AWS 账户与您共享的文档，指定文档的 Amazon Resource Name (ARN)。有关如何使用共享文档的更多信息，请参阅 [使用共享 SSM 文档](documents-ssm-sharing.md#using-shared-documents)。  
类型：字符串  
是否必需：是

InstanceIds  
要在其中运行命令的实例 ID。您可以指定最多 50 个 ID。  
您还可以使用虚拟参数 `{{RESOURCE_ID}}` 代替实例 ID，以便在目标组中的所有实例上运行命令。有关伪参数的更多信息，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。  
另一种替代方法是使用 `Targets` 参数向一组实例发送命令。`Targets` 参数接受 Amazon Elastic Compute Cloud (Amazon EC2) 标签。有关如何使用 `Targets` 参数的更多信息，请参阅 [大规模运行命令](send-commands-multiple.md)。  
类型：StringList  
必需：否（如果未指定实例 ID 或使用 `{{RESOURCE_ID}}` 虚拟参数，则必须指定 `Targets` 参数。）

Targets  
一组搜索条件，使用您指定的键/值组合来设置实例目标。如果未在调用中提供一个或多个实例 ID，则 `Targets` 为必需。有关如何使用 `Targets` 参数的更多信息，请参阅 [大规模运行命令](send-commands-multiple.md)。  
类型：MapList（列表中 map 的架构必须与对象匹配。） 有关更多信息，请参阅 *AWS Systems ManagerAPI 参考*中的[目标](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_Target.html)。  
必需：否（如果未指定 `Targets`，则必须指定实例 ID 或使用 `{{RESOURCE_ID}}` 虚拟参数。）  
以下为示例。  

```
- name: checkMembership
  action: aws:runCommand
  inputs:
    DocumentName: AWS-RunPowerShellScript
    Targets:
      - Key: tag:Stage
        Values:
          - Gamma
          - Beta
      - Key: tag-key
        Values:
          - Suite
    Parameters:
      commands:
        - (Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain
```

```
{
    "name": "checkMembership",
    "action": "aws:runCommand",
    "inputs": {
        "DocumentName": "AWS-RunPowerShellScript",
        "Targets": [                   
            {
                "Key": "tag:Stage",
                "Values": [
                    "Gamma", "Beta"
                ]
            },
            {
                "Key": "tag:Application",
                "Values": [
                    "Suite"
                ]
            }
        ],
        "Parameters": {
            "commands": [
                "(Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain"
            ]
        }
    }
}
```

Parameters  
文档中指定的必需参数和可选参数。  
类型：映射  
必需：否

CloudWatchOutputConfig  
用于将命令输出发送到 Amazon CloudWatch Logs 的配置选项。有关将命令输出发送到 CloudWatch Logs 的更多信息，请参阅 [为 Run Command 配置 Amazon CloudWatch Logs](sysman-rc-setting-up-cwlogs.md)。  
类型：StringMap（映射的架构必须与对象匹配。有关更多信息，请参阅 *AWS Systems ManagerAPI 参考* 中的 [CloudWatchOutputConfig](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CloudWatchOutputConfig.html)）。  
必需：否  
以下为示例。  

```
- name: checkMembership
  action: aws:runCommand
  inputs:
    DocumentName: AWS-RunPowerShellScript
    InstanceIds:
      - "{{InstanceIds}}"
    Parameters:
      commands:
        - "(Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain"
    CloudWatchOutputConfig:
      CloudWatchLogGroupName: CloudWatchGroupForSSMAutomationService
      CloudWatchOutputEnabled: true
```

```
{
    "name": "checkMembership",
    "action": "aws:runCommand",
    "inputs": {
        "DocumentName": "AWS-RunPowerShellScript",
        "InstanceIds": [
            "{{InstanceIds}}"
        ],
        "Parameters": {
            "commands": [
                "(Get-WmiObject -Class Win32_ComputerSystem).PartOfDomain"
            ]
        },
        "CloudWatchOutputConfig" : { 
                "CloudWatchLogGroupName": "CloudWatchGroupForSSMAutomationService",
                "CloudWatchOutputEnabled": true
        }
    }
}
```

Comment  
有关此命令的用户定义的信息。  
类型：字符串  
必需：否

DocumentHash  
文档的哈希。  
类型：字符串  
必需：否

DocumentHashType  
哈希的类型。  
类型：字符串  
有效值：`Sha256` \$1 `Sha1`  
必需：否

NotificationConfig  
用于发送通知的配置。  
必需：否

OutputS3BucketName  
命令输出响应的 S3 存储桶的名称。托管式节点必须具有 S3 存储桶的权限才能成功记录输出。  
类型：字符串  
必需：否

OutputS3KeyPrefix  
 前缀。  
类型：字符串  
必需：否

ServiceRoleArn  
AWS Identity and Access Management (IAM) 角色的 ARN。  
类型：字符串  
必需：否

TimeoutSeconds  
等待命令传递到实例上的 AWS Systems Manager SSM Agent 的时间（单位：秒）。如果在达到指定的值之前，命令未被实例上的 SSM Agent 接收，则命令的状态将更改为 `Delivery Timed Out`。  
类型：整数  
必需：否  
有效值：30-2592000Output

CommandId  
命令的 ID。

Status  
命令的状态。

ResponseCode  
命令的响应代码。如果运行的文档有多个步骤，则不会为此输出返回值。

Output  
命令的输出。如果您使用命令定位一个标记或多个实例，则不会返回 output 值。您可以使用 `GetCommandInvocation` 和 `ListCommandInvocations` API 操作来检索单个实例的输出。

# `aws:runInstances` – 启动 Amazon EC2 实例
<a name="automation-action-runinstance"></a>

启动新的 Amazon Elastic Compute Cloud (Amazon EC2) 实例。

**注意**  
`aws:runInstances` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
此操作支持大多数 API 参数。有关更多信息，请参阅 [RunInstances](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_RunInstances.html) API 文档。

------
#### [ YAML ]

```
name: launchInstance
action: aws:runInstances
maxAttempts: 3
timeoutSeconds: 1200
onFailure: Abort
inputs:
  ImageId: ami-12345678
  InstanceType: t2.micro
  MinInstanceCount: 1
  MaxInstanceCount: 1
  IamInstanceProfileName: myRunCmdRole
  TagSpecifications:
  - ResourceType: instance
    Tags:
    - Key: LaunchedBy
      Value: SSMAutomation
    - Key: Category
      Value: HighAvailabilityFleetHost
```

------
#### [ JSON ]

```
{
   "name":"launchInstance",
   "action":"aws:runInstances",
   "maxAttempts":3,
   "timeoutSeconds":1200,
   "onFailure":"Abort",
   "inputs":{
      "ImageId":"ami-12345678",
      "InstanceType":"t2.micro",
      "MinInstanceCount":1,
      "MaxInstanceCount":1,
      "IamInstanceProfileName":"myRunCmdRole",
      "TagSpecifications":[
         {
            "ResourceType":"instance",
            "Tags":[
               {
                  "Key":"LaunchedBy",
                  "Value":"SSMAutomation"
               },
               {
                  "Key":"Category",
                  "Value":"HighAvailabilityFleetHost"
               }
            ]
         }
      ]
   }
}
```

------

AdditionalInfo  
预留。  
类型：字符串  
必需：否

BlockDeviceMappings  
适用于实例的块储存设备。  
类型：MapList  
必需：否

ClientToken  
用于确保请求的幂等性的标识符。  
类型：字符串  
必需：否

DisableApiTermination  
打开或关闭实例 API 终止。  
类型：布尔值  
必需：否

EbsOptimized  
打开或关闭 Amazon Elastic Block Store (Amazon EBS) 优化。  
类型：布尔值  
必需：否

IamInstanceProfileArn  
针对实例的 AWS Identity and Access Management (IAM) 实例配置文件的 Amazon Resource Name (ARN)。  
类型：字符串  
必需：否

IamInstanceProfileName  
实例的 IAM 实例配置文件的名称。  
类型：字符串  
必需：否

ImageId  
Amazon Machine Image (AMI) 的 ID。  
类型：字符串  
是否必需：是

InstanceInitiatedShutdownBehavior  
指示此实例是否在系统关闭时停止或终止。  
类型：字符串  
必需：否

InstanceType  
实例类型。  
如果未提供实例类型值，则使用 m1.小型实例类型。
类型：字符串  
必需：否

KernelId  
内核的 ID。  
类型：字符串  
必需：否

KeyName  
密钥对的名称。  
类型：字符串  
必需：否

MaxInstanceCount  
要启动的实例的最大数量。  
类型：字符串  
必需：否

MetadataOptions  
实例的元数据选项。有关更多信息，请参阅 [InstanceMetadataOptionsRequest](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_InstanceMetadataOptionsRequest.html)。  
类型：StringMap  
必需：否

MinInstanceCount  
要启动的实例的最小数量。  
类型：字符串  
必需：否

监控  
打开或关闭详细监控。  
类型：布尔值  
必需：否

NetworkInterfaces  
网络接口。  
类型：MapList  
必需：否

放置  
实例的置放。  
类型：StringMap  
必需：否

PrivateIpAddress  
主要 IPv4 地址。  
类型：字符串  
必需：否

RamdiskId  
RAM 磁盘的 ID。  
类型：字符串  
必需：否

SecurityGroupIds  
实例的安全组的 ID。  
类型：StringList  
必需：否

SecurityGroups  
实例的安全组的名称。  
类型：StringList  
必需：否

SubnetId  
子网 ID。  
类型：字符串  
必需：否

TagSpecifications  
在启动期间应用于资源的标签。您只能在启动时标记实例和卷。指定的标签将应用于在启动期间创建的所有实例或卷。要在启动实例后对其进行标记，请使用 [`aws:createTags` - 为 AWS 资源创建标签](automation-action-createtag.md) 操作。  
类型：MapList（有关更多信息，请参阅 [TagSpecification](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_TagSpecification.html)。）  
必需：否

UserData  
作为字符串文本值提供的脚本。如果输入文本值，则必须为 Base64 编码。  
类型：字符串  
必需：否Output

InstanceIds  
实例的 ID。

InstanceState  
实例的当前状态。

# `aws:sleep` - 延迟自动化
<a name="automation-action-sleep"></a>

将自动化延迟指定的时间。此操作使用国际标准化组织 (ISO) 8601 日期和时间格式。有关此日期和时间格式的更多信息，请参阅 [ISO 8601](https://www.iso.org/iso-8601-date-and-time-format.html)。

**Input**  
您可将自动化延迟指定的时间。

------
#### [ YAML ]

```
name: sleep
action: aws:sleep
inputs:
  Duration: PT10M
```

------
#### [ JSON ]

```
{
   "name":"sleep",
   "action":"aws:sleep",
   "inputs":{
      "Duration":"PT10M"
   }
}
```

------

还可以将自动化延迟到指定日期和时间。如果指定日期和时间已过，操作将立即执行。

------
#### [ YAML ]

```
name: sleep
action: aws:sleep
inputs:
  Timestamp: '2020-01-01T01:00:00Z'
```

------
#### [ JSON ]

```
{
    "name": "sleep",
    "action": "aws:sleep",
    "inputs": {
        "Timestamp": "2020-01-01T01:00:00Z"
    }
}
```

------

**注意**  
自动化支持的最大延迟为 604799 秒（7 天）。

Duration  
ISO 8601 持续时间。您不能指定负数持续时间。  
类型：字符串  
必需：否

Timestamp  
ISO 8601 时间戳。如果您没有为此参数指定值，那么必须为 `Duration` 参数指定一个值。  
类型：字符串  
必需：否Output

无  


# `aws:updateVariable` – 更新运行手册变量的值
<a name="automation-action-update-variable"></a>

此操作会更新运行手册变量的值。值的数据类型必须与要更新的变量的数据类型相匹配。不支持数据类型转换。`aws:updateVariable` 操作不支持 `onCancel` 属性。

**Input**  
输入如下。

------
#### [ YAML ]

```
name: updateStringList
action: aws:updateVariable
inputs:
    Name: variable:variable name
    Value:
    - "1"
    - "2"
```

------
#### [ JSON ]

```
{
    "name": "updateStringList",
    "action": "aws:updateVariable",
    "inputs": {
        "Name": "variable:variable name",
        "Value": ["1","2"]
    }
}
```

------

名称  
要更新其值的变量名称。必须使用格式 `variable:variable name`  
类型：字符串  
是否必需：是

值  
要分配给变量的新值。值必须与变量的数据类型相匹配。不支持数据类型转换。  
类型：Boolean \$1 Integer \$1 MapList \$1 String \$1 StringList \$1 StringMap  
是否必需：是  
约束：  
+ MapList 最多可以包含 200 个项目。
+ 密钥长度的最小长度可以为 1，最大长度可以为 50。
+ StringList 最少可以为 0 项，最多可以为 50 项。
+ 字符串长度的最小长度可以为 1，最大长度可以为 512。Output

无  


# `aws:waitForAwsResourceProperty` - 等待 AWS 资源属性
<a name="automation-action-waitForAwsResourceProperty"></a>

`aws:waitForAwsResourceProperty` 操作可以让自动化等待特定的资源状态或事件状态，然后才继续自动化。有关如何使用此操作的更多示例，请参阅 [其他运行手册示例](automation-document-examples.md)。

**注意**  
此操作的默认超时值为 3600 秒（1 小时）。您可以通过指定 `aws:waitForAwsResourceProperty` 步骤的 `timeoutSeconds` 参数来限制或延长超时。有关如何使用此操作的更多信息和示例，请参阅 [处理运行手册中的超时](automation-handling-timeouts.md)。

**注意**  
`aws:waitForAwsResourceProperty` 操作支持自动节流重试。有关更多信息，请参阅 [为节流的操作配置自动重试](automation-throttling-retry.md)。

**Input**  
由您选择的 API 操作定义的输入。

------
#### [ YAML ]

```
action: aws:waitForAwsResourceProperty
inputs:
  Service: The official namespace of the service
  Api: The API operation or method name
  API operation inputs or parameters: A value
  PropertySelector: Response object
  DesiredValues:
  - Desired property value
```

------
#### [ JSON ]

```
{
  "action": "aws:waitForAwsResourceProperty",
  "inputs": {
    "Service":"The official namespace of the service",
    "Api":"The API operation or method name",
    "API operation inputs or parameters":"A value",
    "PropertySelector": "Response object",
    "DesiredValues": [
      "Desired property value"
    ]
  }
}
```

------

服务  
包含要运行的 API 操作的 AWS 服务命名空间。例如，AWS Systems Manager 的命名空间为 `ssm`。Amazon Elastic Compute Cloud (Amazon EC2) 的命名空间为 `ec2`。您可以在《AWS CLI 命令参考》的[可用服务](https://docs.aws.amazon.com/cli/latest/reference/#available-services)部分查看支持的 AWS 服务命名空间列表。  
类型：字符串  
是否必需：是

API  
要运行的 API 操作的名称。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看 API 操作（也称为方法）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon Relational Database Service (Amazon RDS) 的所有 API 操作（方法）。  
类型：字符串  
是否必需：是

API 操作输入  
一个或多个 API 操作输入。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看可用的输入（也称为参数）。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法。选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法并向下滚动以查看可用的参数，例如 **DBInstanceIdentifier**、**Name** 和 **Values**。  

```
inputs:
  Service: The official namespace of the service
  Api: The API operation name
  API input 1: A value
  API Input 2: A value
  API Input 3: A value
```

```
"inputs":{
      "Service":"The official namespace of the service",
      "Api":"The API operation name",
      "API input 1":"A value",
      "API Input 2":"A value",
      "API Input 3":"A value"
}
```
类型：由选择的 API 操作确定  
是否必需：是

PropertySelector  
响应对象中特定属性的 JSONPath。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看响应对象。在要调用的服务的**客户端**部分中选择一种方法。例如，下面的 [Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)页面中列出了 Amazon RDS 的所有方法：选择 [describe\$1db\$1instances](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html#RDS.Client.describe_db_instances) 方法，然后向下滚动到**响应结构**部分。**DBInstances** 被列为响应对象。  
类型：字符串  
是否必需：是

DesiredValues  
要继续自动化的预期状态。  
类型：MapList、StringList  
是否必需：是

# 自动化系统变量
<a name="automation-variables"></a>

AWS Systems Manager 自动化运行手册使用以下变量。有关如何使用这些变量的示例，请查看 `AWS-UpdateWindowsAmi` 运行手册的 JSON 源。

**查看 `AWS-UpdateWindowsAmi` 运行手册的 JSON 源**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在文档列表中，使用“搜索栏”或“搜索栏”右侧的数字选择运行手册 `AWS-UpdateWindowsAmi`。

1. 选择**内容**选项卡。

**系统变量**  
自动化运行手册目前支持以下系统变量。


****  

| Variable | 详细信息 | 
| --- | --- | 
|  `global:ACCOUNT_ID`  |  在其中运行自动化的用户或角色的 AWS 账户 ID。  | 
|  `global:DATE`  |  格式为 yyyy-MM-dd 的日期（运行时间）。  | 
|  `global:DATE_TIME`  |  格式为 yyyy-MM-dd\$1HH.mm.ss 的日期和时间（运行时间）。  | 
|  `global:AWS_PARTITION`  |  资源所处的分区。对于标准 AWS 区域，分区是 `aws`。对于位于其他分区中的资源，则分区是 `aws-partitionname`。例如，AWS GovCloud (US-West) 区域中资源的区域为 `aws-us-gov`。  | 
|  `global:REGION`  |  运行手册在其中运行的区域。例如，us-east-2。  | 

**自动化变量**  
自动化运行手册支持以下自动化变量。


****  

| Variable | 详细信息 | 
| --- | --- | 
|  `automation:EXECUTION_ID`  |  分配给当前自动化的唯一标识符。例如，`1a2b3c-1a2b3c-1a2b3c-1a2b3c1a2b3c1a2b3c`。  | 

**Topics**
+ [术语](#automation-terms)
+ [支持的场景](#automation-variables-support)
+ [不支持的场景](#automation-variables-unsupported)

## 术语
<a name="automation-terms"></a>

以下术语描述了如何解析变量和参数。


****  

| 租期 | 定义 | 示例 | 
| --- | --- | --- | 
|  常量 ARN  |  无变量的有效 Amazon Resource Name (ARN)。  |  `arn:aws:iam::123456789012:role/roleName`  | 
|  运行手册参数  |  在运行手册级别定义的参数（例如 `instanceId`）。可在替换基本字符串时使用该参数。系统会在启动执行时间提供该参数的值。  |  <pre>{ <br />   "description": "Create Image Demo",<br />   "version": "0.3",<br />   "assumeRole": "Your_Automation_Assume_Role_ARN",<br />   "parameters":{ <br />      "instanceId": { <br />         "type": "String",<br />         "description": "Instance to create image from"<br />   }<br />}</pre>  | 
|  系统变量  |  在评估运行手册的任何部分时，被替换到运行手册中的常规变量。  |  <pre>"activities": [ <br />   { <br />      "id": "copyImage",<br />      "activityType": "AWS-CopyImage",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": { <br />         "ImageName": "{{imageName}}",<br />         "SourceImageId": "{{sourceImageId}}",<br />         "SourceRegion": "{{sourceRegion}}",<br />         "Encrypted": true,<br />         "ImageDescription": "Test CopyImage Description created on {{global:DATE}}"<br />      }<br />   }<br />]</pre>  | 
|  自动化变量  |  在评估运行手册的任何部分时，被替换到运行手册中且与自动化执行相关的变量。  |  <pre>{ <br />   "name": "runFixedCmds",<br />   "action": "aws:runCommand",<br />   "maxAttempts": 1,<br />   "onFailure": "Continue",<br />   "inputs": { <br />      "DocumentName": "AWS-RunPowerShellScript",<br />      "InstanceIds": [ <br />         "{{LaunchInstance.InstanceIds}}"<br />      ],<br />      "Parameters": { <br />         "commands": [ <br />            "dir",<br />            "date",<br />            "“{{outputFormat}}” -f “left”,”right”,”{{global:DATE}}”,”{{automation:EXECUTION_ID}}”<br />         ]<br />      }<br />   }<br />}</pre>  | 
|  Systems Manager 参数  |  在 AWS Systems Manager Parameter Store 内定义的变量。该参数不能在步骤输入中直接引用。访问该参数可能需要权限。  |  <pre><br />description: Launch new Windows test instance<br />schemaVersion: '0.3'<br />assumeRole: '{{AutomationAssumeRole}}'<br />parameters:<br />  AutomationAssumeRole:<br />    type: String<br />    default: ''<br />    description: >-<br />      (Required) The ARN of the role that allows Automation to perform the<br />      actions on your behalf. If no role is specified, Systems Manager<br />      Automation uses your IAM permissions to run this runbook.<br />  LatestAmi:<br />    type: String<br />    default: >-<br />      {{ssm:/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base}}<br />    description: The latest Windows Server 2016 AMI queried from the public parameter.<br />mainSteps:<br />  - name: launchInstance<br />    action: 'aws:runInstances'<br />    maxAttempts: 3<br />    timeoutSeconds: 1200<br />    onFailure: Abort<br />    inputs:<br />      ImageId: '{{LatestAmi}}'<br />...</pre>  | 

## 支持的场景
<a name="automation-variables-support"></a>


****  

| 场景 | 注释 | 示例 | 
| --- | --- | --- | 
|  创建时的常量 ARN `assumeRole`。  |  执行授权检查来验证是否允许调用用户传递给定的 `assumeRole`。  |  <pre>{<br />  "description": "Test all Automation resolvable parameters",<br />  "schemaVersion": "0.3",<br />  "assumeRole": "arn:aws:iam::123456789012:role/roleName",<br />  "parameters": { <br />  ...</pre>  | 
|  启动自动化时为 `AssumeRole` 提供的运行手册参数。  |  必须在运行手册的参数列表中定义。  |  <pre>{<br />  "description": "Test all Automation resolvable parameters",<br />  "schemaVersion": "0.3",<br />  "assumeRole": "{{dynamicARN}}",<br />  "parameters": {<br /> ...</pre>  | 
|  启动时为运行手册参数提供的值。  |  客户提供要用于参数的值。需在运行手册的参数列表中定义在启动时提供的所有输入。  |  <pre>...<br />"parameters": {<br />    "amiId": {<br />      "type": "String",<br />      "default": "ami-12345678",<br />      "description": "list of commands to run as part of first step"<br />    },<br />...</pre> “启动自动化执行”的输入包括：`{"amiId" : ["ami-12345678"] }`  | 
|  在运行手册内容中引用的 Systems Manager 参数。  |  变量存在于客户账户中，或者是公开访问的参数，并且运行手册的 `AssumeRole` 有权访问该变量。创建时将执行检查，以确认 `AssumeRole` 都不能访问它。不能在步骤输入中直接引用参数。  |  <pre><br />...<br />parameters:<br />    LatestAmi:<br />    type: String<br />    default: >-<br />      {{ssm:/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base}}<br />    description: The latest Windows Server 2016 AMI queried from the public parameter.<br />mainSteps:<br />  - name: launchInstance<br />    action: 'aws:runInstances'<br />    maxAttempts: 3<br />    timeoutSeconds: 1200<br />    onFailure: Abort<br />    inputs:<br />      ImageId: '{{LatestAmi}}'<br />...</pre>  | 
|  在步骤定义中引用的系统变量  |  启动自动化时被替换到运行手册中的系统变量。注入到运行手册中的值与替换发生的时间相关。换言之，由于在运行步骤之间需要花费一定时间，因此在步骤 1 中注入的时间变量的值将与在步骤 3 中注入的值不同。无需在运行手册的参数列表中设置系统变量。  |  <pre>...<br />  "mainSteps": [<br />    {<br />      "name": "RunSomeCommands",<br />      "action": "aws:runCommand",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "DocumentName": "AWS:RunPowerShell",<br />        "InstanceIds": ["{{LaunchInstance.InstanceIds}}"],<br />        "Parameters": {<br />            "commands" : [<br />                "echo {The time is now {{global:DATE_TIME}}}"<br />            ]<br />        }<br />    }<br />}, ... </pre>  | 
|  在步骤定义中引用的自动化变量。  |  无需在运行手册的参数列表中设置自动化变量。唯一的受支持自动化变量是 **自动化:EXECUTION\$1ID**。  |  <pre>...<br />"mainSteps": [<br />    {<br />      "name": "invokeLambdaFunction",<br />      "action": "aws:invokeLambdaFunction",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "FunctionName": "Hello-World-LambdaFunction",<br /><br />"Payload" : "{ "executionId" : "{{automation:EXECUTION_ID}}" }"<br />      }<br />    }<br />... </pre>  | 
|  在下一步的定义中参考上一步的输出。  |  这是一个参数重定向。可使用语法 `{{stepName.OutputName}}` 引用上一步的输出。客户不能将该语法用于运行手册参数。在引用步骤运行时解决此问题。运行手册的参数中未列出该参数。  |  <pre>...<br />"mainSteps": [<br />    {<br />      "name": "LaunchInstance",<br />      "action": "aws:runInstances",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "ImageId": "{{amiId}}",<br />        "MinInstanceCount": 1,<br />        "MaxInstanceCount": 2<br />      }<br />    },<br />    {<br />      "name":"changeState",<br />      "action": "aws:changeInstanceState",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "InstanceIds": ["{{LaunchInstance.InstanceIds}}"],<br />        "DesiredState": "terminated"<br />      }<br />    }<br /><br />... </pre>  | 

## 不支持的场景
<a name="automation-variables-unsupported"></a>


****  

| 场景 | 注释 | 示例 | 
| --- | --- | --- | 
|  为 `assumeRole` 提供的 Systems Manager 参数创建时  |  不支持。  |  <pre>...<br /><br />{<br />  "description": "Test all Automation resolvable parameters",<br />  "schemaVersion": "0.3",<br />  "assumeRole": "{{ssm:administratorRoleARN}}",<br />  "parameters": {<br /><br />... </pre>  | 
|  步骤输入中直接引用的 Systems Manager 参数。  |  在创建时返回 `InvalidDocumentContent` 异常。  |  <pre><br />...<br />mainSteps:<br />  - name: launchInstance<br />    action: 'aws:runInstances'<br />    maxAttempts: 3<br />    timeoutSeconds: 1200<br />    onFailure: Abort<br />    inputs:<br />      ImageId: '{{ssm:/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base}}'<br />...</pre>  | 
|  变量步骤定义  |  运行手册中步骤的定义由变量构建而成。  |  <pre>...<br /><br />"mainSteps": [<br />    {<br />      "name": "LaunchInstance",<br />      "action": "aws:runInstances",<br />      "{{attemptModel}}": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "ImageId": "ami-12345678",<br />        "MinInstanceCount": 1,<br />        "MaxInstanceCount": 2<br />      }<br /><br />...<br /><br />User supplies input : { "attemptModel" : "minAttempts" } </pre>  | 
|  交叉引用运行手册参数  |  用户在启动时提供了输入参数，而该参数引用了运行手册中的另一参数。  |  <pre>...<br />"parameters": {<br />    "amiId": {<br />      "type": "String",<br />      "default": "ami-7f2e6015",<br />      "description": "list of commands to run as part of first step"<br />    },<br />    "alternateAmiId": {<br />      "type": "String",<br />      "description": "The alternate AMI to try if this first fails".<br /><br />"default" : "{{amiId}}"<br />    },<br /><br />... </pre>  | 
|  多层扩展  |  运行手册定义了评估变量名称的变量。它位于变量分隔符（即 *\$1\$1 \$1\$1*）内，并扩展为变量/参数的值。  |  <pre>...<br />  "parameters": {<br />    "firstParameter": {<br />      "type": "String",<br />      "default": "param2",<br />      "description": "The parameter to reference"<br />    },<br />    "secondParameter": {<br />      "type": "String",<br />      "default" : "echo {Hello world}",<br />      "description": "What to run"<br />    }<br />  },<br />  "mainSteps": [{<br />      "name": "runFixedCmds",<br />      "action": "aws:runCommand",<br />      "maxAttempts": 1,<br />      "onFailure": "Continue",<br />      "inputs": {<br />        "DocumentName": "AWS-RunPowerShellScript",<br /><br />"InstanceIds" : "{{LaunchInstance.InstanceIds}}",<br />        "Parameters": {<br />          "commands": [ "{{ {{firstParameter}} }}"]<br /><br />}<br /><br />...<br /><br />Note: The customer intention here would be to run a command of "echo {Hello world}" </pre>  | 
|  引用属于不同变量类型的运行手册步骤的输出  |  用户在后续步骤中引用前面运行手册步骤的输出。输出是一个不符合后续步骤中的操作要求的变量类型。  |  <pre>...<br />mainSteps:<br />- name: getImageId<br />  action: aws:executeAwsApi<br />  inputs:<br />    Service: ec2<br />    Api: DescribeImages<br />    Filters:  <br />    - Name: "name"<br />      Values: <br />      - "{{ImageName}}"<br />  outputs:<br />  - Name: ImageIdList<br />    Selector: "$.Images"<br />    Type: "StringList"<br />- name: copyMyImages<br />  action: aws:copyImage<br />  maxAttempts: 3<br />  onFailure: Abort<br />  inputs:<br />    SourceImageId: {{getImageId.ImageIdList}}<br />    SourceRegion: ap-northeast-2<br />    ImageName: Encrypted Copies of LAMP base AMI in ap-northeast-2<br />    Encrypted: true <br />... <br />Note: You must provide the type required by the Automation action. <br />In this case, aws:copyImage requires a "String" type variable but the preceding step outputs a "StringList" type variable.<br />                                        </pre>  | 

# 创建您自己的运行手册
<a name="automation-documents"></a>

自动化运行手册定义了自动化运行时 Systems Manager 在托管实例和其他 AWS 资源上执行的*操作*。Automation 是 AWS Systems Manager 中的一项工具。运行手册包含一个或多个按顺序运行的步骤。每个步骤是根据单个操作生成的。可以将一个步骤的输出作为后面步骤的输入。

运行这些操作及其步骤的过程称为*自动化*。

让您可以在 AWS 环境中自动完成各种不同操作的运行手册支持的操作类型。例如，通过使用 `executeScript` 操作类型，您可以直接在运行手册中嵌入 Python 或 PowerShell 脚本。（在创建自定义运行手册时，您可以按内联方式添加脚本，或者从 S3 存储桶或本地计算机中附加脚本。） 您可以使用 `createStack` 和 `deleteStack` 操作类型自动管理 AWS CloudFormation 资源。此外，通过使用 `executeAwsApi` 操作类型，步骤可以在任意 AWS 服务中运行*任意* API 操作，包括创建或删除 AWS 资源、启动其他进程、触发通知等。

有关自动化支持的所有 20 种操作类型的列表，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

AWS Systems Manager 自动化提供了几个包含预定义步骤的文档，您可以使用这些步骤执行常见任务，例如重新启动一个或多个 Amazon Elastic Compute Cloud (Amazon EC2) 实例或创建 Amazon Machine Image (AMI)。您还可以创建自己的运行手册并与其他 AWS 账户 共享，或者向所有自动化用户公开。

运行手册是使用 YAML 或 JSON 编写的。但是，通过使用 Systems Manager 自动化中的**文档生成器**，您可以创建运行手册，而无需使用本机 JSON 或 YAML 创作。

**重要**  
如果您运行使用 AWS Identity and Access Management (IAM) 服务角色调用其他服务的自动化工作流程，请注意必须使用权限将该服务角色配置为调用这些服务。该要求适用于所有 AWS 自动化运行手册（`AWS-*` 运行手册），例如 `AWS-ConfigureS3BucketLogging`、`AWS-CreateDynamoDBBackup` 和 `AWS-RestartEC2Instance` 运行手册等。对于您创建的任何自定义自动化运行手册，如果这些文档使用调用其他服务的操作来调用其他 AWS 服务，则此要求同样适用。例如，如果使用 `aws:executeAwsApi`、`aws:createStack` 或 `aws:copyImage` 操作，则您必须配置具有权限的服务角色来调用这些服务。您可以将 IAM 内联策略添加到该角色，从而向其他 AWS 服务授予权限。有关更多信息，请参阅 [（可选）添加自动化内联策略或客户管理型策略来调用其他 AWS 服务](automation-setup-iam.md#add-inline-policy)。

有关可在运行手册中指定的操作的信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

有关使用 AWS Toolkit for Visual Studio Code 创建运行手册的信息，请参阅 *《AWS Toolkit for Visual Studio Code 用户指南》* 中的 [使用 Systems Manager 自动化文档](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/systems-manager-automation-docs.html)。

有关使用视觉设计器创建自定义运行手册的信息，请参阅 [自动化运行手册的视觉对象设计体验](automation-visual-designer.md)。

**Contents**
+ [自动化运行手册的视觉对象设计体验](automation-visual-designer.md)
  + [视觉对象设计体验界面概述](visual-designer-interface-overview.md)
    + [操作浏览器](visual-designer-interface-overview.md#visual-designer-actions)
    + [Canvas](visual-designer-interface-overview.md#visual-designer-canvas)
    + [表单](visual-designer-interface-overview.md#visual-designer-form)
    + [键盘快捷键](visual-designer-interface-overview.md#visual-designer-keyboard-shortcuts)
  + [使用视觉对象设计体验](visual-designer-use.md)
    + [创建运行手册工作流程](visual-designer-use.md#visual-designer-create-runbook-workflow)
    + [设计运行手册](visual-designer-use.md#visual-designer-build)
    + [更新运行手册](visual-designer-use.md#visual-designer-update-runbook)
    + [导出运行手册](visual-designer-use.md#visual-designer-export-runbook)
  + [配置操作的输入和输出](visual-designer-action-inputs-outputs.md)
    + [为操作提供输入数据](visual-designer-action-inputs-outputs.md#providing-input)
    + [定义操作的输出数据](visual-designer-action-inputs-outputs.md#defining-output)
  + [视觉对象设计体验中的错误处理](visual-designer-error-handling.md)
    + [出现错误时重试操作](visual-designer-error-handling.md#retry-actions)
    + [超时](visual-designer-error-handling.md#timeout-seconds)
    + [失败的操作](visual-designer-error-handling.md#failure-actions)
    + [取消的操作](visual-designer-error-handling.md#cancel-actions)
    + [关键操作](visual-designer-error-handling.md#critical-actions)
    + [结束操作](visual-designer-error-handling.md#end-actions)
  + [教程：使用视觉对象设计体验创建运行手册](visual-designer-tutorial.md)
    + [步骤 1：导航到视觉对象设计体验](visual-designer-tutorial.md#navigate-console)
    + [步骤 2：创建工作流程](visual-designer-tutorial.md#create-workflow)
    + [步骤 3：查看自动生成的代码](visual-designer-tutorial.md#view-generated-code)
    + [步骤 4：运行新的运行手册](visual-designer-tutorial.md#use-tutorial-runbook)
    + [第 5 步：清理](visual-designer-tutorial.md#cleanup-tutorial-runbook)
+ [创作自动化运行手册](automation-authoring-runbooks.md)
  + [识别您的使用案例](automation-authoring-runbooks.md#automation-authoring-runbooks-use-case)
  + [设置开发环境](automation-authoring-runbooks.md#automation-authoring-runbooks-environment)
  + [开发运行手册内容](automation-authoring-runbooks.md#automation-authoring-runbooks-developing-content)
  + [示例 1：创建父子运行手册](automation-authoring-runbooks-parent-child-example.md)
    + [创建子运行手册](automation-authoring-runbooks-parent-child-example.md#automation-authoring-runbooks-child-runbook)
    + [创建父运行手册](automation-authoring-runbooks-parent-child-example.md#automation-authoring-runbooks-parent-runbook)
  + [示例 2：脚本化运行手册](automation-authoring-runbooks-scripted-example.md)
  + [其他运行手册示例](automation-document-examples.md)
    + [部署 VPC 架构和 Microsoft Active Directory 域控制器](automation-document-architecture-deployment-example.md)
    + [从最新快照还原根卷](automation-document-instance-recovery-example.md)
    + [创建 AMI 和跨区域副本](automation-document-backup-maintenance-example.md)
+ [创建填充 AWS 资源的输入参数](populating-input-parameters.md)
+ [正在使用文档生成器创建运行手册](automation-document-builder.md)
  + [使用文档生成器创建运行手册](automation-document-builder.md#create-runbook)
  + [创建运行脚本的运行手册](automation-document-builder.md#create-runbook-scripts)
+ [在运行手册中使用脚本](automation-document-script-considerations.md)
  + [使用运行手册的权限](automation-document-script-considerations.md#script-permissions)
  + [将脚本添加到运行手册](automation-document-script-considerations.md#adding-scripts)
  + [运行手册的脚本限制](automation-document-script-considerations.md#script-constraints)
+ [在运行手册中使用条件语句](automation-branch-condition.md)
  + [使用 `aws:branch` 操作](automation-branch-condition.md#branch-action-explained)
    + [在运行手册中创建 `aws:branch` 步骤](automation-branch-condition.md#create-branch-action)
      + [关于创建输出变量](automation-branch-condition.md#branch-action-output)
    + [示例 `aws:branch` 运行手册](automation-branch-condition.md#branch-runbook-examples)
    + [使用运算符创建复杂的分支自动化](automation-branch-condition.md#branch-operators)
  + [如何使用条件选项的示例](automation-branch-condition.md#conditional-examples)
+ [使用操作输出作为输入](automation-action-outputs-inputs.md)
  + [在运行手册中使用 JSONPath](automation-action-outputs-inputs.md#automation-action-json-path)
+ [为 Automation 创建 Webhook 集成](creating-webhook-integrations.md)
  + [创建集成（控制台）](creating-webhook-integrations.md#creating-integrations-console)
  + [创建集成（命令行）](creating-webhook-integrations.md#creating-integrations-commandline)
  + [为集成创建 Webhooks](creating-webhook-integrations.md#creating-webhooks)
+ [处理运行手册中的超时](automation-handling-timeouts.md)

# 自动化运行手册的视觉对象设计体验
<a name="automation-visual-designer"></a>

AWS Systems Manager Automation 提供低代码的视觉对象设计体验，可帮助您创建自动化运行手册。视觉对象设计体验提供拖放界面，可以选择添加自己的代码，这样您就可以更轻松地创建和编辑运行手册。借助视觉对象设计体验，您可以执行以下操作：
+ 控制条件语句。
+ 控制如何筛选或转换每个操作的输入和输出。
+ 配置错误处理。
+ 制作新运行手册的原型。
+ 使用原型运行手册作为采用 AWS Toolkit for Visual Studio Code 进行本地开发的起点。

创建或编辑运行手册时，您可以从 [Automation 控制台](https://console.aws.amazon.com/systems-manager/automation/home?region=us-east-1#/)访问视觉对象设计体验。创建运行手册时，视觉对象设计体验会验证您的工作并自动生成代码。您可以查看生成的代码，也可以将其导出以供本地开发。完成后，您可以保存并运行运行手册以及在 Systems Manager Automation 控制台中检查结果。

**Topics**
+ [界面概述](visual-designer-interface-overview.md)
+ [使用视觉对象设计体验](visual-designer-use.md)
+ [配置输入和输出](visual-designer-action-inputs-outputs.md)
+ [视觉对象设计体验中的错误处理](visual-designer-error-handling.md)
+ [教程：使用视觉对象设计体验创建运行手册](visual-designer-tutorial.md)

# 视觉对象设计体验界面概述
<a name="visual-designer-interface-overview"></a>

Systems Manager Automation 的视觉对象设计体验是一种低代码的视觉对象工作流程设计器，可帮助您创建自动化运行手册。

通过界面组件的概述了解视觉对象设计体验：

![\[视觉对象设计体验组件\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_overview.png)

+ **操作**浏览器包含**操作**、**AWS API** 和**运行手册**选项卡。
+ 在*画布*中，您可以将操作拖放到工作流程图中、更改操作顺序以及选择要配置或查看的操作。
+ 在**表单**面板中，您可以查看和编辑在画布上选择的任何操作的属性。选择**内容**开关以查看运行手册的 YAML 或 JSON，并突出显示当前选定的操作。

当您需要帮助时，**信息**链接会打开一个包含上下文信息的面板。这些面板还包括指向 Systems Manager Automation 文档中相关主题的链接。

## 操作浏览器
<a name="visual-designer-actions"></a>

在**操作**浏览器中，您可以选择要拖放到工作流程图中的操作。您可以使用**操作**浏览器顶部的搜索字段搜索所有操作。**操作**浏览器包含以下选项卡：
+ **操作**选项卡提供了自动化操作列表，您可以将这些操作拖放到画布中运行手册的工作流程图中。
+ **AWS API** 选项卡提供了 AWS API 列表，您可以将这些 API 拖放到画布中运行手册的工作流程图中。
+ **运行手册**选项卡提供了几个随时可用、可重复使用的运行手册作为构建块，您可以将其用于各种用例。例如，您可以使用运行手册在工作流程中对 Amazon EC2 实例执行常见的修复任务，而无需重新创建相同的操作。

![\[视觉对象设计体验操作浏览器\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_actions_multi_view.png)


## Canvas
<a name="visual-designer-canvas"></a>

选择要添加到自动化中的操作后，将其拖动到画布并放入工作流程图中。您还可以拖放操作，将其移动到运行手册工作流程中的不同位置。如果您的工作流程很复杂，您可能无法在画布面板上查看其所有内容。使用画布顶部的控件来放大或缩小。要查看工作流程的不同部分，您可以在画布中拖动工作流程图。

在**操作**浏览器中拖动一项操作，将其放入运行手册的工作流程图中。有一条线将显示其在您工作流程中的放置位置。要更改操作的顺序，您可以将其拖动到工作流程中的其他位置。新操作已添加到您的工作流程中，其代码已自动生成。

![\[视觉对象设计体验画布\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_canvas.png)


## 表单
<a name="visual-designer-form"></a>

在运行手册工作流程中添加操作后，您可以对其进行配置以满足您的用例。选择希望配置的操作，您将在**表单**面板中看到其参数和选项。您还可以通过选择**内容**开关来查看 YAML 或 JSON 代码。与您所选操作关联的代码会突出显示。

![\[视觉对象设计体验表单面板\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_form.png)


![\[视觉对象设计体验内容面板\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_content.png)


## 键盘快捷键
<a name="visual-designer-keyboard-shortcuts"></a>

视觉对象设计体验支持下表中所示的键盘快捷键。


| 键盘快捷键 | 函数 | 
| --- | --- | 
| Ctrl\$1Z | 撤销上次的操作。 | 
| Ctrl\$1Shift\$1Z | 重做上次的操作。 | 
| Alt\$1C | 将工作流程置于画布中心。 | 
| 退格键 | 删除所有选定状态。 | 
| 删除 | 删除所有选定状态。 | 
| Ctrl\$1D | 复制所选状态。 | 

# 使用视觉对象设计体验
<a name="visual-designer-use"></a>

学习使用视觉对象设计体验创建、编辑和运行运行手册工作流程。工作流程准备就绪后，您可以将其保存或导出。您还可以使用视觉对象设计体验进行快速原型制作。

## 创建运行手册工作流程
<a name="visual-designer-create-runbook-workflow"></a>

1. 登录 [Systems Manager Automation 控制台](https://console.aws.amazon.com/systems-manager/automation/home?region=us-east-1#/)。

1. 选择**创建运行手册**。

1. 在**名称**方框中，输入运行手册的名称，例如 `MyNewRunbook`。

1. 在**设计**和**代码**切换开关旁边，选择铅笔图标并输入运行手册的名称。

现在，您可以为新的运行手册设计工作流程。

## 设计运行手册
<a name="visual-designer-build"></a>

 要使用视觉对象设计体验设计运行手册工作流程，您可以将自动化操作从**操作**浏览器拖动到画布中，将其放置在运行手册工作流程中所需的位置。您也可以通过将操作拖动到不同的位置来重新排序工作流程中的操作。当您将操作拖动到画布上时，工作流程中可以放置该操作的任何位置都会显示一条线。将操作放入画布后，其代码将自动生成并添加到运行手册的内容中。

如果您知道希望添加的操作的名称，请使用**操作**浏览器顶部的搜索框来查找该操作。

将操作放入画布后，使用右侧的**表单**面板对其进行配置。此面板包含您在画布上放置的每个自动化操作或 API 操作的**常规**、**输入**、**输出**和**配置**选项卡。例如，**常规**选项卡由以下部分组成：
+ **步骤名称**用于标识该步骤。为步骤名称指定唯一值。
+ **描述**可帮助您描述在运行手册的工作流程中操作正在执行的内容。

**输入**选项卡包含因操作而异的字段。例如，`aws:executeScript` 自动化操作由以下部分组成：
+ **运行时系统**是运行所提供脚本的语言。
+ **处理程序**是函数的名称。您必须确保在处理程序中定义的函数具有两个参数：`events` 和 `context`。PowerShell 运行时系统不支持此参数。
+ **脚本**是您想要在工作流程期间运行的嵌入式脚本。
+ （可选）**附件**适用于可由操作调用的独立脚本或 .zip 文件。对于 JSON 运行手册，此参数为必需项。

**输出**选项卡可帮助您指定希望从操作中输出的值。您可以在工作流程的后续操作中引用输出值，也可以根据操作生成输出以用于日志记录。并非所有操作都将有**输出**选项卡，因为并非所有操作都支持输出。例如，`aws:pause` 操作就不支持输出。对于支持输出的操作，**输出**选项卡由以下部分组成：
+ **名称**是用于输出值的名称。您可以在工作流程的后续操作中引用输出。
+ **选择器**是以 `"$."` 开头的 JSONPath 表达式字符串，用于选择 JSON 元素中的一个或多个组件。
+ **类型**是输出值的数据类型。例如，`String` 或 `Integer` 数据类型。

**配置**选项卡包含所有自动化操作均可使用的属性和选项。该操作由以下部分组成：
+ **最大尝试次数**属性是操作失败时重试的次数。
+ **超时秒数**属性指定操作的超时值。
+ **至关重要**属性确定操作失败是否会停止整个自动化。
+ **下一步**属性确定自动化在运行手册中接下来要执行的操作。
+ **失败时**属性确定操作失败时自动化在运行手册中接下来要执行的操作。
+ **取消时**属性确定用户取消自动操作时自动化在运行手册中接下来要执行的操作。

要删除操作，您可以使用画布上方工具栏中的退格键，或者右键单击并选择**删除操作**。

随着工作流程的发展，其可能不适合画布。为帮助使工作流程适合画布，请尝试以下选项之一：
+ 使用侧面板上的控件调整面板大小或关闭面板。
+ 使用画布顶部的工具栏放大或缩小工作流程图。

## 更新运行手册
<a name="visual-designer-update-runbook"></a>

您可以通过创建新版本的运行手册来更新现有的运行手册工作流程。可以通过使用视觉对象设计体验或直接编辑代码来更新运行手册。要更新现有运行手册，请参照以下过程：

1. 登录 [Systems Manager Automation 控制台](https://console.aws.amazon.com/systems-manager/automation/home?region=us-east-1#/)。

1. 选择要更新的运行手册。

1. 选择 **Create new version**。

1. 视觉对象设计体验有两个窗格：代码窗格和视觉对象工作流程窗格。在视觉对象工作流程窗格中选择**设计**，以使用视觉对象设计体验编辑您的工作流程。完成后，选择**创建新版本**以保存更改并退出。

1. （可选）使用代码窗格以 YAML 或 JSON 格式编辑运行手册内容。

## 导出运行手册
<a name="visual-designer-export-runbook"></a>

要导出运行手册的工作流程 YAML 或 JSON 代码以及工作流程图，请参照以下过程：

1. 在**文档**控制台中选择您的运行手册。

1. 选择 **Create new version**。

1. 在**操作**下拉菜单中，选择是否要导出图表或运行手册，以及您喜欢的格式。

# 配置操作的输入和输出
<a name="visual-designer-action-inputs-outputs"></a>

每个自动化操作都会根据其收到的输入进行响应。在大多数情况下，您随后会将输出传递给后续操作。在视觉对象设计体验中，您可以在**表单**面板的**输入**和**输出**选项卡中配置操作的输入和输出数据。

有关如何定义和使用自动化操作输出的详细信息，请参阅 [使用操作输出作为输入](automation-action-outputs-inputs.md)。

## 为操作提供输入数据
<a name="providing-input"></a>

每个自动化操作都有一个或多个输入，您必须为其提供值。您为操作输入提供的值由操作接受的数据类型和格式决定。例如，这些 `aws:sleep` 操作要求 `Duration` 输入采用 ISO 8601 格式的字符串值。

通常，您在运行手册的工作流程中使用操作，这些操作将返回要在后续操作中使用的输出。请务必确保输入值正确，以避免运行手册的工作流程出现错误。输入值也很重要，因为其决定了操作是否返回预期的输出。例如，在使用 `aws:executeAwsApi` 操作时，您需要确保为 API 操作提供了正确的值。

## 定义操作的输出数据
<a name="defining-output"></a>

一些自动化操作在执行其定义的操作后会返回输出。返回输出的操作要么具有预定义的输出，要么允许您自己定义输出。例如，`aws:createImage` 操作具有返回 `ImageId` 和 `ImageState` 的预定义输出。相比之下，通过 `aws:executeAwsApi` 操作，您可以定义您想要从指定 API 操作中获得的输出。因此，您可以从单个 API 操作中返回一个或多个值，以便在后续操作中使用。

为自动化操作定义自己的输出需要您指定输出的名称、数据类型和输出值。要继续使用 `aws:executeAwsApi` 操作作为示例，假设您正在从 Amazon EC2 调用 `DescribeInstances` API 操作。在此示例中，您想要返回或输出 Amazon EC2 实例的 `State`，并根据输出对运行手册的工作流程进行分支。您可以选择命名输出 **InstanceState**，然后使用 **String** 数据类型。

定义输出实际值的过程因操作而异。例如，如果您使用的是 `aws:executeScript` 操作，则必须在函数中使用 `return` 语句为输出提供数据。对于 `aws:executeAwsApi`、`aws:waitForAwsResourceProperty` 和 `aws:assertAwsResourceProperty` 等其他操作，则需要 `Selector`。`Selector`（或某些操作所指的 `PropertySelector`），是一个 JSONPath 字符串，用于处理来自 API 操作的 JSON 响应。了解 API 操作的 JSON 响应对象的结构至关重要，这样您才能为输出选择正确的值。使用前面提到 `DescribeInstances` API 操作，请参阅以下 JSON 响应示例：

```
{
  "reservationSet": {
    "item": {
      "reservationId": "r-1234567890abcdef0",
      "ownerId": 123456789012,
      "groupSet": "",
      "instancesSet": {
        "item": {
          "instanceId": "i-1234567890abcdef0",
          "imageId": "ami-bff32ccc",
          "instanceState": {
            "code": 16,
            "name": "running"
          },
          "privateDnsName": "ip-192-168-1-88.eu-west-1.compute.internal",
          "dnsName": "ec2-54-194-252-215.eu-west-1.compute.amazonaws.com",
          "reason": "",
          "keyName": "my_keypair",
          "amiLaunchIndex": 0,
          "productCodes": "",
          "instanceType": "t2.micro",
          "launchTime": "2018-05-08T16:46:19.000Z",
          "placement": {
            "availabilityZone": "eu-west-1c",
            "groupName": "",
            "tenancy": "default"
          },
          "monitoring": {
            "state": "disabled"
          },
          "subnetId": "subnet-56f5f000",
          "vpcId": "vpc-11112222",
          "privateIpAddress": "192.168.1.88",
          "ipAddress": "54.194.252.215",
          "sourceDestCheck": true,
          "groupSet": {
            "item": {
              "groupId": "sg-e4076000",
              "groupName": "SecurityGroup1"
            }
          },
          "architecture": "x86_64",
          "rootDeviceType": "ebs",
          "rootDeviceName": "/dev/xvda",
          "blockDeviceMapping": {
            "item": {
              "deviceName": "/dev/xvda",
              "ebs": {
                "volumeId": "vol-1234567890abcdef0",
                "status": "attached",
                "attachTime": "2015-12-22T10:44:09.000Z",
                "deleteOnTermination": true
              }
            }
          },
          "virtualizationType": "hvm",
          "clientToken": "xMcwG14507example",
          "tagSet": {
            "item": {
              "key": "Name",
              "value": "Server_1"
            }
          },
          "hypervisor": "xen",
          "networkInterfaceSet": {
            "item": {
              "networkInterfaceId": "eni-551ba000",
              "subnetId": "subnet-56f5f000",
              "vpcId": "vpc-11112222",
              "description": "Primary network interface",
              "ownerId": 123456789012,
              "status": "in-use",
              "macAddress": "02:dd:2c:5e:01:69",
              "privateIpAddress": "192.168.1.88",
              "privateDnsName": "ip-192-168-1-88.eu-west-1.compute.internal",
              "sourceDestCheck": true,
              "groupSet": {
                "item": {
                  "groupId": "sg-e4076000",
                  "groupName": "SecurityGroup1"
                }
              },
              "attachment": {
                "attachmentId": "eni-attach-39697adc",
                "deviceIndex": 0,
                "status": "attached",
                "attachTime": "2018-05-08T16:46:19.000Z",
                "deleteOnTermination": true
              },
              "association": {
                "publicIp": "54.194.252.215",
                "publicDnsName": "ec2-54-194-252-215.eu-west-1.compute.amazonaws.com",
                "ipOwnerId": "amazon"
              },
              "privateIpAddressesSet": {
                "item": {
                  "privateIpAddress": "192.168.1.88",
                  "privateDnsName": "ip-192-168-1-88.eu-west-1.compute.internal",
                  "primary": true,
                  "association": {
                    "publicIp": "54.194.252.215",
                    "publicDnsName": "ec2-54-194-252-215.eu-west-1.compute.amazonaws.com",
                    "ipOwnerId": "amazon"
                  }
                }
              },
              "ipv6AddressesSet": {
                "item": {
                  "ipv6Address": "2001:db8:1234:1a2b::123"
                }
              }
            }
          },
          "iamInstanceProfile": {
            "arn": "arn:aws:iam::123456789012:instance-profile/AdminRole",
            "id": "ABCAJEDNCAA64SSD123AB"
          },
          "ebsOptimized": false,
          "cpuOptions": {
            "coreCount": 1,
            "threadsPerCore": 1
          }
        }
      }
    }
  }
}
```

在 JSON 响应对象中，实例 `State` 嵌套在 `Instances` 对象中，而该对象嵌套在 `Reservations` 对象中。要返回实例 `State` 的值，请使用以下字符串作为 `Selector`，以便可以在输出中使用该值：**\$1.Reservations[0].Instances[0].State.Name**。

要在运行手册工作流程的后续操作中引用输出值，请使用以下格式：`{{ StepName.NameOfOutput }}`。例如 **\$1\$1 GetInstanceState.InstanceState \$1\$1**。在视觉对象设计体验中，您可以使用输入下拉菜单选择要在后续操作中使用的输出值。在后续操作中使用输出时，输出的数据类型必须与输入的数据类型相匹配。在此示例中，`InstanceState` 输出为 `String`。因此，要在后续操作的输入中使用该值，输入必须接受 `String`。

# 视觉对象设计体验中的错误处理
<a name="visual-designer-error-handling"></a>

默认情况下，当操作报告错误时，自动化会完全停止运行手册的工作流程。这是因为所有操作 `onFailure` 属性的默认值为 `Abort`。您可以配置自动化如何处理运行手册工作流程中错误。即使您配置了错误处理，某些错误仍可能导致自动化失败。有关更多信息，请参阅 [Systems Manager 自动化故障排除](automation-troubleshooting.md)。在视觉对象设计体验中，您可以在**配置**面板中配置错误处理。

![\[错误处理选项\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_error_handling.png)


## 出现错误时重试操作
<a name="retry-actions"></a>

要在出现错误时重试操作，请为**最大尝试次数**属性指定一个值。默认值是 1。如果您指定的值大于 1，则直到所有重试尝试失败后，才会将此操作视为失败。

## 超时
<a name="timeout-seconds"></a>

您可以为操作配置超时，以设置操作在失败之前可以运行的最大秒数。要配置超时，请在**超时秒数**属性中输入操作在失败之前应等待的秒数。如果达到超时并且操作的 `Max attempts` 值大于 1，则在重试完成之前该步骤不会被视为已超时。

## 失败的操作
<a name="failure-actions"></a>

默认情况下，当操作失败时，自动化会完全停止运行手册的工作流程。您可以通过为运行手册中操作的**失败时**属性指定替代值来修改此行为。如果您希望工作流程继续到运行手册中的下一步，请选择**继续**。如果您希望工作流程跳至运行手册中的其他后续步骤，请选择**步骤**，然后输入该步骤的名称。

## 取消的操作
<a name="cancel-actions"></a>

默认情况下，当用户取消操作时，自动化会完全停止运行手册的工作流程。您可以通过为运行手册中操作的**取消时**属性指定替代值来修改此行为。如果您希望工作流程跳至运行手册中的其他后续步骤，请选择**步骤**，然后输入该步骤的名称。

## 关键操作
<a name="critical-actions"></a>

您可以将某项操作指定为*关键*操作，这意味着其决定了自动化的总体报告状态。如果具有此指定的步骤失败，则无论其他操作是否成功，自动化都会将最终状态报告为 `Failed`。要将某项操作配置为关键，请将**至关重要**属性的默认值保留为 **True**。

## 结束操作
<a name="end-actions"></a>

**结束**属性在指定操作结束时停止自动化。此属性的默认值为 `false`。如果您为操作配置此属性，则无论操作成功还是失败，自动化都会停止。此属性最常与 `aws:branch` 操作一起使用，以处理意外或未定义的输入值。以下示例显示了期望实例状态为 `running`、`stopping` 或 `stopped` 的运行手册。如果实例处于不同的状态，则自动化结束。

![\[视觉对象设计体验就是结束示例\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_is_end_example.png)


# 教程：使用视觉对象设计体验创建运行手册
<a name="visual-designer-tutorial"></a>

在本教程中，您将学习使用 Systems Manager Automation 提供的视觉对象设计体验的基础知识。在视觉对象设计体验中，您可以创建使用多个操作的运行手册。您可以使用拖放功能在画布上排列操作。您还可以搜索、选择和配置这些操作。然后，您可以查看为运行手册工作流程自动生成的 YAML 代码、退出视觉对象设计体验、运行运行手册并查看执行详情。

本教程还向您展示了如何更新运行手册和查看新版本。在本教程的最后，您将执行清理步骤并删除运行手册。

完成本教程的学习后，您将知道如何使用视觉对象设计体验来创建运行手册。您还将了解如何更新、运行和删除运行手册。

**注意**  
在开始学习本教程之前，请确保完成 [设置自动化](automation-setup.md)。

**Topics**
+ [步骤 1：导航到视觉对象设计体验](#navigate-console)
+ [步骤 2：创建工作流程](#create-workflow)
+ [步骤 3：查看自动生成的代码](#view-generated-code)
+ [步骤 4：运行新的运行手册](#use-tutorial-runbook)
+ [第 5 步：清理](#cleanup-tutorial-runbook)

## 步骤 1：导航到视觉对象设计体验
<a name="navigate-console"></a>

1. 登录 [Systems Manager Automation 控制台](https://console.aws.amazon.com/systems-manager/automation/home?region=us-east-1#/)。

1. 选择**创建自动化运行手册**。

## 步骤 2：创建工作流程
<a name="create-workflow"></a>

在视觉对象设计体验中，工作流程是画布上运行手册的图形表示。您可以使用视觉对象设计体验来定义、配置和检查运行手册的各个操作。

**创建工作流程**

1. 在**设计**和**代码**切换开关旁边，选择铅笔图标并输入运行手册的名称。在本教程中，请输入 **VisualDesignExperienceTutorial**。  
![\[视觉对象设计体验为您的运行手册命名\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_tutorial_name.png)

1. 在**表单**面板的**文档属性**部分，展开**输入参数**下拉菜单，然后选择**添加参数**。

   1. 在**参数名称**字段中，输入 **InstanceId**。

   1. 在**类型**下拉菜单中，选择 **AWS::EC2::Instance**。

   1. 选择**必需**开关。  
![\[创建运行手册的参数\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_actions_tutorial_parameter.png)

1. 在 **AWS API** 浏览器中，在搜索栏中输入 **DescribeInstances**。

1. 将 **Amazon EC2 – DescribeInstances** 操作拖动到空白画布上。

1. 对于**步骤名称**，请输入一个值。在本教程中，您可以使用名称 **GetInstanceState**。  
![\[选择 Amazon EC2 描述实例 API 操作。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_tutorial_api_action.png)

   1. 展开**其他输入**下拉菜单，然后在**输入名称**字段中输入 **InstanceIds**。

   1. 选择**输入**选项卡。

   1. 在**输入值**字段中，选择 **InstanceId** 文档输入。这将引用在过程开始时创建的输入参数的值。鉴于 `DescribeInstances` 操作的 **InstanceIds** 输入接受 `StringList` 值，必须将 **InstanceId** 输入用方括号括起来。**输入值**的 YAML 应与以下内容匹配：**['\$1\$1 InstanceId \$1\$1']**。

   1. 在**输出**选项卡中，请选择**添加输出**，然后在**名称**字段中输入 **InstanceState**。

   1. 在**选择器**字段中，请输入 **\$1.Reservations[0].Instances[0].State.Name**。

   1. 在**类型**下拉菜单中，请选择**字符串**。

1. 从**操作**浏览器中拖动**分支**操作，然后将其放入 **`GetInstanceState`** 步骤下方。

1. 对于**步骤名称**，请输入一个值。在本教程中，请使用名称 `BranchOnInstanceState`。

   要定义分支逻辑，请执行以下操作：

   1. 在画布上选择 **`Branch`** 状态。然后，在**输入**和**选择**下，选择铅笔图标以编辑**规则 \$11**。

   1. 选择**添加条件**。

   1. 在**规则 \$11 的条件**对话框中，从**变量**下拉菜单中选择 **GetInstanceState.InstanceState** 步骤输出。

   1. 对于**运算符**，请选择**等于**。

   1. 对于**值**，请从下拉列表中选择**字符串**。输入 **stopped**。  
![\[定义分支操作的条件。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_tutorial_condition.png)

   1. 选择**保存条件**。

   1. 选择**添加新的选择规则**。

   1. 为**规则 \$12** 选择**添加条件**。

   1. 在**规则 \$12 的条件**对话框中，从**变量**下拉菜单中选择 **GetInstanceState.InstanceState** 步骤输出。

   1. 对于**运算符**，请选择**等于**。

   1. 对于**值**，请从下拉列表中选择**字符串**。输入 **stopping**。

   1. 选择**保存条件**。

   1. 选择**添加新的选择规则**。

   1. 对于**规则 \$13**，请选择**添加条件**。

   1. 在**规则 \$13 的条件**对话框中，从**变量**下拉菜单中选择 **GetInstanceState.InstanceState** 步骤输出。

   1. 对于**运算符**，请选择**等于**。

   1. 对于**值**，请从下拉列表中选择**字符串**。输入 **running**。

   1. 选择**保存条件**。

   1. 在**默认规则**中，选择**转到结尾**作为**默认步骤**。

1. 将**更改实例状态**操作拖动到 **\$1\$1 GetInstanceState.InstanceState \$1\$1 == "stopped"** 条件下的**将操作拖动到此处**空白框中。

   1. 对于**步骤名称**，请输入 **StartInstance**。

   1. 在**输入**选项卡的**实例 ID** 下，从下拉菜单中选择 **InstanceId** 文档输入值。

   1. 对于**期望状态**，请指定 **`running`**。

1. 将**等待 AWS 资源**操作拖动到 **\$1\$1 GetInstanceState.InstanceState \$1\$1 == "stopping"** 条件下的**将操作拖动到此处**空白框中。

1. 对于**步骤名称**，请输入一个值。在本教程中，请使用名称 `WaitForInstanceStop`。

   1. 对于**服务**字段，请选择 **Amazon EC2**。

   1. 对于 **API** 字段，请选择 **DescribeInstances**。

   1. 对于**属性选择器**字段，请输入 **\$1.Reservations[0].Instances[0].State.Name**。

   1. 对于**期望值**参数，请输入 **`["stopped"]`**。

   1. 在 **WaitForInstanceStop** 操作的**配置**选项卡中，从**下一步**下拉菜单中选择 **StartInstance**。

1. 将**在实例上运行命令**操作拖动到 **\$1\$1 GetInstanceState.InstanceState \$1\$1 == "running"** 条件下的**将操作拖动到此处**空白框中。

1. 对于**步骤名称**，请输入 **SayHello**。

   1. 在**输入**选项卡中，输入 **AWS-RunShellScript** 作为**文档名称**参数。

   1. 对于 **InstanceId**，请从下拉菜单中选择 **InstanceId** 文档输入值。

   1. 展开**其他输入**下拉菜单，在**输入名称**下拉菜单中，选择**参数**。

   1. 在**输入值**字段中，请输入 **`{"commands": "echo 'Hello World'"}`**。

1. 在画布中查看已完成的运行手册，然后选择**创建运行手册**以保存教程运行手册。  
![\[查看和创建运行手册。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/visual_designer_tutorial_complete.png)

## 步骤 3：查看自动生成的代码
<a name="view-generated-code"></a>

当您将操作从**操作**浏览器拖放到画布上时，视觉对象设计体验会自动实时编写运行手册的 YAML 或 JSON 内容。您可以查看和编辑此代码。要查看自动生成的代码，在**设计**和**代码**切换开关中选择**代码**。

## 步骤 4：运行新的运行手册
<a name="use-tutorial-runbook"></a>

创建运行手册后，您可以运行自动化。

**运行新的自动化运行手册**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在**自动化文档**列表中，请选择运行手册。在**文档类别**窗格中选择一个或多个选项，以便根据 SSM 文档的用途对其进行筛选。要查看您拥有的运行手册，请选择**我拥有的**选项卡。要查看与您的账户共享的运行手册，请选择**与我共享**选项卡。要查看所有运行手册，请选择**所有文档**选项卡。
**注意**  
您可以通过选择运行手册名称来查看有关该手册的信息。

1. 在**文档详细信息**部分中，验证**文档版本**已设置为要运行的版本。系统包括以下版本选项：
   + **运行时的默认版本** – 如果定期更新自动化运行手册并分配新的默认版本，请选择此选项。
   + **运行时的最新版本** – 如果定期更新自动化运行手册并且想要运行最新更新的版本，请选择此选项。
   + **1（默认）** – 选择此选项可执行文档的第一个版本，即默认版本。

1. 选择**下一步**。

1. 在**执行自动化运行手册**部分，请选择**简单执行**。

1. 在 **输入参数** 部分中，指定所需的输入。或者，您也可以从 **AutomationAssumeRole** 列表选择一个 IAM 服务角色。

1. （可选）选择一个 Amazon CloudWatch 警报应用于您的自动化，以便进行监控。要将 CloudWatch 警报附加到自动化，启动自动化的 IAM 主体必须具有 `iam:createServiceLinkedRole` 操作的权限。有关 CloudWatch 警报的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。如果您的警报激活，自动化将停止。如果使用 AWS CloudTrail，您将在跟踪中看到 API 调用。

1. 选择**执行**。

## 第 5 步：清理
<a name="cleanup-tutorial-runbook"></a>

**删除您的运行手册**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择**我拥有的**选项卡。

1. 找到 **VisualDesignExperienceTutorial** 运行手册。

1. 在文档卡页面上选择按钮，然后从**操作**下拉菜单中选择**删除文档**。

# 创作自动化运行手册
<a name="automation-authoring-runbooks"></a>

Automation 是 AWS Systems Manager 中的一项工具，其中的每个运行手册定义了一个自动化。自动化运行手册定义了在自动化过程中执行的操作。在运行手册内容中，您可以定义 Systems Manager 对托管实例和 AWS 资源执行的输入参数、输出和操作。

自动化包含几个预定义的运行手册，您可以用它们来执行常见任务，例如重启一个或多个 Amazon Elastic Compute Cloud (Amazon EC2) 实例，或创建 Amazon Machine Image (AMI)。但是，您的使用案例可能会超出预定义运行手册的功能。如果是这种情况，您可以创建自己的运行手册并根据需要修改它们。

运行手册由自动化操作、这些操作的参数以及您指定的输入参数组成。运行手册的内容是以 YAML 或 JSON 格式编写的。如果不熟悉 YAML 或 JSON，建议使用视觉设计器，或者在尝试创作自己的运行手册之前了解更多关于任一标记语言的信息。有关视觉设计器的更多信息，请参阅 [自动化运行手册的视觉对象设计体验](automation-visual-designer.md)。

以下部分将帮助您创作第一个运行手册。

## 识别您的使用案例
<a name="automation-authoring-runbooks-use-case"></a>

创作运行手册的第一步是确定您的使用案例。例如，您计划了 `AWS-CreateImage` 运行手册，以便每天在您的所有生产 Amazon EC2 实例上运行。月底时，您决定拥有的映像数量超过恢复点所需的映像。接下来，您希望在创建新 AMI 时，自动删除 Amazon EC2 实例的最早 AMI。为了实现此目的，您可以创建执行以下操作的新运行手册：

1. 运行 `aws:createImage` 操作，并在映像描述中指定实例 ID。

1. 运行 `aws:waitForAwsResourceProperty` 操作来轮询图像的状态，直到此状态为 `available`。

1. 在图像状态变为 `available` 后，`aws:executeScript` 操作会运行一个自定义 Python 脚本，用于收集与 Amazon EC2 实例关联的所有映像的 ID。脚本使用您在创建时指定的映像描述中的实例 ID 进行筛选，完成此操作。然后，脚本根据图像的 `creationDate` 对图像 ID 列表进行排序，并输出最早的 AMI。

1. 最后，`aws:deleteImage` 操作运行，使用上一步输出中的 ID 删除最早的 AMI。

在这种情况下，您已经使用 `AWS-CreateImage` 运行手册，但发现您的使用案例需要更大的灵活性。这是一种常见的情况，因为运行手册和自动化操作之间可能存在重叠。因此，您可能需要调整用于解决您的使用案例的运行手册或操作。

例如，`aws:executeScript` 和 `aws:invokeLambdaFunction` 操作都允许您在自动化过程中运行自定义脚本。要在它们之间进行选择，您可能更喜欢 `aws:invokeLambdaFunction`，因为它还支持其他运行时语言。但是，您可能更喜欢 `aws:executeScript`，因为它允许您直接在 YAML 运行手册中创作脚本内容，并提供脚本内容作为 JSON 运行手册的附件。您也可以考虑 `aws:executeScript`，因为其 AWS Identity and Access Management (IAM) 设置更简单。因为它使用 `AutomationAssumeRole` 提供的权限，`aws:executeScript` 不需要使用额外的 AWS Lambda 函数执行角色。

在任何给定的情况下，一个操作可能会比另一个操作提供更大的灵活性或更多功能。因此，我们建议您查看要使用的运行手册或操作的可用输入参数，以确定哪些参数最适合您的使用案例和首选项。

## 设置开发环境
<a name="automation-authoring-runbooks-environment"></a>

确定您的使用案例以及要在运行手册中使用的预定义运行手册或自动化操作后，请为运行手册的内容设置开发环境。要开发您的运行手册内容，我们建议使用 AWS Toolkit for Visual Studio Code 而不是 Systems Manager 文档控制台。

Toolkit for VS Code 是 Visual Studio 代码（VS 代码）的开源扩展，提供了比 Systems Manager 文档控制台更多的功能。有用的功能包括针对 YAML 和 JSON 的模式验证、自动化操作类型的代码片段以及对各种 YAML 和 JSON 格式选项的自动完成支持。

有关安装 Toolkit for VS Code 的更多信息，请参阅[安装 AWS Toolkit for Visual Studio Code](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/setup-toolkit.html)。有关使用适用于 Toolkit for VS Code 开发运行手册的更多信息，请参阅 *AWS Toolkit for Visual Studio Code 用户指南*中的[使用 Systems Manager 运行手册](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/systems-manager-automation-docs.html)

## 开发运行手册内容
<a name="automation-authoring-runbooks-developing-content"></a>

确定使用案例并设置环境后，您便做好了开发适用于运行手册内容的准备。您的使用案例和首选项在很大程度上决定了您在运行手册内容中使用的自动化操作或运行手册。与允许您完成类似任务的其他操作相比，某些操作仅支持输入参数的子集。其他操作具有特定的输出，例如 `aws:createImage`，其中一些操作允许您定义自己的输出，例如 `aws:executeAwsApi`。

如果您不确定如何在运行手册中使用特定操作，我们建议您查看 [Systems Manager 自动化操作参考](automation-actions.md) 中的操作对应条目。我们还建议您查看预定义运行手册的内容，以查看有关如何使用这些操作的实例。有关运行手册的实际应用程序的更多实例，请参阅 [其他运行手册示例](automation-document-examples.md)。

为了展示运行手册内容在简单性和灵活性方面的差异，以下教程提供了如何分阶段修补 Amazon EC2 实例组的示例：
+ [示例 1：创建父子运行手册](automation-authoring-runbooks-parent-child-example.md) - 在此示例中，父子关系中使用了两个运行手册。父运行手册启动子运行手册的速率控制自动化。
+ [示例 2：脚本化运行手册](automation-authoring-runbooks-scripted-example.md) - 此示例演示如何通过将内容压缩到单个运行手册中并使用运行手册中的脚本来完成示例 1 的相同任务。

# 示例 1：创建父子运行手册
<a name="automation-authoring-runbooks-parent-child-example"></a>

以下示例演示如何创建两个运行手册，以便分阶段修补已标记的 Amazon Elastic Compute Cloud (Amazon EC2) 实例组。这些运行手册用于父子关系，其中父运行手册用于启动子运行手册的速率控制自动化。有关使用速率控制自动化的更多信息，请参阅 [大规模运行自动化操作](running-automations-scale.md)。有关此示例中使用的自动化操作的更多信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

## 创建子运行手册
<a name="automation-authoring-runbooks-child-runbook"></a>

此示例运行手册解决以下情形。Emily 是 AnyCompany Consultants, LLC 的系统工程师。她需要为托管主数据库和辅助数据库的 Amazon Elastic Compute Cloud (Amazon EC2) 实例组配置补丁程序。应用程序每天 24 小时访问这些数据库，因此两个数据库实例中必须有一个始终可用。

她确定分阶段修补实例是最佳方法。首先将对数据库实例的主组进行修补，然后修补数据库实例的辅助组。此外，为了避免由于使之前已停止的实例运行而产生额外的成本，Emily 希望在进行修补之前将修补的实例返回到其原始状态。

Emily 通过与实例关联的标签来标识数据库实例的主组和辅助组。她决定创建一个父运行手册，用于启动子运行手册的速率控制自动化。通过这种方法，她可以将与数据库实例的主组和辅助组关联的标签设置为目标，并管理子自动化的并发性。查看了可用于修补的 Systems Manager (SSM) 文档后，她选择了 `AWS-RunPatchBaseline` 文档。通过使用此 SSM 文档，她的同事可以在修补操作完成后查看相关的修补程序合规性信息。

为了开始创建运行手册内容，Emily 查看了可用的自动化操作，并开始为子运行手册创作内容，如下所示：

1. 首先，她为运行手册的架构和描述提供值，并定义子运行手册的输入参数。

   通过使用 `AutomationAssumeRole` 参数，Emily 和她的同事可以使用现有的 IAM 角色，以允许自动化代表他们执行运行手册中的操作。Emily 使用 `InstanceId` 参数来确定应修补的实例。（可选）`Operation`、`RebootOption` 和 `SnapshotId` 参数可用于为 `AWS-RunPatchBaseline` 的文档参数提供值。为了防止向这些运行手册参数提供无效值，她根据需要定义了 `allowedValues`。

------
#### [ YAML ]

   ```
   schemaVersion: '0.3'
   description: 'An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: >-
         '(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the
         actions on your behalf. If no role is specified, Systems Manager
         Automation uses your IAM permissions to operate this runbook.'
       default: ''
     InstanceId:
       type: String
       description: >-
         '(Required) The instance you want to patch.'
     SnapshotId:
       type: String
       description: '(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.'
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: '(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.'
       allowedValues:
         - Install
         - Scan
       default: Install
   ```

------
#### [ JSON ]

   ```
   {
      "schemaVersion":"0.3",
      "description":"An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "assumeRole":"{{AutomationAssumeRole}}",
      "parameters":{
         "AutomationAssumeRole":{
            "type":"String",
            "description":"(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.",
            "default":""
         },
         "InstanceId":{
            "type":"String",
            "description":"(Required) The instance you want to patch."
         },
         "SnapshotId":{
            "type":"String",
            "description":"(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.",
            "default":""
         },
         "RebootOption":{
            "type":"String",
            "description":"(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.",
            "allowedValues":[
               "NoReboot",
               "RebootIfNeeded"
            ],
            "default":"RebootIfNeeded"
         },
         "Operation":{
            "type":"String",
            "description":"(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.",
            "allowedValues":[
               "Install",
               "Scan"
            ],
            "default":"Install"
         }
      }
   },
   ```

------

1. 定义完顶层元素后，Emily 继续创作构成运行手册的 `mainSteps` 的操作。第一步使用 `aws:executeAwsApi` 操作输出 `InstanceId` 输入参数中指定的目标实例的当前状态。此操作的输出将用于后续操作。

------
#### [ YAML ]

   ```
   mainSteps:
     - name: getInstanceState
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
       outputs:
         - Name: instanceState
           Selector: '$.Reservations[0].Instances[0].State.Name'
           Type: String
       nextStep: branchOnInstanceState
   ```

------
#### [ JSON ]

   ```
   "mainSteps":[
         {
            "name":"getInstanceState",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "inputs":null,
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            },
            "outputs":[
               {
                  "Name":"instanceState",
                  "Selector":"$.Reservations[0].Instances[0].State.Name",
                  "Type":"String"
               }
            ],
            "nextStep":"branchOnInstanceState"
         },
   ```

------

1. Emily 没有手动启动和跟踪需要修补的每个实例的原始状态，而是根据目标实例的状态使用上一操作的输出对自动化进行分支。这允许自动化根据 `aws:branch` 操作中定义的条件运行不同的步骤，并提高了自动化的整体效率，无需人工干预。

   如果实例状态已为 `running`，则自动化将继续使用 `aws:runCommand` 操作，利用 `AWS-RunPatchBaseline` 文档修补实例。

   如果实例的状态为 `stopping`，则自动化使用 `aws:waitForAwsResourceProperty` 操作轮询实例以达到 `stopped` 状态，使用 `executeAwsApi` 操作启动实例，并轮询实例以达到 `running` 状态，然后再修补实例。

   如果实例的状态为 `stopped`，则自动化将启动实例并轮询实例以达到 `running` 状态，然后再使用相同的操作修补实例。

------
#### [ YAML ]

   ```
   - name: branchOnInstanceState
       action: 'aws:branch'
       onFailure: Abort
       inputs:
         Choices:
           - NextStep: startInstance
              Variable: '{{getInstanceState.instanceState}}'
              StringEquals: stopped
            - NextStep: verifyInstanceStopped
              Variable: '{{getInstanceState.instanceState}}'
              StringEquals: stopping
            - NextStep: patchInstance
              Variable: '{{getInstanceState.instanceState}}'
              StringEquals: running
       isEnd: true
     - name: startInstance
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         Service: ec2
         Api: StartInstances
         InstanceIds:
           - '{{InstanceId}}'
       nextStep: verifyInstanceRunning
     - name: verifyInstanceRunning
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 120
       inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
         PropertySelector: '$.Reservations[0].Instances[0].State.Name'
         DesiredValues:
           - running
       nextStep: patchInstance
     - name: verifyInstanceStopped
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 120
       inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
         PropertySelector: '$.Reservations[0].Instances[0].State.Name'
         DesiredValues:
           - stopped
         nextStep: startInstance
     - name: patchInstance
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 5400
       inputs:
         DocumentName: 'AWS-RunPatchBaseline'
         InstanceIds: 
         - '{{InstanceId}}'
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
   ```

------
#### [ JSON ]

   ```
   {
            "name":"branchOnInstanceState",
            "action":"aws:branch",
            "onFailure":"Abort",
            "inputs":{
               "Choices":[
                  {
                     "NextStep":"startInstance",
                     "Variable":"{{getInstanceState.instanceState}}",
                     "StringEquals":"stopped"
                  },
                  {
                     "Or":[
                        {
                           "Variable":"{{getInstanceState.instanceState}}",
                           "StringEquals":"stopping"
                        }
                     ],
                     "NextStep":"verifyInstanceStopped"
                  },
                  {
                     "NextStep":"patchInstance",
                     "Variable":"{{getInstanceState.instanceState}}",
                     "StringEquals":"running"
                  }
               ]
            },
            "isEnd":true
         },
         {
            "name":"startInstance",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "Service":"ec2",
               "Api":"StartInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            },
            "nextStep":"verifyInstanceRunning"
         },
         {
            "name":"verifyInstanceRunning",
            "action":"aws:waitForAwsResourceProperty",
            "timeoutSeconds":120,
            "inputs":{
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "PropertySelector":"$.Reservations[0].Instances[0].State.Name",
               "DesiredValues":[
                  "running"
               ]
            },
            "nextStep":"patchInstance"
         },
         {
            "name":"verifyInstanceStopped",
            "action":"aws:waitForAwsResourceProperty",
            "timeoutSeconds":120,
            "inputs":{
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "PropertySelector":"$.Reservations[0].Instances[0].State.Name",
               "DesiredValues":[
                  "stopped"
               ],
               "nextStep":"startInstance"
            }
         },
         {
            "name":"patchInstance",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":5400,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               }
            }
         },
   ```

------

1. 修补操作完成后，Emily 希望自动化将目标实例返回到自动化开始之前的状态。她通过再次使用第一个动作的输出来完成此操作。自动化根据目标实例的原始状态，使用 `aws:branch` 操作进行分支。如果实例之前处于 `running` 以外的任何状态，实例将停止。否则，如果实例状态为 `running`，则自动化结束。

------
#### [ YAML ]

   ```
   - name: branchOnOriginalInstanceState
       action: 'aws:branch'
       onFailure: Abort
       inputs:
         Choices:
           - NextStep: stopInstance
             Not: 
               Variable: '{{getInstanceState.instanceState}}'
               StringEquals: running
       isEnd: true
     - name: stopInstance
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         Service: ec2
         Api: StopInstances
         InstanceIds:
           - '{{InstanceId}}'
   ```

------
#### [ JSON ]

   ```
   {
            "name":"branchOnOriginalInstanceState",
            "action":"aws:branch",
            "onFailure":"Abort",
            "inputs":{
               "Choices":[
                  {
                     "NextStep":"stopInstance",
                     "Not":{
                        "Variable":"{{getInstanceState.instanceState}}",
                        "StringEquals":"running"
                     }
                  }
               ]
            },
            "isEnd":true
         },
         {
            "name":"stopInstance",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "Service":"ec2",
               "Api":"StopInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            }
         }
      ]
   }
   ```

------

1. Emily 检查完成的子运行手册内容，并在同一 AWS 账户 和 AWS 区域 中创建运行手册作为目标实例。现在，她已经准备好继续创建父运行手册的内容。下面是完成的子运行手册内容。

------
#### [ YAML ]

   ```
   schemaVersion: '0.3'
   description: 'An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: >-
         '(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the
         actions on your behalf. If no role is specified, Systems Manager
         Automation uses your IAM permissions to operate this runbook.'
       default: ''
     InstanceId:
       type: String
       description: >-
         '(Required) The instance you want to patch.'
     SnapshotId:
       type: String
       description: '(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.'
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: '(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.'
       allowedValues:
         - Install
         - Scan
       default: Install
   mainSteps:
     - name: getInstanceState
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
       outputs:
         - Name: instanceState
           Selector: '$.Reservations[0].Instances[0].State.Name'
           Type: String
       nextStep: branchOnInstanceState
     - name: branchOnInstanceState
       action: 'aws:branch'
       onFailure: Abort
       inputs:
         Choices:
           - NextStep: startInstance
             Variable: '{{getInstanceState.instanceState}}'
             StringEquals: stopped
           - Or:
               - Variable: '{{getInstanceState.instanceState}}'
                 StringEquals: stopping
             NextStep: verifyInstanceStopped
           - NextStep: patchInstance
             Variable: '{{getInstanceState.instanceState}}'
             StringEquals: running
       isEnd: true
     - name: startInstance
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         Service: ec2
         Api: StartInstances
         InstanceIds:
           - '{{InstanceId}}'
       nextStep: verifyInstanceRunning
     - name: verifyInstanceRunning
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 120
       inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
         PropertySelector: '$.Reservations[0].Instances[0].State.Name'
         DesiredValues:
           - running
       nextStep: patchInstance
     - name: verifyInstanceStopped
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 120
       inputs:
         Service: ec2
         Api: DescribeInstances
         InstanceIds:
           - '{{InstanceId}}'
         PropertySelector: '$.Reservations[0].Instances[0].State.Name'
         DesiredValues:
           - stopped
         nextStep: startInstance
     - name: patchInstance
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 5400
       inputs:
         DocumentName: 'AWS-RunPatchBaseline'
         InstanceIds: 
         - '{{InstanceId}}'
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
     - name: branchOnOriginalInstanceState
       action: 'aws:branch'
       onFailure: Abort
       inputs:
         Choices:
           - NextStep: stopInstance
             Not: 
               Variable: '{{getInstanceState.instanceState}}'
               StringEquals: running
       isEnd: true
     - name: stopInstance
       action: 'aws:executeAwsApi'
       onFailure: Abort
       inputs:
         Service: ec2
         Api: StopInstances
         InstanceIds:
           - '{{InstanceId}}'
   ```

------
#### [ JSON ]

   ```
   {
      "schemaVersion":"0.3",
      "description":"An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "assumeRole":"{{AutomationAssumeRole}}",
      "parameters":{
         "AutomationAssumeRole":{
            "type":"String",
            "description":"'(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'",
            "default":""
         },
         "InstanceId":{
            "type":"String",
            "description":"'(Required) The instance you want to patch.'"
         },
         "SnapshotId":{
            "type":"String",
            "description":"(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.",
            "default":""
         },
         "RebootOption":{
            "type":"String",
            "description":"(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.",
            "allowedValues":[
               "NoReboot",
               "RebootIfNeeded"
            ],
            "default":"RebootIfNeeded"
         },
         "Operation":{
            "type":"String",
            "description":"(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.",
            "allowedValues":[
               "Install",
               "Scan"
            ],
            "default":"Install"
         }
      },
      "mainSteps":[
         {
            "name":"getInstanceState",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "inputs":null,
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            },
            "outputs":[
               {
                  "Name":"instanceState",
                  "Selector":"$.Reservations[0].Instances[0].State.Name",
                  "Type":"String"
               }
            ],
            "nextStep":"branchOnInstanceState"
         },
         {
            "name":"branchOnInstanceState",
            "action":"aws:branch",
            "onFailure":"Abort",
            "inputs":{
               "Choices":[
                  {
                     "NextStep":"startInstance",
                     "Variable":"{{getInstanceState.instanceState}}",
                     "StringEquals":"stopped"
                  },
                  {
                     "Or":[
                        {
                           "Variable":"{{getInstanceState.instanceState}}",
                           "StringEquals":"stopping"
                        }
                     ],
                     "NextStep":"verifyInstanceStopped"
                  },
                  {
                     "NextStep":"patchInstance",
                     "Variable":"{{getInstanceState.instanceState}}",
                     "StringEquals":"running"
                  }
               ]
            },
            "isEnd":true
         },
         {
            "name":"startInstance",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "Service":"ec2",
               "Api":"StartInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            },
            "nextStep":"verifyInstanceRunning"
         },
         {
            "name":"verifyInstanceRunning",
            "action":"aws:waitForAwsResourceProperty",
            "timeoutSeconds":120,
            "inputs":{
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "PropertySelector":"$.Reservations[0].Instances[0].State.Name",
               "DesiredValues":[
                  "running"
               ]
            },
            "nextStep":"patchInstance"
         },
         {
            "name":"verifyInstanceStopped",
            "action":"aws:waitForAwsResourceProperty",
            "timeoutSeconds":120,
            "inputs":{
               "Service":"ec2",
               "Api":"DescribeInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "PropertySelector":"$.Reservations[0].Instances[0].State.Name",
               "DesiredValues":[
                  "stopped"
               ],
               "nextStep":"startInstance"
            }
         },
         {
            "name":"patchInstance",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":5400,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "InstanceIds":[
                  "{{InstanceId}}"
               ],
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               }
            }
         },
         {
            "name":"branchOnOriginalInstanceState",
            "action":"aws:branch",
            "onFailure":"Abort",
            "inputs":{
               "Choices":[
                  {
                     "NextStep":"stopInstance",
                     "Not":{
                        "Variable":"{{getInstanceState.instanceState}}",
                        "StringEquals":"running"
                     }
                  }
               ]
            },
            "isEnd":true
         },
         {
            "name":"stopInstance",
            "action":"aws:executeAwsApi",
            "onFailure":"Abort",
            "inputs":{
               "Service":"ec2",
               "Api":"StopInstances",
               "InstanceIds":[
                  "{{InstanceId}}"
               ]
            }
         }
      ]
   }
   ```

------

有关此示例中使用的自动化操作的更多信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

## 创建父运行手册
<a name="automation-authoring-runbooks-parent-runbook"></a>

此示例运行手册继续了上一节介绍的场景。现在 Emily 已经创建了子运行手册，她开始为父运行手册创作内容，如下所示：

1. 首先，她为运行手册的架构和描述提供值，并定义父运行手册的输入参数。

   通过使用 `AutomationAssumeRole` 参数，Emily 和她的同事可以使用现有的 IAM 角色，使自动化代表他们执行运行手册中的操作。Emily 使用 `PatchGroupPrimaryKey` 和 `PatchGroupPrimaryValue` 参数来指定与将要修补的数据库实例的主组关联的标签。她使用 `PatchGroupSecondaryKey` 和 `PatchGroupSecondaryValue` 参数来指定与将要修补的数据库实例的辅助组关联的标签。

------
#### [ YAML ]

   ```
   description: 'An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.'
   schemaVersion: '0.3'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
       default: ''
     PatchGroupPrimaryKey:
       type: String
       description: '(Required) The key of the tag for the primary group of instances you want to patch.''
     PatchGroupPrimaryValue:
       type: String
       description: '(Required) The value of the tag for the primary group of instances you want to patch.'
     PatchGroupSecondaryKey:
       type: String
       description: '(Required) The key of the tag for the secondary group of instances you want to patch.'
     PatchGroupSecondaryValue:
       type: String
       description: '(Required) The value of the tag for the secondary group of instances you want to patch.'
   ```

------
#### [ JSON ]

   ```
   {
      "schemaVersion": "0.3",
      "description": "An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "assumeRole": "{{AutomationAssumeRole}}",
      "parameters": {
         "AutomationAssumeRole": {
            "type": "String",
            "description": "(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.",
            "default": ""
         },
         "PatchGroupPrimaryKey": {
            "type": "String",
            "description": "(Required) The key of the tag for the primary group of instances you want to patch."
         },
         "PatchGroupPrimaryValue": {
            "type": "String",
            "description": "(Required) The value of the tag for the primary group of instances you want to patch."
         },
         "PatchGroupSecondaryKey": {
            "type": "String",
            "description": "(Required) The key of the tag for the secondary group of instances you want to patch."
         },
         "PatchGroupSecondaryValue": {
            "type": "String",
            "description": "(Required) The value of the tag for the secondary group of instances you want to patch."
         }
      }
   },
   ```

------

1. 定义顶层元素后，Emily 继续创作构成运行手册的 `mainSteps` 的操作。

   第一个操作使用她刚刚创建的子运行手册启动速率控制自动化，该子运行手册将与在 `PatchGroupPrimaryKey` 和 `PatchGroupPrimaryValue` 输入参数中所指定标签关联的实例设置为目标。她使用提供给输入参数的值来指定与要修补的主数据库实例组相关联的标签的键和值。

   第一个自动化完成后，第二个操作将使用子运行手册启动另一个速率控制自动化，该子运行手册将与在 `PatchGroupSecondaryKey` 和 `PatchGroupSecondaryValue` 输入参数中所指定标签关联的实例设置为目标。她使用提供给输入参数的值来指定与要修补的辅助数据库实例组相关联的标签的键和值。

------
#### [ YAML ]

   ```
   mainSteps:
     - name: patchPrimaryTargets
       action: 'aws:executeAutomation'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: RunbookTutorialChildAutomation
         Targets:
           - Key: 'tag:{{PatchGroupPrimaryKey}}'
             Values:
               - '{{PatchGroupPrimaryValue}}'
         TargetParameterName: 'InstanceId'
     - name: patchSecondaryTargets
       action: 'aws:executeAutomation'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: RunbookTutorialChildAutomation
         Targets:
           - Key: 'tag:{{PatchGroupSecondaryKey}}'
             Values:
               - '{{PatchGroupSecondaryValue}}'
         TargetParameterName: 'InstanceId'
   ```

------
#### [ JSON ]

   ```
   "mainSteps":[
         {
            "name":"patchPrimaryTargets",
            "action":"aws:executeAutomation",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"RunbookTutorialChildAutomation",
               "Targets":[
                  {
                     "Key":"tag:{{PatchGroupPrimaryKey}}",
                     "Values":[
                        "{{PatchGroupPrimaryValue}}"
                     ]
                  }
               ],
               "TargetParameterName":"InstanceId"
            }
         },
         {
            "name":"patchSecondaryTargets",
            "action":"aws:executeAutomation",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"RunbookTutorialChildAutomation",
               "Targets":[
                  {
                     "Key":"tag:{{PatchGroupSecondaryKey}}",
                     "Values":[
                        "{{PatchGroupSecondaryValue}}"
                     ]
                  }
               ],
               "TargetParameterName":"InstanceId"
            }
         }
      ]
   }
   ```

------

1. Emily 检查完成的父运行手册内容，并在相同的 AWS 账户和 AWS 区域中创建运行手册作为目标实例。现在，她已经准备好测试自己的运行手册，以确保在将自动化实施到生产环境之前，自动化能够按需运行。下面是完成的父运行手册内容。

------
#### [ YAML ]

   ```
   description: An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.
   schemaVersion: '0.3'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
       default: ''
     PatchGroupPrimaryKey:
       type: String
       description: (Required) The key of the tag for the primary group of instances you want to patch.
     PatchGroupPrimaryValue:
       type: String
       description: '(Required) The value of the tag for the primary group of instances you want to patch. '
     PatchGroupSecondaryKey:
       type: String
       description: (Required) The key of the tag for the secondary group of instances you want to patch.
     PatchGroupSecondaryValue:
       type: String
       description: '(Required) The value of the tag for the secondary group of instances you want to patch.  '
   mainSteps:
     - name: patchPrimaryTargets
       action: 'aws:executeAutomation'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: RunbookTutorialChildAutomation
         Targets:
           - Key: 'tag:{{PatchGroupPrimaryKey}}'
             Values:
               - '{{PatchGroupPrimaryValue}}'
         TargetParameterName: 'InstanceId'
     - name: patchSecondaryTargets
       action: 'aws:executeAutomation'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: RunbookTutorialChildAutomation
         Targets:
           - Key: 'tag:{{PatchGroupSecondaryKey}}'
             Values:
               - '{{PatchGroupSecondaryValue}}'
         TargetParameterName: 'InstanceId'
   ```

------
#### [ JSON ]

   ```
   {
      "description":"An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "schemaVersion":"0.3",
      "assumeRole":"{{AutomationAssumeRole}}",
      "parameters":{
         "AutomationAssumeRole":{
            "type":"String",
            "description":"(Optional) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.",
            "default":""
         },
         "PatchGroupPrimaryKey":{
            "type":"String",
            "description":"(Required) The key of the tag for the primary group of instances you want to patch."
         },
         "PatchGroupPrimaryValue":{
            "type":"String",
            "description":"(Required) The value of the tag for the primary group of instances you want to patch. "
         },
         "PatchGroupSecondaryKey":{
            "type":"String",
            "description":"(Required) The key of the tag for the secondary group of instances you want to patch."
         },
         "PatchGroupSecondaryValue":{
            "type":"String",
            "description":"(Required) The value of the tag for the secondary group of instances you want to patch.  "
         }
      },
      "mainSteps":[
         {
            "name":"patchPrimaryTargets",
            "action":"aws:executeAutomation",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"RunbookTutorialChildAutomation",
               "Targets":[
                  {
                     "Key":"tag:{{PatchGroupPrimaryKey}}",
                     "Values":[
                        "{{PatchGroupPrimaryValue}}"
                     ]
                  }
               ],
               "TargetParameterName":"InstanceId"
            }
         },
         {
            "name":"patchSecondaryTargets",
            "action":"aws:executeAutomation",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"RunbookTutorialChildAutomation",
               "Targets":[
                  {
                     "Key":"tag:{{PatchGroupSecondaryKey}}",
                     "Values":[
                        "{{PatchGroupSecondaryValue}}"
                     ]
                  }
               ],
               "TargetParameterName":"InstanceId"
            }
         }
      ]
   }
   ```

------

有关此示例中使用的自动化操作的更多信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

# 示例 2：脚本化运行手册
<a name="automation-authoring-runbooks-scripted-example"></a>

此示例运行手册解决以下情形。Emily 是 AnyCompany Consultants, LLC 的系统工程师。她之前创建了两个运行手册，这两个运行手册用于父子关系，以修补托管主数据库和辅助数据库的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的组。应用程序每天 24 小时访问这些数据库，因此这两个数据库实例中必须有一个始终可用。

基于此要求，她构建了一个解决方案，使用 `AWS-RunPatchBaseline` Systems Manager (SSM) 文档分阶段修补实例。通过使用此 SSM 文档，她的同事可以在修补操作完成后查看相关的修补程序合规性信息。

首先修补数据库实例的主组，然后修补数据库实例的辅助组。此外，为了避免由于运行之前已停止的实例而产生额外的成本，Emily 确保自动化将修补的实例恢复到修补之前的原始状态。Emily 使用与数据库实例的主组和辅助组关联的标签来确定应按照所需顺序修补哪些实例。

她现有的自动化解决方案有效，但她希望尽可能改进自己的解决方案。为了帮助维护运行手册内容并简化故障排除工作，她希望将自动化压缩到一个运行手册中，并简化输入参数的数量。此外，她希望避免创建多个子自动化。

在审查了可用的自动化操作后，Emily 确定可以使用 `aws:executeScript` 操作来运行她的自定义 Python 脚本，从而改进她的解决方案。她现在开始创作运行手册的内容，如下所示：

1. 首先，她为运行手册的架构和描述提供值，并定义父运行手册的输入参数。

   通过使用 `AutomationAssumeRole` 参数，Emily 和她的同事可以使用现有的 IAM 角色，使自动化代表他们执行运行手册中的操作。与[示例 1](automation-authoring-runbooks-parent-child-example.md) 不同的是，`AutomationAssumeRole` 参数现在是必需的，而不是可选的。因为这个运行手册包括 `aws:executeScript` 操作，所以始终需要一个 AWS Identity and Access Management (IAM) 服务角色（或担任角色）。此要求是必要的，因为某些为操作指定的 Python 脚本调用 AWS API 操作。

   Emily 使用 `PrimaryPatchGroupTag` 和 `SecondaryPatchGroupTag` 参数指定与要修补的数据库实例的主要和辅助组关联的标签。为了简化所需的输入参数，她决定使用 `StringMap` 参数，而不是使用多个 `String`参数，因为她在示例 1 运行手册中使用了后者。（可选）`Operation`、`RebootOption` 和 `SnapshotId` 参数可用于为 `AWS-RunPatchBaseline` 的文档参数提供值。为了防止向这些运行手册参数提供无效值，她根据需要定义了 `allowedValues`。

------
#### [ YAML ]

   ```
   description: 'An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.'
   schemaVersion: '0.3'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
     PrimaryPatchGroupTag:
       type: StringMap
       description: '(Required) The tag for the primary group of instances you want to patch. Specify a key-value pair. Example: {"key" : "value"}'
     SecondaryPatchGroupTag:
       type: StringMap
       description: '(Required) The tag for the secondary group of instances you want to patch. Specify a key-value pair. Example: {"key" : "value"}'
     SnapshotId:
       type: String
       description: '(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.'
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: '(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.'
       allowedValues:
         - Install
         - Scan
       default: Install
   ```

------
#### [ JSON ]

   ```
   {
      "description":"An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "schemaVersion":"0.3",
      "assumeRole":"{{AutomationAssumeRole}}",
      "parameters":{
         "AutomationAssumeRole":{
            "type":"String",
            "description":"(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook."
         },
         "PrimaryPatchGroupTag":{
            "type":"StringMap",
            "description":"(Required) The tag for the primary group of instances you want to patch. Specify a key-value pair. Example: {\"key\" : \"value\"}"
         },
         "SecondaryPatchGroupTag":{
            "type":"StringMap",
            "description":"(Required) The tag for the secondary group of instances you want to patch. Specify a key-value pair. Example: {\"key\" : \"value\"}"
         },
         "SnapshotId":{
            "type":"String",
            "description":"(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.",
            "default":""
         },
         "RebootOption":{
            "type":"String",
            "description":"(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.",
            "allowedValues":[
               "NoReboot",
               "RebootIfNeeded"
            ],
            "default":"RebootIfNeeded"
         },
         "Operation":{
            "type":"String",
            "description":"(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.",
            "allowedValues":[
               "Install",
               "Scan"
            ],
            "default":"Install"
         }
      }
   },
   ```

------

1. 定义顶层元素后，Emily 继续创作构成运行手册的 `mainSteps` 的操作。第一步收集与 `PrimaryPatchGroupTag` 参数中指定的标签关联的所有实例的 ID，并输出 `StringMap` 参数，其中包含实例 ID 和实例的当前状态。此操作的输出将用于后续操作。

   请注意，`script` 输入参数不支持 JSON 运行手册。JSON 运行手册必须使用 `attachment` 输入参数提供脚本内容。

------
#### [ YAML ]

   ```
   mainSteps:
     - name: getPrimaryInstanceState
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: getInstanceStates
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def getInstanceStates(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             tag = events['primaryTag']
             tagKey, tagValue = list(tag.items())[0]
             instanceQuery = ec2.describe_instances(
             Filters=[
                 {
                     "Name": "tag:" + tagKey,
                     "Values": [tagValue]
                 }]
             )
             if not instanceQuery['Reservations']:
                 noInstancesForTagString = "No instances found for specified tag."
                 return({ 'noInstancesFound' : noInstancesForTagString })
             else:
                 queryResponse = instanceQuery['Reservations']
                 originalInstanceStates = {}
                 for results in queryResponse:
                     instanceSet = results['Instances']
                     for instance in instanceSet:
                         instanceId = instance['InstanceId']
                         originalInstanceStates[instanceId] = instance['State']['Name']
                 return originalInstanceStates
       outputs:
         - Name: originalInstanceStates
           Selector: $.Payload
           Type: StringMap
       nextStep: verifyPrimaryInstancesRunning
   ```

------
#### [ JSON ]

   ```
   "mainSteps":[
         {
            "name":"getPrimaryInstanceState",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"getInstanceStates",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"originalInstanceStates",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               }
            ],
            "nextStep":"verifyPrimaryInstancesRunning"
         },
   ```

------

1. Emily 将上一个操作的输出用于另一个 `aws:executeScript` 操作，以验证与 `PrimaryPatchGroupTag` 参数中所指定标签相关联的所有实例均处于 `running` 状态。

   如果实例状态已处于 `running` 或者 `shutting-down` 状态，则脚本将继续遍历剩余的实例。

   如果实例的状态为 `stopping`，则脚本轮询实例以达到 `stopped` 状态并启动实例。

   如果实例的状态为 `stopped`，脚本将启动实例。

------
#### [ YAML ]

   ```
   - name: verifyPrimaryInstancesRunning
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: verifyInstancesRunning
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def verifyInstancesRunning(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped':
                   print("The target instance " + instance + " is stopped. The instance will now be started.")
                   ec2.start_instances(
                       InstanceIds=[instance]
                       )
               elif instanceDict[instance] == 'stopping':
                   print("The target instance " + instance + " is stopping. Polling for instance to reach stopped state.")
                   while instanceDict[instance] != 'stopped':
                       poll = ec2.get_waiter('instance_stopped')
                       poll.wait(
                           InstanceIds=[instance]
                       )
                   ec2.start_instances(
                       InstanceIds=[instance]
                   )
               else:
                 pass
       nextStep: waitForPrimaryRunningInstances
   ```

------
#### [ JSON ]

   ```
   {
            "name":"verifyPrimaryInstancesRunning",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"verifyInstancesRunning",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"waitForPrimaryRunningInstances"
         },
   ```

------

1. Emily 验证与 `PrimaryPatchGroupTag` 参数中指定的标签相关联的所有实例已启动或已处于 `running` 状态。然后，她使用另一个脚本来验证所有实例（包括在上一操作中启动的实例）已处于 `running` 状态。

------
#### [ YAML ]

   ```
   - name: waitForPrimaryRunningInstances
       action: 'aws:executeScript'
       timeoutSeconds: 300
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: waitForRunningInstances
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def waitForRunningInstances(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
                 poll = ec2.get_waiter('instance_running')
                 poll.wait(
                     InstanceIds=[instance]
                 )
       nextStep: returnPrimaryTagKey
   ```

------
#### [ JSON ]

   ```
   {
            "name":"waitForPrimaryRunningInstances",
            "action":"aws:executeScript",
            "timeoutSeconds":300,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"waitForRunningInstances",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"returnPrimaryTagKey"
         },
   ```

------

1. Emily 使用两个脚本来返回键的单个 `String` 值和 `PrimaryPatchGroupTag` 参数中指定的标签的值。这些操作返回的值允许她直接向 `Targets` 文档的参数 `AWS-RunPatchBaseline` 提供值。然后，自动化将继续使用 `aws:runCommand` 操作，利用 `AWS-RunPatchBaseline` 文档修补实例。

------
#### [ YAML ]

   ```
   - name: returnPrimaryTagKey
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['primaryTag']
             tagKey = list(tag)[0]
             stringKey = "tag:" + tagKey
             return {'tagKey' : stringKey}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: primaryPatchGroupKey
           Selector: $.Payload.tagKey
           Type: String
       nextStep: returnPrimaryTagValue
     - name: returnPrimaryTagValue
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['primaryTag']
             tagKey = list(tag)[0]
             tagValue = tag[tagKey]
             return {'tagValue' : tagValue}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: primaryPatchGroupValue
           Selector: $.Payload.tagValue
           Type: String
       nextStep: patchPrimaryInstances
     - name: patchPrimaryInstances
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         Targets:
           - Key: '{{returnPrimaryTagKey.primaryPatchGroupKey}}'
             Values:
               - '{{returnPrimaryTagValue.primaryPatchGroupValue}}'
         MaxConcurrency: 10%
         MaxErrors: 10%
       nextStep: returnPrimaryToOriginalState
   ```

------
#### [ JSON ]

   ```
   {
            "name":"returnPrimaryTagKey",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"primaryPatchGroupKey",
                  "Selector":"$.Payload.tagKey",
                  "Type":"String"
               }
            ],
            "nextStep":"returnPrimaryTagValue"
         },
         {
            "name":"returnPrimaryTagValue",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"primaryPatchGroupValue",
                  "Selector":"$.Payload.tagValue",
                  "Type":"String"
               }
            ],
            "nextStep":"patchPrimaryInstances"
         },
         {
            "name":"patchPrimaryInstances",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               },
               "Targets":[
                  {
                     "Key":"{{returnPrimaryTagKey.primaryPatchGroupKey}}",
                     "Values":[
                        "{{returnPrimaryTagValue.primaryPatchGroupValue}}"
                     ]
                  }
               ],
               "MaxConcurrency":"10%",
               "MaxErrors":"10%"
            },
            "nextStep":"returnPrimaryToOriginalState"
         },
   ```

------

1. 修补操作完成后，Emily 希望自动化将与 `PrimaryPatchGroupTag` 参数中所指定标签相关联的目标实例返回到自动化开始之前的状态。她通过再次使用脚本中第一个操作的输出来完成此操作。根据目标实例的原始状态，如果该实例以前处于 `running` 以外的任何状态，则实例将停止。否则，如果实例状态为 `running`，则脚本将继续遍历剩余的实例。

------
#### [ YAML ]

   ```
   - name: returnPrimaryToOriginalState
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnToOriginalState
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def returnToOriginalState(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped' or instanceDict[instance] == 'stopping':
                   ec2.stop_instances(
                       InstanceIds=[instance]
                       )
               else:
                 pass
       nextStep: getSecondaryInstanceState
   ```

------
#### [ JSON ]

   ```
   {
            "name":"returnPrimaryToOriginalState",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnToOriginalState",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"getSecondaryInstanceState"
         },
   ```

------

1. 针对与 `PrimaryPatchGroupTag` 参数中所指定标签相关联的实例的修补操作已完成。现在 Emily 复制了运行手册内容中以前的所有操作，将与 `SecondaryPatchGroupTag` 参数中所指定标签相关联的实例设置为目标。

------
#### [ YAML ]

   ```
   - name: getSecondaryInstanceState
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: getInstanceStates
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def getInstanceStates(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             tag = events['secondaryTag']
             tagKey, tagValue = list(tag.items())[0]
             instanceQuery = ec2.describe_instances(
             Filters=[
                 {
                     "Name": "tag:" + tagKey,
                     "Values": [tagValue]
                 }]
             )
             if not instanceQuery['Reservations']:
                 noInstancesForTagString = "No instances found for specified tag."
                 return({ 'noInstancesFound' : noInstancesForTagString })
             else:
                 queryResponse = instanceQuery['Reservations']
                 originalInstanceStates = {}
                 for results in queryResponse:
                     instanceSet = results['Instances']
                     for instance in instanceSet:
                         instanceId = instance['InstanceId']
                         originalInstanceStates[instanceId] = instance['State']['Name']
                 return originalInstanceStates
       outputs:
         - Name: originalInstanceStates
           Selector: $.Payload
           Type: StringMap
       nextStep: verifySecondaryInstancesRunning
     - name: verifySecondaryInstancesRunning
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: verifyInstancesRunning
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def verifyInstancesRunning(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped':
                   print("The target instance " + instance + " is stopped. The instance will now be started.")
                   ec2.start_instances(
                       InstanceIds=[instance]
                       )
               elif instanceDict[instance] == 'stopping':
                   print("The target instance " + instance + " is stopping. Polling for instance to reach stopped state.")
                   while instanceDict[instance] != 'stopped':
                       poll = ec2.get_waiter('instance_stopped')
                       poll.wait(
                           InstanceIds=[instance]
                       )
                   ec2.start_instances(
                       InstanceIds=[instance]
                   )
               else:
                 pass
       nextStep: waitForSecondaryRunningInstances
     - name: waitForSecondaryRunningInstances
       action: 'aws:executeScript'
       timeoutSeconds: 300
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: waitForRunningInstances
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def waitForRunningInstances(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
                 poll = ec2.get_waiter('instance_running')
                 poll.wait(
                     InstanceIds=[instance]
                 )
       nextStep: returnSecondaryTagKey
     - name: returnSecondaryTagKey
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['secondaryTag']
             tagKey = list(tag)[0]
             stringKey = "tag:" + tagKey
             return {'tagKey' : stringKey}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: secondaryPatchGroupKey
           Selector: $.Payload.tagKey
           Type: String
       nextStep: returnSecondaryTagValue
     - name: returnSecondaryTagValue
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['secondaryTag']
             tagKey = list(tag)[0]
             tagValue = tag[tagKey]
             return {'tagValue' : tagValue}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: secondaryPatchGroupValue
           Selector: $.Payload.tagValue
           Type: String
       nextStep: patchSecondaryInstances
     - name: patchSecondaryInstances
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         Targets:
           - Key: '{{returnSecondaryTagKey.secondaryPatchGroupKey}}'
             Values:
             - '{{returnSecondaryTagValue.secondaryPatchGroupValue}}'
         MaxConcurrency: 10%
         MaxErrors: 10%
       nextStep: returnSecondaryToOriginalState
     - name: returnSecondaryToOriginalState
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnToOriginalState
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def returnToOriginalState(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped' or instanceDict[instance] == 'stopping':
                   ec2.stop_instances(
                       InstanceIds=[instance]
                       )
               else:
                 pass
   ```

------
#### [ JSON ]

   ```
   {
            "name":"getSecondaryInstanceState",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"getInstanceStates",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"originalInstanceStates",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               }
            ],
            "nextStep":"verifySecondaryInstancesRunning"
         },
         {
            "name":"verifySecondaryInstancesRunning",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"verifyInstancesRunning",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"waitForSecondaryRunningInstances"
         },
         {
            "name":"waitForSecondaryRunningInstances",
            "action":"aws:executeScript",
            "timeoutSeconds":300,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"waitForRunningInstances",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"returnSecondaryTagKey"
         },
         {
            "name":"returnSecondaryTagKey",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"secondaryPatchGroupKey",
                  "Selector":"$.Payload.tagKey",
                  "Type":"String"
               }
            ],
            "nextStep":"returnSecondaryTagValue"
         },
         {
            "name":"returnSecondaryTagValue",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"secondaryPatchGroupValue",
                  "Selector":"$.Payload.tagValue",
                  "Type":"String"
               }
            ],
            "nextStep":"patchSecondaryInstances"
         },
         {
            "name":"patchSecondaryInstances",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               },
               "Targets":[
                  {
                     "Key":"{{returnSecondaryTagKey.secondaryPatchGroupKey}}",
                     "Values":[
                        "{{returnSecondaryTagValue.secondaryPatchGroupValue}}"
                     ]
                  }
               ],
               "MaxConcurrency":"10%",
               "MaxErrors":"10%"
            },
            "nextStep":"returnSecondaryToOriginalState"
         },
         {
            "name":"returnSecondaryToOriginalState",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnToOriginalState",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            }
         }
      ]
   }
   ```

------

1. Emily 查看已完成的脚本化运行手册内容，并在同一 AWS 账户和 AWS 区域中创建运行手册作为目标实例。现在，她已经准备好测试运行手册，以确保在将自动化实施到生产环境之前自动化能够按需运行。下面是完成的脚本化运行手册内容。

------
#### [ YAML ]

   ```
   description: An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.
   schemaVersion: '0.3'
   assumeRole: '{{AutomationAssumeRole}}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook.'
     PrimaryPatchGroupTag:
       type: StringMap
       description: '(Required) The tag for the primary group of instances you want to patch. Specify a key-value pair. Example: {"key" : "value"}'
     SecondaryPatchGroupTag:
       type: StringMap
       description: '(Required) The tag for the secondary group of instances you want to patch. Specify a key-value pair. Example: {"key" : "value"}'
     SnapshotId:
       type: String
       description: '(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.'
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: '(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.'
       allowedValues:
         - Install
         - Scan
       default: Install
   mainSteps:
     - name: getPrimaryInstanceState
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: getInstanceStates
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def getInstanceStates(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             tag = events['primaryTag']
             tagKey, tagValue = list(tag.items())[0]
             instanceQuery = ec2.describe_instances(
             Filters=[
                 {
                     "Name": "tag:" + tagKey,
                     "Values": [tagValue]
                 }]
             )
             if not instanceQuery['Reservations']:
                 noInstancesForTagString = "No instances found for specified tag."
                 return({ 'noInstancesFound' : noInstancesForTagString })
             else:
                 queryResponse = instanceQuery['Reservations']
                 originalInstanceStates = {}
                 for results in queryResponse:
                     instanceSet = results['Instances']
                     for instance in instanceSet:
                         instanceId = instance['InstanceId']
                         originalInstanceStates[instanceId] = instance['State']['Name']
                 return originalInstanceStates
       outputs:
         - Name: originalInstanceStates
           Selector: $.Payload
           Type: StringMap
       nextStep: verifyPrimaryInstancesRunning
     - name: verifyPrimaryInstancesRunning
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: verifyInstancesRunning
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def verifyInstancesRunning(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped':
                   print("The target instance " + instance + " is stopped. The instance will now be started.")
                   ec2.start_instances(
                       InstanceIds=[instance]
                       )
               elif instanceDict[instance] == 'stopping':
                   print("The target instance " + instance + " is stopping. Polling for instance to reach stopped state.")
                   while instanceDict[instance] != 'stopped':
                       poll = ec2.get_waiter('instance_stopped')
                       poll.wait(
                           InstanceIds=[instance]
                       )
                   ec2.start_instances(
                       InstanceIds=[instance]
                   )
               else:
                 pass
       nextStep: waitForPrimaryRunningInstances
     - name: waitForPrimaryRunningInstances
       action: 'aws:executeScript'
       timeoutSeconds: 300
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: waitForRunningInstances
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def waitForRunningInstances(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
                 poll = ec2.get_waiter('instance_running')
                 poll.wait(
                     InstanceIds=[instance]
                 )
       nextStep: returnPrimaryTagKey
     - name: returnPrimaryTagKey
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['primaryTag']
             tagKey = list(tag)[0]
             stringKey = "tag:" + tagKey
             return {'tagKey' : stringKey}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: primaryPatchGroupKey
           Selector: $.Payload.tagKey
           Type: String
       nextStep: returnPrimaryTagValue
     - name: returnPrimaryTagValue
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           primaryTag: '{{PrimaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['primaryTag']
             tagKey = list(tag)[0]
             tagValue = tag[tagKey]
             return {'tagValue' : tagValue}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: primaryPatchGroupValue
           Selector: $.Payload.tagValue
           Type: String
       nextStep: patchPrimaryInstances
     - name: patchPrimaryInstances
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         Targets:
           - Key: '{{returnPrimaryTagKey.primaryPatchGroupKey}}'
             Values:
               - '{{returnPrimaryTagValue.primaryPatchGroupValue}}'
         MaxConcurrency: 10%
         MaxErrors: 10%
       nextStep: returnPrimaryToOriginalState
     - name: returnPrimaryToOriginalState
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnToOriginalState
         InputPayload:
           targetInstances: '{{getPrimaryInstanceState.originalInstanceStates}}'
         Script: |-
           def returnToOriginalState(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped' or instanceDict[instance] == 'stopping':
                   ec2.stop_instances(
                       InstanceIds=[instance]
                       )
               else:
                 pass
       nextStep: getSecondaryInstanceState
     - name: getSecondaryInstanceState
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: getInstanceStates
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def getInstanceStates(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             tag = events['secondaryTag']
             tagKey, tagValue = list(tag.items())[0]
             instanceQuery = ec2.describe_instances(
             Filters=[
                 {
                     "Name": "tag:" + tagKey,
                     "Values": [tagValue]
                 }]
             )
             if not instanceQuery['Reservations']:
                 noInstancesForTagString = "No instances found for specified tag."
                 return({ 'noInstancesFound' : noInstancesForTagString })
             else:
                 queryResponse = instanceQuery['Reservations']
                 originalInstanceStates = {}
                 for results in queryResponse:
                     instanceSet = results['Instances']
                     for instance in instanceSet:
                         instanceId = instance['InstanceId']
                         originalInstanceStates[instanceId] = instance['State']['Name']
                 return originalInstanceStates
       outputs:
         - Name: originalInstanceStates
           Selector: $.Payload
           Type: StringMap
       nextStep: verifySecondaryInstancesRunning
     - name: verifySecondaryInstancesRunning
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: verifyInstancesRunning
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def verifyInstancesRunning(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped':
                   print("The target instance " + instance + " is stopped. The instance will now be started.")
                   ec2.start_instances(
                       InstanceIds=[instance]
                       )
               elif instanceDict[instance] == 'stopping':
                   print("The target instance " + instance + " is stopping. Polling for instance to reach stopped state.")
                   while instanceDict[instance] != 'stopped':
                       poll = ec2.get_waiter('instance_stopped')
                       poll.wait(
                           InstanceIds=[instance]
                       )
                   ec2.start_instances(
                       InstanceIds=[instance]
                   )
               else:
                 pass
       nextStep: waitForSecondaryRunningInstances
     - name: waitForSecondaryRunningInstances
       action: 'aws:executeScript'
       timeoutSeconds: 300
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: waitForRunningInstances
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def waitForRunningInstances(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
                 poll = ec2.get_waiter('instance_running')
                 poll.wait(
                     InstanceIds=[instance]
                 )
       nextStep: returnSecondaryTagKey
     - name: returnSecondaryTagKey
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['secondaryTag']
             tagKey = list(tag)[0]
             stringKey = "tag:" + tagKey
             return {'tagKey' : stringKey}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: secondaryPatchGroupKey
           Selector: $.Payload.tagKey
           Type: String
       nextStep: returnSecondaryTagValue
     - name: returnSecondaryTagValue
       action: 'aws:executeScript'
       timeoutSeconds: 120
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnTagValues
         InputPayload:
           secondaryTag: '{{SecondaryPatchGroupTag}}'
         Script: |-
           def returnTagValues(events,context):
             tag = events['secondaryTag']
             tagKey = list(tag)[0]
             tagValue = tag[tagKey]
             return {'tagValue' : tagValue}
       outputs:
         - Name: Payload
           Selector: $.Payload
           Type: StringMap
         - Name: secondaryPatchGroupValue
           Selector: $.Payload.tagValue
           Type: String
       nextStep: patchSecondaryInstances
     - name: patchSecondaryInstances
       action: 'aws:runCommand'
       onFailure: Abort
       timeoutSeconds: 7200
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         Targets:
           - Key: '{{returnSecondaryTagKey.secondaryPatchGroupKey}}'
             Values:
             - '{{returnSecondaryTagValue.secondaryPatchGroupValue}}'
         MaxConcurrency: 10%
         MaxErrors: 10%
       nextStep: returnSecondaryToOriginalState
     - name: returnSecondaryToOriginalState
       action: 'aws:executeScript'
       timeoutSeconds: 600
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: returnToOriginalState
         InputPayload:
           targetInstances: '{{getSecondaryInstanceState.originalInstanceStates}}'
         Script: |-
           def returnToOriginalState(events,context):
             import boto3
   
             #Initialize client
             ec2 = boto3.client('ec2')
             instanceDict = events['targetInstances']
             for instance in instanceDict:
               if instanceDict[instance] == 'stopped' or instanceDict[instance] == 'stopping':
                   ec2.stop_instances(
                       InstanceIds=[instance]
                       )
               else:
                 pass
   ```

------
#### [ JSON ]

   ```
   {
      "description":"An example of an Automation runbook that patches groups of Amazon EC2 instances in stages.",
      "schemaVersion":"0.3",
      "assumeRole":"{{AutomationAssumeRole}}",
      "parameters":{
         "AutomationAssumeRole":{
            "type":"String",
            "description":"(Required) The Amazon Resource Name (ARN) of the IAM role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to operate this runbook."
         },
         "PrimaryPatchGroupTag":{
            "type":"StringMap",
            "description":"(Required) The tag for the primary group of instances you want to patch. Specify a key-value pair. Example: {\"key\" : \"value\"}"
         },
         "SecondaryPatchGroupTag":{
            "type":"StringMap",
            "description":"(Required) The tag for the secondary group of instances you want to patch. Specify a key-value pair. Example: {\"key\" : \"value\"}"
         },
         "SnapshotId":{
            "type":"String",
            "description":"(Optional) The snapshot ID to use to retrieve a patch baseline snapshot.",
            "default":""
         },
         "RebootOption":{
            "type":"String",
            "description":"(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.",
            "allowedValues":[
               "NoReboot",
               "RebootIfNeeded"
            ],
            "default":"RebootIfNeeded"
         },
         "Operation":{
            "type":"String",
            "description":"(Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.",
            "allowedValues":[
               "Install",
               "Scan"
            ],
            "default":"Install"
         }
      },
      "mainSteps":[
         {
            "name":"getPrimaryInstanceState",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"getInstanceStates",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"originalInstanceStates",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               }
            ],
            "nextStep":"verifyPrimaryInstancesRunning"
         },
         {
            "name":"verifyPrimaryInstancesRunning",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"verifyInstancesRunning",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"waitForPrimaryRunningInstances"
         },
         {
            "name":"waitForPrimaryRunningInstances",
            "action":"aws:executeScript",
            "timeoutSeconds":300,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"waitForRunningInstances",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"returnPrimaryTagKey"
         },
         {
            "name":"returnPrimaryTagKey",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"primaryPatchGroupKey",
                  "Selector":"$.Payload.tagKey",
                  "Type":"String"
               }
            ],
            "nextStep":"returnPrimaryTagValue"
         },
         {
            "name":"returnPrimaryTagValue",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "primaryTag":"{{PrimaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"primaryPatchGroupValue",
                  "Selector":"$.Payload.tagValue",
                  "Type":"String"
               }
            ],
            "nextStep":"patchPrimaryInstances"
         },
         {
            "name":"patchPrimaryInstances",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               },
               "Targets":[
                  {
                     "Key":"{{returnPrimaryTagKey.primaryPatchGroupKey}}",
                     "Values":[
                        "{{returnPrimaryTagValue.primaryPatchGroupValue}}"
                     ]
                  }
               ],
               "MaxConcurrency":"10%",
               "MaxErrors":"10%"
            },
            "nextStep":"returnPrimaryToOriginalState"
         },
         {
            "name":"returnPrimaryToOriginalState",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnToOriginalState",
               "InputPayload":{
                  "targetInstances":"{{getPrimaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"getSecondaryInstanceState"
         },
         {
            "name":"getSecondaryInstanceState",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"getInstanceStates",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"originalInstanceStates",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               }
            ],
            "nextStep":"verifySecondaryInstancesRunning"
         },
         {
            "name":"verifySecondaryInstancesRunning",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"verifyInstancesRunning",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"waitForSecondaryRunningInstances"
         },
         {
            "name":"waitForSecondaryRunningInstances",
            "action":"aws:executeScript",
            "timeoutSeconds":300,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"waitForRunningInstances",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            },
            "nextStep":"returnSecondaryTagKey"
         },
         {
            "name":"returnSecondaryTagKey",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"secondaryPatchGroupKey",
                  "Selector":"$.Payload.tagKey",
                  "Type":"String"
               }
            ],
            "nextStep":"returnSecondaryTagValue"
         },
         {
            "name":"returnSecondaryTagValue",
            "action":"aws:executeScript",
            "timeoutSeconds":120,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnTagValues",
               "InputPayload":{
                  "secondaryTag":"{{SecondaryPatchGroupTag}}"
               },
               "Script":"..."
            },
            "outputs":[
               {
                  "Name":"Payload",
                  "Selector":"$.Payload",
                  "Type":"StringMap"
               },
               {
                  "Name":"secondaryPatchGroupValue",
                  "Selector":"$.Payload.tagValue",
                  "Type":"String"
               }
            ],
            "nextStep":"patchSecondaryInstances"
         },
         {
            "name":"patchSecondaryInstances",
            "action":"aws:runCommand",
            "onFailure":"Abort",
            "timeoutSeconds":7200,
            "inputs":{
               "DocumentName":"AWS-RunPatchBaseline",
               "Parameters":{
                  "SnapshotId":"{{SnapshotId}}",
                  "RebootOption":"{{RebootOption}}",
                  "Operation":"{{Operation}}"
               },
               "Targets":[
                  {
                     "Key":"{{returnSecondaryTagKey.secondaryPatchGroupKey}}",
                     "Values":[
                        "{{returnSecondaryTagValue.secondaryPatchGroupValue}}"
                     ]
                  }
               ],
               "MaxConcurrency":"10%",
               "MaxErrors":"10%"
            },
            "nextStep":"returnSecondaryToOriginalState"
         },
         {
            "name":"returnSecondaryToOriginalState",
            "action":"aws:executeScript",
            "timeoutSeconds":600,
            "onFailure":"Abort",
            "inputs":{
               "Runtime":"python3.11",
               "Handler":"returnToOriginalState",
               "InputPayload":{
                  "targetInstances":"{{getSecondaryInstanceState.originalInstanceStates}}"
               },
               "Script":"..."
            }
         }
      ]
   }
   ```

------

有关此示例中使用的自动化操作的更多信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

# 其他运行手册示例
<a name="automation-document-examples"></a>

以下示例运行手册演示了如何使用 AWS Systems Manager 自动化操作来自动执行常见部署、故障排除和维护任务。

**注意**  
本部分提供的示例运行手册旨在演示如何创建自定义运行手册以支持您的特定操作需求。这些运行手册并非供您在生产环境中原样使用。但是，您可以自定义这些文档来满足自己的使用需求。

**Topics**
+ [部署 VPC 架构和 Microsoft Active Directory 域控制器](automation-document-architecture-deployment-example.md)
+ [从最新快照还原根卷](automation-document-instance-recovery-example.md)
+ [创建 AMI 和跨区域副本](automation-document-backup-maintenance-example.md)

# 部署 VPC 架构和 Microsoft Active Directory 域控制器
<a name="automation-document-architecture-deployment-example"></a>

要提高效率并实现常见任务的标准化，可以选择自动执行部署。如果您定期在多个账户和 AWS 区域 中部署相同的架构，此操作会很有帮助。自动进行架构部署还可以降低在手动部署架构时发生人为错误的可能性。AWS Systems Manager自动化操作可帮助您做到这一点。Automation 是 AWS Systems Manager 中的一项工具。

以下示例 AWS Systems Manager 运行手册执行这些操作：
+ 使用 Systems Manager Parameter Store 检索最新的 Windows Server 2016 Amazon Machine Image（AMI），在启动将配置作为域控制器的 EC2 实例时使用。Parameter Store 是 AWS Systems Manager 中的一项工具。
+ 使用 `aws:executeAwsApi` 自动化操作调用多个 AWS API 操作来创建 VPC 架构。域控制器实例在私有子网中启动，使用 NAT 网关连接到 Internet。这允许实例上的 SSM Agent 以访问必需的 Systems Manager 端点。
+ 使用 `aws:waitForAwsResourceProperty` 自动化操作确认上一个操作所启动的实例对于 `Online` 处于 AWS Systems Manager 状态。
+ 使用 `aws:runCommand` 自动化操作配置作为 Microsoft Active Directory 域控制器启动的实例。

------
#### [ YAML ]

```
    ---
    description: Custom Automation Deployment Example
    schemaVersion: '0.3'
    parameters:
      AutomationAssumeRole:
        type: String
        default: ''
        description: >-
          (Optional) The ARN of the role that allows Automation to perform the
          actions on your behalf. If no role is specified, Systems Manager
          Automation uses your IAM permissions to run this runbook.
    mainSteps:
      - name: getLatestWindowsAmi
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ssm
          Api: GetParameter
          Name: >-
            /aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base
        outputs:
          - Name: amiId
            Selector: $.Parameter.Value
            Type: String
        nextStep: createSSMInstanceRole
      - name: createSSMInstanceRole
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: iam
          Api: CreateRole
          AssumeRolePolicyDocument: >-
            {"Version": "2012-10-17",		 	 	 "Statement":[{"Effect":"Allow","Principal":{"Service":["ec2.amazonaws.com"]},"Action":["sts:AssumeRole"]}]}
          RoleName: sampleSSMInstanceRole
        nextStep: attachManagedSSMPolicy
      - name: attachManagedSSMPolicy
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: iam
          Api: AttachRolePolicy
          PolicyArn: 'arn:aws:iam::aws:policy/service-role/AmazonSSMManagedInstanceCore'
          RoleName: sampleSSMInstanceRole
        nextStep: createSSMInstanceProfile
      - name: createSSMInstanceProfile
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: iam
          Api: CreateInstanceProfile
          InstanceProfileName: sampleSSMInstanceRole
        outputs:
          - Name: instanceProfileArn
            Selector: $.InstanceProfile.Arn
            Type: String
        nextStep: addSSMInstanceRoleToProfile
      - name: addSSMInstanceRoleToProfile
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: iam
          Api: AddRoleToInstanceProfile
          InstanceProfileName: sampleSSMInstanceRole
          RoleName: sampleSSMInstanceRole
        nextStep: createVpc
      - name: createVpc
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateVpc
          CidrBlock: 10.0.100.0/22
        outputs:
          - Name: vpcId
            Selector: $.Vpc.VpcId
            Type: String
        nextStep: getMainRtb
      - name: getMainRtb
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: DescribeRouteTables
          Filters:
            - Name: vpc-id
              Values:
                - '{{ createVpc.vpcId }}'
        outputs:
          - Name: mainRtbId
            Selector: '$.RouteTables[0].RouteTableId'
            Type: String
        nextStep: verifyMainRtb
      - name: verifyMainRtb
        action: aws:assertAwsResourceProperty
        onFailure: Abort
        inputs:
          Service: ec2
          Api: DescribeRouteTables
          RouteTableIds:
            - '{{ getMainRtb.mainRtbId }}'
          PropertySelector: '$.RouteTables[0].Associations[0].Main'
          DesiredValues:
            - 'True'
        nextStep: createPubSubnet
      - name: createPubSubnet
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateSubnet
          CidrBlock: 10.0.103.0/24
          AvailabilityZone: us-west-2c
          VpcId: '{{ createVpc.vpcId }}'
        outputs:
          - Name: pubSubnetId
            Selector: $.Subnet.SubnetId
            Type: String
        nextStep: createPubRtb
      - name: createPubRtb
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateRouteTable
          VpcId: '{{ createVpc.vpcId }}'
        outputs:
          - Name: pubRtbId
            Selector: $.RouteTable.RouteTableId
            Type: String
        nextStep: createIgw
      - name: createIgw
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateInternetGateway
        outputs:
          - Name: igwId
            Selector: $.InternetGateway.InternetGatewayId
            Type: String
        nextStep: attachIgw
      - name: attachIgw
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: AttachInternetGateway
          InternetGatewayId: '{{ createIgw.igwId }}'
          VpcId: '{{ createVpc.vpcId }}'
        nextStep: allocateEip
      - name: allocateEip
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: AllocateAddress
          Domain: vpc
        outputs:
          - Name: eipAllocationId
            Selector: $.AllocationId
            Type: String
        nextStep: createNatGw
      - name: createNatGw
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateNatGateway
          AllocationId: '{{ allocateEip.eipAllocationId }}'
          SubnetId: '{{ createPubSubnet.pubSubnetId }}'
        outputs:
          - Name: natGwId
            Selector: $.NatGateway.NatGatewayId
            Type: String
        nextStep: verifyNatGwAvailable
      - name: verifyNatGwAvailable
        action: aws:waitForAwsResourceProperty
        timeoutSeconds: 150
        inputs:
          Service: ec2
          Api: DescribeNatGateways
          NatGatewayIds:
            - '{{ createNatGw.natGwId }}'
          PropertySelector: '$.NatGateways[0].State'
          DesiredValues:
            - available
        nextStep: createNatRoute
      - name: createNatRoute
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateRoute
          DestinationCidrBlock: 0.0.0.0/0
          NatGatewayId: '{{ createNatGw.natGwId }}'
          RouteTableId: '{{ getMainRtb.mainRtbId }}'
        nextStep: createPubRoute
      - name: createPubRoute
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateRoute
          DestinationCidrBlock: 0.0.0.0/0
          GatewayId: '{{ createIgw.igwId }}'
          RouteTableId: '{{ createPubRtb.pubRtbId }}'
        nextStep: setPubSubAssoc
      - name: setPubSubAssoc
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: AssociateRouteTable
          RouteTableId: '{{ createPubRtb.pubRtbId }}'
          SubnetId: '{{ createPubSubnet.pubSubnetId }}'
      - name: createDhcpOptions
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateDhcpOptions
          DhcpConfigurations:
            - Key: domain-name-servers
              Values:
                - '10.0.100.50,10.0.101.50'
            - Key: domain-name
              Values:
                - sample.com
        outputs:
          - Name: dhcpOptionsId
            Selector: $.DhcpOptions.DhcpOptionsId
            Type: String
        nextStep: createDCSubnet1
      - name: createDCSubnet1
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateSubnet
          CidrBlock: 10.0.100.0/24
          AvailabilityZone: us-west-2a
          VpcId: '{{ createVpc.vpcId }}'
        outputs:
          - Name: firstSubnetId
            Selector: $.Subnet.SubnetId
            Type: String
        nextStep: createDCSubnet2
      - name: createDCSubnet2
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateSubnet
          CidrBlock: 10.0.101.0/24
          AvailabilityZone: us-west-2b
          VpcId: '{{ createVpc.vpcId }}'
        outputs:
          - Name: secondSubnetId
            Selector: $.Subnet.SubnetId
            Type: String
        nextStep: createDCSecGroup
      - name: createDCSecGroup
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: CreateSecurityGroup
          GroupName: SampleDCSecGroup
          Description: Security Group for Sample Domain Controllers
          VpcId: '{{ createVpc.vpcId }}'
        outputs:
          - Name: dcSecGroupId
            Selector: $.GroupId
            Type: String
        nextStep: authIngressDCTraffic
      - name: authIngressDCTraffic
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: AuthorizeSecurityGroupIngress
          GroupId: '{{ createDCSecGroup.dcSecGroupId }}'
          IpPermissions:
            - FromPort: -1
              IpProtocol: '-1'
              IpRanges:
                - CidrIp: 0.0.0.0/0
                  Description: Allow all traffic between Domain Controllers
        nextStep: verifyInstanceProfile
      - name: verifyInstanceProfile
        action: aws:waitForAwsResourceProperty
        maxAttempts: 5
        onFailure: Abort
        inputs:
          Service: iam
          Api: ListInstanceProfilesForRole
          RoleName: sampleSSMInstanceRole
          PropertySelector: '$.InstanceProfiles[0].Arn'
          DesiredValues:
            - '{{ createSSMInstanceProfile.instanceProfileArn }}'
        nextStep: iamEventualConsistency
      - name: iamEventualConsistency
        action: aws:sleep
        inputs:
          Duration: PT2M
        nextStep: launchDC1
      - name: launchDC1
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: RunInstances
          BlockDeviceMappings:
            - DeviceName: /dev/sda1
              Ebs:
                DeleteOnTermination: true
                VolumeSize: 50
                VolumeType: gp2
            - DeviceName: xvdf
              Ebs:
                DeleteOnTermination: true
                VolumeSize: 100
                VolumeType: gp2
          IamInstanceProfile:
            Arn: '{{ createSSMInstanceProfile.instanceProfileArn }}'
          ImageId: '{{ getLatestWindowsAmi.amiId }}'
          InstanceType: t2.micro
          MaxCount: 1
          MinCount: 1
          PrivateIpAddress: 10.0.100.50
          SecurityGroupIds:
            - '{{ createDCSecGroup.dcSecGroupId }}'
          SubnetId: '{{ createDCSubnet1.firstSubnetId }}'
          TagSpecifications:
            - ResourceType: instance
              Tags:
                - Key: Name
                  Value: SampleDC1
        outputs:
          - Name: pdcInstanceId
            Selector: '$.Instances[0].InstanceId'
            Type: String
        nextStep: launchDC2
      - name: launchDC2
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: RunInstances
          BlockDeviceMappings:
            - DeviceName: /dev/sda1
              Ebs:
                DeleteOnTermination: true
                VolumeSize: 50
                VolumeType: gp2
            - DeviceName: xvdf
              Ebs:
                DeleteOnTermination: true
                VolumeSize: 100
                VolumeType: gp2
          IamInstanceProfile:
            Arn: '{{ createSSMInstanceProfile.instanceProfileArn }}'
          ImageId: '{{ getLatestWindowsAmi.amiId }}'
          InstanceType: t2.micro
          MaxCount: 1
          MinCount: 1
          PrivateIpAddress: 10.0.101.50
          SecurityGroupIds:
            - '{{ createDCSecGroup.dcSecGroupId }}'
          SubnetId: '{{ createDCSubnet2.secondSubnetId }}'
          TagSpecifications:
            - ResourceType: instance
              Tags:
                - Key: Name
                  Value: SampleDC2
        outputs:
          - Name: adcInstanceId
            Selector: '$.Instances[0].InstanceId'
            Type: String
        nextStep: verifyDCInstanceState
      - name: verifyDCInstanceState
        action: aws:waitForAwsResourceProperty
        inputs:
          Service: ec2
          Api: DescribeInstanceStatus
          IncludeAllInstances: true
          InstanceIds:
            - '{{ launchDC1.pdcInstanceId }}'
            - '{{ launchDC2.adcInstanceId }}'
          PropertySelector: '$.InstanceStatuses..InstanceState.Name'
          DesiredValues:
            - running
        nextStep: verifyInstancesOnlineSSM
      - name: verifyInstancesOnlineSSM
        action: aws:waitForAwsResourceProperty
        timeoutSeconds: 600
        inputs:
          Service: ssm
          Api: DescribeInstanceInformation
          InstanceInformationFilterList:
            - key: InstanceIds
              valueSet:
                - '{{ launchDC1.pdcInstanceId }}'
                - '{{ launchDC2.adcInstanceId }}'
          PropertySelector: '$.InstanceInformationList..PingStatus'
          DesiredValues:
            - Online
        nextStep: installADRoles
      - name: installADRoles
        action: aws:runCommand
        inputs:
          DocumentName: AWS-RunPowerShellScript
          InstanceIds:
            - '{{ launchDC1.pdcInstanceId }}'
            - '{{ launchDC2.adcInstanceId }}'
          Parameters:
            commands: |-
              try {
                  Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools
              }
              catch {
                  Write-Error "Failed to install ADDS Role."
              }
        nextStep: setAdminPassword
      - name: setAdminPassword
        action: aws:runCommand
        inputs:
          DocumentName: AWS-RunPowerShellScript
          InstanceIds:
            - '{{ launchDC1.pdcInstanceId }}'
          Parameters:
            commands:
              - net user Administrator "sampleAdminPass123!"
        nextStep: createForest
      - name: createForest
        action: aws:runCommand
        inputs:
          DocumentName: AWS-RunPowerShellScript
          InstanceIds:
            - '{{ launchDC1.pdcInstanceId }}'
          Parameters:
            commands: |-
              $dsrmPass = 'sample123!' | ConvertTo-SecureString -asPlainText -Force
              try {
                  Install-ADDSForest -DomainName "sample.com" -DomainMode 6 -ForestMode 6 -InstallDNS -DatabasePath "D:\NTDS" -SysvolPath "D:\SYSVOL" -SafeModeAdministratorPassword $dsrmPass -Force
              }
              catch {
                  Write-Error $_
              }
              try {
                  Add-DnsServerForwarder -IPAddress "10.0.100.2"
              }
              catch {
                  Write-Error $_
              }
        nextStep: associateDhcpOptions
      - name: associateDhcpOptions
        action: aws:executeAwsApi
        onFailure: Abort
        inputs:
          Service: ec2
          Api: AssociateDhcpOptions
          DhcpOptionsId: '{{ createDhcpOptions.dhcpOptionsId }}'
          VpcId: '{{ createVpc.vpcId }}'
        nextStep: waitForADServices
      - name: waitForADServices
        action: aws:sleep
        inputs:
          Duration: PT1M
        nextStep: promoteADC
      - name: promoteADC
        action: aws:runCommand
        inputs:
          DocumentName: AWS-RunPowerShellScript
          InstanceIds:
            - '{{ launchDC2.adcInstanceId }}'
          Parameters:
            commands: |-
              ipconfig /renew
              $dsrmPass = 'sample123!' | ConvertTo-SecureString -asPlainText -Force
              $domAdminUser = "sample\Administrator"
              $domAdminPass = "sampleAdminPass123!" | ConvertTo-SecureString -asPlainText -Force
              $domAdminCred = New-Object System.Management.Automation.PSCredential($domAdminUser,$domAdminPass)
    
              try {
                  Install-ADDSDomainController -DomainName "sample.com" -InstallDNS -DatabasePath "D:\NTDS" -SysvolPath "D:\SYSVOL" -SafeModeAdministratorPassword $dsrmPass -Credential $domAdminCred -Force
              }
              catch {
                  Write-Error $_
              }
```

------
#### [ JSON ]

```
{
      "description": "Custom Automation Deployment Example",
      "schemaVersion": "0.3",
      "assumeRole": "{{ AutomationAssumeRole }}",
      "parameters": {
        "AutomationAssumeRole": {
          "type": "String",
          "description": "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to run this runbook.",
          "default": ""
        }
      },
      "mainSteps": [
        {
          "name": "getLatestWindowsAmi",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ssm",
            "Api": "GetParameter",
            "Name": "/aws/service/ami-windows-latest/Windows_Server-2016-English-Full-Base"
          },
          "outputs": [
            {
              "Name": "amiId",
              "Selector": "$.Parameter.Value",
              "Type": "String"
            }
          ],
          "nextStep": "createSSMInstanceRole"
        },
        {
          "name": "createSSMInstanceRole",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "iam",
            "Api": "CreateRole",
            "AssumeRolePolicyDocument": "{\"Version\":\"2012-10-17\",\"Statement\":[{\"Effect\":\"Allow\",\"Principal\":{\"Service\":[\"ec2.amazonaws.com\"]},\"Action\":[\"sts:AssumeRole\"]}]}",
            "RoleName": "sampleSSMInstanceRole"
          },
          "nextStep": "attachManagedSSMPolicy"
        },
        {
          "name": "attachManagedSSMPolicy",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "iam",
            "Api": "AttachRolePolicy",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AmazonSSMManagedInstanceCore",
            "RoleName": "sampleSSMInstanceRole"
          },
          "nextStep": "createSSMInstanceProfile"
        },
        {
          "name": "createSSMInstanceProfile",
          "action":"aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "iam",
            "Api": "CreateInstanceProfile",
            "InstanceProfileName": "sampleSSMInstanceRole"
          },
          "outputs": [
            {
              "Name": "instanceProfileArn",
              "Selector": "$.InstanceProfile.Arn",
              "Type": "String"
            }
          ],
          "nextStep": "addSSMInstanceRoleToProfile"
        },
        {
          "name": "addSSMInstanceRoleToProfile",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "iam",
            "Api": "AddRoleToInstanceProfile",
            "InstanceProfileName": "sampleSSMInstanceRole",
            "RoleName": "sampleSSMInstanceRole"
          },
          "nextStep": "createVpc"
        },
        {
          "name": "createVpc",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateVpc",
            "CidrBlock": "10.0.100.0/22"
          },
          "outputs": [
            {
              "Name": "vpcId",
              "Selector": "$.Vpc.VpcId",
              "Type": "String"
            }
          ],
          "nextStep": "getMainRtb"
        },
        {
          "name": "getMainRtb",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "DescribeRouteTables",
            "Filters": [
              {
                "Name": "vpc-id",
                "Values": ["{{ createVpc.vpcId }}"]
              }
            ]
          },
          "outputs": [
            {
              "Name": "mainRtbId",
              "Selector": "$.RouteTables[0].RouteTableId",
              "Type": "String"
            }
          ],
          "nextStep": "verifyMainRtb"
        },
        {
          "name": "verifyMainRtb",
          "action": "aws:assertAwsResourceProperty",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "DescribeRouteTables",
            "RouteTableIds": ["{{ getMainRtb.mainRtbId }}"],
            "PropertySelector": "$.RouteTables[0].Associations[0].Main",
            "DesiredValues": ["True"]
          },
          "nextStep": "createPubSubnet"
        },
        {
          "name": "createPubSubnet",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateSubnet",
            "CidrBlock": "10.0.103.0/24",
            "AvailabilityZone": "us-west-2c",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "outputs":[
            {
              "Name": "pubSubnetId",
              "Selector": "$.Subnet.SubnetId",
              "Type": "String"
            }
          ],
          "nextStep": "createPubRtb"
        },
        {
          "name": "createPubRtb",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateRouteTable",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "outputs": [
            {
              "Name": "pubRtbId",
              "Selector": "$.RouteTable.RouteTableId",
              "Type": "String"
            }
          ],
          "nextStep": "createIgw"
        },
        {
          "name": "createIgw",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateInternetGateway"
          },
          "outputs": [
            {
              "Name": "igwId",
              "Selector": "$.InternetGateway.InternetGatewayId",
              "Type": "String"
            }
          ],
          "nextStep": "attachIgw"
        },
        {
          "name": "attachIgw",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "AttachInternetGateway",
            "InternetGatewayId": "{{ createIgw.igwId }}",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "nextStep": "allocateEip"
        },
        {
          "name": "allocateEip",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "AllocateAddress",
            "Domain": "vpc"
          },
          "outputs": [
            {
              "Name": "eipAllocationId",
              "Selector": "$.AllocationId",
              "Type": "String"
            }
          ],
          "nextStep": "createNatGw"
        },
        {
          "name": "createNatGw",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateNatGateway",
            "AllocationId": "{{ allocateEip.eipAllocationId }}",
            "SubnetId": "{{ createPubSubnet.pubSubnetId }}"
          },
          "outputs":[
            {
              "Name": "natGwId",
              "Selector": "$.NatGateway.NatGatewayId",
              "Type": "String"
            }
          ],
          "nextStep": "verifyNatGwAvailable"
        },
        {
          "name": "verifyNatGwAvailable",
          "action": "aws:waitForAwsResourceProperty",
          "timeoutSeconds": 150,
          "inputs": {
            "Service": "ec2",
            "Api": "DescribeNatGateways",
            "NatGatewayIds": [
              "{{ createNatGw.natGwId }}"
            ],
            "PropertySelector": "$.NatGateways[0].State",
            "DesiredValues": [
              "available"
            ]
          },
          "nextStep": "createNatRoute"
        },
        {
          "name": "createNatRoute",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateRoute",
            "DestinationCidrBlock": "0.0.0.0/0",
            "NatGatewayId": "{{ createNatGw.natGwId }}",
            "RouteTableId": "{{ getMainRtb.mainRtbId }}"
          },
          "nextStep": "createPubRoute"
        },
        {
          "name": "createPubRoute",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateRoute",
            "DestinationCidrBlock": "0.0.0.0/0",
            "GatewayId": "{{ createIgw.igwId }}",
            "RouteTableId": "{{ createPubRtb.pubRtbId }}"
          },
          "nextStep": "setPubSubAssoc"
        },
        {
          "name": "setPubSubAssoc",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "AssociateRouteTable",
            "RouteTableId": "{{ createPubRtb.pubRtbId }}",
            "SubnetId": "{{ createPubSubnet.pubSubnetId }}"
          }
        },
        {
          "name": "createDhcpOptions",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateDhcpOptions",
            "DhcpConfigurations": [
              {
                "Key": "domain-name-servers",
                "Values": ["10.0.100.50,10.0.101.50"]
              },
              {
                "Key": "domain-name",
                "Values": ["sample.com"]
              }
            ]
          },
          "outputs": [
            {
              "Name": "dhcpOptionsId",
              "Selector": "$.DhcpOptions.DhcpOptionsId",
              "Type": "String"
            }
          ],
          "nextStep": "createDCSubnet1"
        },
        {
          "name": "createDCSubnet1",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateSubnet",
            "CidrBlock": "10.0.100.0/24",
            "AvailabilityZone": "us-west-2a",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "outputs": [
            {
              "Name": "firstSubnetId",
              "Selector": "$.Subnet.SubnetId",
              "Type": "String"
            }
          ],
          "nextStep": "createDCSubnet2"
        },
        {
          "name": "createDCSubnet2",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateSubnet",
            "CidrBlock": "10.0.101.0/24",
            "AvailabilityZone": "us-west-2b",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "outputs": [
            {
              "Name": "secondSubnetId",
              "Selector": "$.Subnet.SubnetId",
              "Type": "String"
            }
          ],
          "nextStep": "createDCSecGroup"
        },
        {
          "name": "createDCSecGroup",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "CreateSecurityGroup",
            "GroupName": "SampleDCSecGroup",
            "Description": "Security Group for Example Domain Controllers",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "outputs": [
            {
              "Name": "dcSecGroupId",
              "Selector": "$.GroupId",
              "Type": "String"
            }
          ],
          "nextStep": "authIngressDCTraffic"
        },
        {
          "name": "authIngressDCTraffic",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "AuthorizeSecurityGroupIngress",
            "GroupId": "{{ createDCSecGroup.dcSecGroupId }}",
            "IpPermissions": [
              {
                "FromPort": -1,
                "IpProtocol": "-1",
                "IpRanges": [
                  {
                    "CidrIp": "0.0.0.0/0",
                    "Description": "Allow all traffic between Domain Controllers"
                  }
                ]
              }
            ]
          },
          "nextStep": "verifyInstanceProfile"
        },
        {
          "name": "verifyInstanceProfile",
          "action": "aws:waitForAwsResourceProperty",
          "maxAttempts": 5,
          "onFailure": "Abort",
          "inputs": {
            "Service": "iam",
            "Api": "ListInstanceProfilesForRole",
            "RoleName": "sampleSSMInstanceRole",
            "PropertySelector": "$.InstanceProfiles[0].Arn",
            "DesiredValues": [
              "{{ createSSMInstanceProfile.instanceProfileArn }}"
            ]
          },
          "nextStep": "iamEventualConsistency"
        },
        {
          "name": "iamEventualConsistency",
          "action": "aws:sleep",
          "inputs": {
            "Duration": "PT2M"
          },
          "nextStep": "launchDC1"
        },
        {
          "name": "launchDC1",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "RunInstances",
            "BlockDeviceMappings": [
              {
                "DeviceName": "/dev/sda1",
                "Ebs": {
                  "DeleteOnTermination": true,
                  "VolumeSize": 50,
                  "VolumeType": "gp2"
                }
              },
              {
                "DeviceName": "xvdf",
                "Ebs": {
                  "DeleteOnTermination": true,
                  "VolumeSize": 100,
                  "VolumeType": "gp2"
                }
              }
            ],
            "IamInstanceProfile": {
              "Arn": "{{ createSSMInstanceProfile.instanceProfileArn }}"
            },
            "ImageId": "{{ getLatestWindowsAmi.amiId }}",
            "InstanceType": "t2.micro",
            "MaxCount": 1,
            "MinCount": 1,
            "PrivateIpAddress": "10.0.100.50",
            "SecurityGroupIds": [
              "{{ createDCSecGroup.dcSecGroupId }}"
            ],
            "SubnetId": "{{ createDCSubnet1.firstSubnetId }}",
            "TagSpecifications": [
              {
                "ResourceType": "instance",
                "Tags": [
                  {
                    "Key": "Name",
                    "Value": "SampleDC1"
                  }
                ]
              }
            ]
          },
          "outputs": [
            {
              "Name": "pdcInstanceId",
              "Selector": "$.Instances[0].InstanceId",
              "Type": "String"
            }
          ],
          "nextStep": "launchDC2"
        },
        {
          "name": "launchDC2",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "RunInstances",
            "BlockDeviceMappings": [
              {
                "DeviceName": "/dev/sda1",
                "Ebs": {
                  "DeleteOnTermination": true,
                  "VolumeSize": 50,
                  "VolumeType": "gp2"
                }
              },
              {
                "DeviceName": "xvdf",
                "Ebs": {
                  "DeleteOnTermination": true,
                  "VolumeSize": 100,
                  "VolumeType": "gp2"
                }
              }
            ],
            "IamInstanceProfile": {
              "Arn": "{{ createSSMInstanceProfile.instanceProfileArn }}"
            },
            "ImageId": "{{ getLatestWindowsAmi.amiId }}",
            "InstanceType": "t2.micro",
            "MaxCount": 1,
            "MinCount": 1,
            "PrivateIpAddress": "10.0.101.50",
            "SecurityGroupIds": [
              "{{ createDCSecGroup.dcSecGroupId }}"
            ],
            "SubnetId": "{{ createDCSubnet2.secondSubnetId }}",
            "TagSpecifications": [
              {
                "ResourceType": "instance",
                "Tags": [
                  {
                    "Key": "Name",
                    "Value": "SampleDC2"
                  }
                ]
              }
            ]
          },
          "outputs": [
            {
              "Name": "adcInstanceId",
              "Selector": "$.Instances[0].InstanceId",
              "Type": "String"
            }
          ],
          "nextStep": "verifyDCInstanceState"
        },
        {
          "name": "verifyDCInstanceState",
          "action": "aws:waitForAwsResourceProperty",
          "inputs": {
            "Service": "ec2",
            "Api": "DescribeInstanceStatus",
            "IncludeAllInstances": true,
            "InstanceIds": [
              "{{ launchDC1.pdcInstanceId }}",
              "{{ launchDC2.adcInstanceId }}"
            ],
            "PropertySelector": "$.InstanceStatuses[0].InstanceState.Name",
            "DesiredValues": [
              "running"
            ]
          },
          "nextStep": "verifyInstancesOnlineSSM"
        },
        {
          "name": "verifyInstancesOnlineSSM",
          "action": "aws:waitForAwsResourceProperty",
          "timeoutSeconds": 600,
          "inputs": {
            "Service": "ssm",
            "Api": "DescribeInstanceInformation",
            "InstanceInformationFilterList": [
              {
                "key": "InstanceIds",
                "valueSet": [
                  "{{ launchDC1.pdcInstanceId }}",
                  "{{ launchDC2.adcInstanceId }}"
                ]
              }
            ],
            "PropertySelector": "$.InstanceInformationList[0].PingStatus",
            "DesiredValues": [
              "Online"
            ]
          },
          "nextStep": "installADRoles"
        },
        {
          "name": "installADRoles",
          "action": "aws:runCommand",
          "inputs": {
            "DocumentName": "AWS-RunPowerShellScript",
            "InstanceIds": [
              "{{ launchDC1.pdcInstanceId }}",
              "{{ launchDC2.adcInstanceId }}"
            ],
            "Parameters": {
              "commands": [
                "try {",
                "  Install-WindowsFeature -Name AD-Domain-Services -IncludeManagementTools",
                "}",
                "catch {",
                "  Write-Error \"Failed to install ADDS Role.\"",
                "}"
              ]
            }
          },
          "nextStep": "setAdminPassword"
        },
        {
          "name": "setAdminPassword",
          "action": "aws:runCommand",
          "inputs": {
            "DocumentName": "AWS-RunPowerShellScript",
            "InstanceIds": [
              "{{ launchDC1.pdcInstanceId }}"
            ],
            "Parameters": {
              "commands": [
                "net user Administrator \"sampleAdminPass123!\""
              ]
            }
          },
          "nextStep": "createForest"
        },
        {
          "name": "createForest",
          "action": "aws:runCommand",
          "inputs": {
            "DocumentName": "AWS-RunPowerShellScript",
            "InstanceIds": [
              "{{ launchDC1.pdcInstanceId }}"
            ],
            "Parameters": {
              "commands": [
                "$dsrmPass = 'sample123!' | ConvertTo-SecureString -asPlainText -Force",
                "try {",
                "   Install-ADDSForest -DomainName \"sample.com\" -DomainMode 6 -ForestMode 6 -InstallDNS -DatabasePath \"D:\\NTDS\" -SysvolPath \"D:\\SYSVOL\" -SafeModeAdministratorPassword $dsrmPass -Force",
                "}",
                "catch {",
                "   Write-Error $_",
                "}",
                "try {",
                "   Add-DnsServerForwarder -IPAddress \"10.0.100.2\"",
                "}",
                "catch {",
                "   Write-Error $_",
                "}"
              ]
            }
          },
          "nextStep": "associateDhcpOptions"
        },
        {
          "name": "associateDhcpOptions",
          "action": "aws:executeAwsApi",
          "onFailure": "Abort",
          "inputs": {
            "Service": "ec2",
            "Api": "AssociateDhcpOptions",
            "DhcpOptionsId": "{{ createDhcpOptions.dhcpOptionsId }}",
            "VpcId": "{{ createVpc.vpcId }}"
          },
          "nextStep": "waitForADServices"
        },
        {
          "name": "waitForADServices",
          "action": "aws:sleep",
          "inputs": {
            "Duration": "PT1M"
          },
          "nextStep": "promoteADC"
        },
        {
          "name": "promoteADC",
          "action": "aws:runCommand",
          "inputs": {
            "DocumentName": "AWS-RunPowerShellScript",
            "InstanceIds": [
              "{{ launchDC2.adcInstanceId }}"
            ],
            "Parameters": {
              "commands": [
                "ipconfig /renew",
                "$dsrmPass = 'sample123!' | ConvertTo-SecureString -asPlainText -Force",
                "$domAdminUser = \"sample\\Administrator\"",
                "$domAdminPass = \"sampleAdminPass123!\" | ConvertTo-SecureString -asPlainText -Force",
                "$domAdminCred = New-Object System.Management.Automation.PSCredential($domAdminUser,$domAdminPass)",
                "try {",
                "   Install-ADDSDomainController -DomainName \"sample.com\" -InstallDNS -DatabasePath \"D:\\NTDS\" -SysvolPath \"D:\\SYSVOL\" -SafeModeAdministratorPassword $dsrmPass -Credential $domAdminCred -Force",
                "}",
                "catch {",
                "   Write-Error $_",
                "}"
              ]
            }
          }
        }
      ]
    }
```

------

# 从最新快照还原根卷
<a name="automation-document-instance-recovery-example"></a>

根卷上的操作系统可能会出于各种原因而受损。例如，在执行修补操作后，实例可能会因内核或注册表损坏而无法成功启动。自动执行常见故障排除任务（例如，从修补操作前拍摄的最新快照还原根卷）可以减少停机时间并加快故障排除工作。AWS Systems Manager自动化操作可帮助您做到这一点。Automation 是 AWS Systems Manager 中的一项工具。

以下示例 AWS Systems Manager 运行手册执行这些操作：
+ 使用 `aws:executeAwsApi` 自动化操作从实例的根卷检索详细信息。
+ 使用 `aws:executeScript` 自动化操作检索根卷的最新快照。
+ 如果找到了根卷的快照，则使用 `aws:branch` 自动化操作继续执行自动化。

------
#### [ YAML ]

```
    ---
    description: Custom Automation Troubleshooting Example
    schemaVersion: '0.3'
    assumeRole: "{{ AutomationAssumeRole }}"
    parameters:
      AutomationAssumeRole:
        type: String
        description: "(Required) The ARN of the role that allows Automation to perform
          the actions on your behalf. If no role is specified, Systems Manager Automation
          uses your IAM permissions to use this runbook."
        default: ''
      InstanceId:
          type: String
          description: "(Required) The Instance Id whose root EBS volume you want to restore the latest Snapshot."
          default: ''
    mainSteps:
    - name: getInstanceDetails
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: DescribeInstances
        InstanceIds:
        - "{{ InstanceId }}"
      outputs:
        - Name: availabilityZone
          Selector: "$.Reservations[0].Instances[0].Placement.AvailabilityZone"
          Type: String
        - Name: rootDeviceName
          Selector: "$.Reservations[0].Instances[0].RootDeviceName"
          Type: String
      nextStep: getRootVolumeId
    - name: getRootVolumeId
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: DescribeVolumes
        Filters:
        -  Name: attachment.device
           Values: ["{{ getInstanceDetails.rootDeviceName }}"]
        -  Name: attachment.instance-id
           Values: ["{{ InstanceId }}"]
      outputs:
        - Name: rootVolumeId
          Selector: "$.Volumes[0].VolumeId"
          Type: String
      nextStep: getSnapshotsByStartTime
    - name: getSnapshotsByStartTime
      action: aws:executeScript
      timeoutSeconds: 45
      onFailure: Abort
      inputs:
        Runtime: python3.11
        Handler: getSnapshotsByStartTime
        InputPayload:
          rootVolumeId : "{{ getRootVolumeId.rootVolumeId }}"
        Script: |-
          def getSnapshotsByStartTime(events,context):
            import boto3
    
            #Initialize client
            ec2 = boto3.client('ec2')
            rootVolumeId = events['rootVolumeId']
            snapshotsQuery = ec2.describe_snapshots(
              Filters=[
                {
                  "Name": "volume-id",
                  "Values": [rootVolumeId]
                }
              ]
            )
            if not snapshotsQuery['Snapshots']:
              noSnapshotFoundString = "NoSnapshotFound"
              return { 'noSnapshotFound' : noSnapshotFoundString }
            else:
              jsonSnapshots = snapshotsQuery['Snapshots']
              sortedSnapshots = sorted(jsonSnapshots, key=lambda k: k['StartTime'], reverse=True)
              latestSortedSnapshotId = sortedSnapshots[0]['SnapshotId']
              return { 'latestSnapshotId' : latestSortedSnapshotId }
      outputs:
      - Name: Payload
        Selector: $.Payload
        Type: StringMap
      - Name: latestSnapshotId
        Selector: $.Payload.latestSnapshotId
        Type: String
      - Name: noSnapshotFound
        Selector: $.Payload.noSnapshotFound
        Type: String 
      nextStep: branchFromResults
    - name: branchFromResults
      action: aws:branch
      onFailure: Abort
      inputs:
        Choices:
        - NextStep: createNewRootVolumeFromSnapshot
          Not:
            Variable: "{{ getSnapshotsByStartTime.noSnapshotFound }}"
            StringEquals: "NoSnapshotFound"
      isEnd: true
    - name: createNewRootVolumeFromSnapshot
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: CreateVolume
        AvailabilityZone: "{{ getInstanceDetails.availabilityZone }}"
        SnapshotId: "{{ getSnapshotsByStartTime.latestSnapshotId }}"
      outputs:
        - Name: newRootVolumeId
          Selector: "$.VolumeId"
          Type: String
      nextStep: stopInstance
    - name: stopInstance
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: StopInstances
        InstanceIds:
        - "{{ InstanceId }}"
      nextStep: verifyVolumeAvailability
    - name: verifyVolumeAvailability
      action: aws:waitForAwsResourceProperty
      timeoutSeconds: 120
      inputs:
        Service: ec2
        Api: DescribeVolumes
        VolumeIds:
        - "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
        PropertySelector: "$.Volumes[0].State"
        DesiredValues:
        - "available"
      nextStep: verifyInstanceStopped
    - name: verifyInstanceStopped
      action: aws:waitForAwsResourceProperty
      timeoutSeconds: 120
      inputs:
        Service: ec2
        Api: DescribeInstances
        InstanceIds:
        - "{{ InstanceId }}"
        PropertySelector: "$.Reservations[0].Instances[0].State.Name"
        DesiredValues:
        - "stopped"
      nextStep: detachRootVolume
    - name: detachRootVolume
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: DetachVolume
        VolumeId: "{{ getRootVolumeId.rootVolumeId }}"
      nextStep: verifyRootVolumeDetached
    - name: verifyRootVolumeDetached
      action: aws:waitForAwsResourceProperty
      timeoutSeconds: 30
      inputs:
        Service: ec2
        Api: DescribeVolumes
        VolumeIds:
        - "{{ getRootVolumeId.rootVolumeId }}"
        PropertySelector: "$.Volumes[0].State"
        DesiredValues:
        - "available"
      nextStep: attachNewRootVolume
    - name: attachNewRootVolume
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: AttachVolume
        Device: "{{ getInstanceDetails.rootDeviceName }}"
        InstanceId: "{{ InstanceId }}"
        VolumeId: "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
      nextStep: verifyNewRootVolumeAttached
    - name: verifyNewRootVolumeAttached
      action: aws:waitForAwsResourceProperty
      timeoutSeconds: 30
      inputs:
        Service: ec2
        Api: DescribeVolumes
        VolumeIds:
        - "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
        PropertySelector: "$.Volumes[0].Attachments[0].State"
        DesiredValues:
        - "attached"
      nextStep: startInstance
    - name: startInstance
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: StartInstances
        InstanceIds:
        - "{{ InstanceId }}"
```

------
#### [ JSON ]

```
    {
       "description": "Custom Automation Troubleshooting Example",
       "schemaVersion": "0.3",
       "assumeRole": "{{ AutomationAssumeRole }}",
       "parameters": {
          "AutomationAssumeRole": {
             "type": "String",
             "description": "(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to run this runbook.",
             "default": ""
          },
          "InstanceId": {
             "type": "String",
             "description": "(Required) The Instance Id whose root EBS volume you want to restore the latest Snapshot.",
             "default": ""
          }
       },
       "mainSteps": [
          {
             "name": "getInstanceDetails",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeInstances",
                "InstanceIds": [
                   "{{ InstanceId }}"
                ]
             },
             "outputs": [
                {
                   "Name": "availabilityZone",
                   "Selector": "$.Reservations[0].Instances[0].Placement.AvailabilityZone",
                   "Type": "String"
                },
                {
                   "Name": "rootDeviceName",
                   "Selector": "$.Reservations[0].Instances[0].RootDeviceName",
                   "Type": "String"
                }
             ],
             "nextStep": "getRootVolumeId"
          },
          {
             "name": "getRootVolumeId",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeVolumes",
                "Filters": [
                   {
                      "Name": "attachment.device",
                      "Values": [
                         "{{ getInstanceDetails.rootDeviceName }}"
                      ]
                   },
                   {
                      "Name": "attachment.instance-id",
                      "Values": [
                         "{{ InstanceId }}"
                      ]
                   }
                ]
             },
             "outputs": [
                {
                   "Name": "rootVolumeId",
                   "Selector": "$.Volumes[0].VolumeId",
                   "Type": "String"
                }
             ],
             "nextStep": "getSnapshotsByStartTime"
          },
          {
             "name": "getSnapshotsByStartTime",
             "action": "aws:executeScript",
             "timeoutSeconds": 45,
             "onFailure": "Continue",
             "inputs": {
                "Runtime": "python3.11",
                "Handler": "getSnapshotsByStartTime",
                "InputPayload": {
                   "rootVolumeId": "{{ getRootVolumeId.rootVolumeId }}"
                },
                "Attachment": "getSnapshotsByStartTime.py"
             },
             "outputs": [
                {
                   "Name": "Payload",
                   "Selector": "$.Payload",
                   "Type": "StringMap"
                },
                {
                   "Name": "latestSnapshotId",
                   "Selector": "$.Payload.latestSnapshotId",
                   "Type": "String"
                },
                {
                   "Name": "noSnapshotFound",
                   "Selector": "$.Payload.noSnapshotFound",
                   "Type": "String"
                }
             ],
             "nextStep": "branchFromResults"
          },
          {
             "name": "branchFromResults",
             "action": "aws:branch",
             "onFailure": "Abort",
             "inputs": {
                "Choices": [
                   {
                      "NextStep": "createNewRootVolumeFromSnapshot",
                      "Not": {
                         "Variable": "{{ getSnapshotsByStartTime.noSnapshotFound }}",
                         "StringEquals": "NoSnapshotFound"
                      }
                   }
                ]
             },
             "isEnd": true
          },
          {
             "name": "createNewRootVolumeFromSnapshot",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "CreateVolume",
                "AvailabilityZone": "{{ getInstanceDetails.availabilityZone }}",
                "SnapshotId": "{{ getSnapshotsByStartTime.latestSnapshotId }}"
             },
             "outputs": [
                {
                   "Name": "newRootVolumeId",
                   "Selector": "$.VolumeId",
                   "Type": "String"
                }
             ],
             "nextStep": "stopInstance"
          },
          {
             "name": "stopInstance",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "StopInstances",
                "InstanceIds": [
                   "{{ InstanceId }}"
                ]
             },
             "nextStep": "verifyVolumeAvailability"
          },
          {
             "name": "verifyVolumeAvailability",
             "action": "aws:waitForAwsResourceProperty",
             "timeoutSeconds": 120,
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeVolumes",
                "VolumeIds": [
                   "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
                ],
                "PropertySelector": "$.Volumes[0].State",
                "DesiredValues": [
                   "available"
                ]
             },
             "nextStep": "verifyInstanceStopped"
          },
          {
             "name": "verifyInstanceStopped",
             "action": "aws:waitForAwsResourceProperty",
             "timeoutSeconds": 120,
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeInstances",
                "InstanceIds": [
                   "{{ InstanceId }}"
                ],
                "PropertySelector": "$.Reservations[0].Instances[0].State.Name",
                "DesiredValues": [
                   "stopped"
                ]
             },
             "nextStep": "detachRootVolume"
          },
          {
             "name": "detachRootVolume",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "DetachVolume",
                "VolumeId": "{{ getRootVolumeId.rootVolumeId }}"
             },
             "nextStep": "verifyRootVolumeDetached"
          },
          {
             "name": "verifyRootVolumeDetached",
             "action": "aws:waitForAwsResourceProperty",
             "timeoutSeconds": 30,
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeVolumes",
                "VolumeIds": [
                   "{{ getRootVolumeId.rootVolumeId }}"
                ],
                "PropertySelector": "$.Volumes[0].State",
                "DesiredValues": [
                   "available"
                ]
             },
             "nextStep": "attachNewRootVolume"
          },
          {
             "name": "attachNewRootVolume",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "AttachVolume",
                "Device": "{{ getInstanceDetails.rootDeviceName }}",
                "InstanceId": "{{ InstanceId }}",
                "VolumeId": "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
             },
             "nextStep": "verifyNewRootVolumeAttached"
          },
          {
             "name": "verifyNewRootVolumeAttached",
             "action": "aws:waitForAwsResourceProperty",
             "timeoutSeconds": 30,
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeVolumes",
                "VolumeIds": [
                   "{{ createNewRootVolumeFromSnapshot.newRootVolumeId }}"
                ],
                "PropertySelector": "$.Volumes[0].Attachments[0].State",
                "DesiredValues": [
                   "attached"
                ]
             },
             "nextStep": "startInstance"
          },
          {
             "name": "startInstance",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "StartInstances",
                "InstanceIds": [
                   "{{ InstanceId }}"
                ]
             }
          }
       ],
       "files": {
            "getSnapshotsByStartTime.py": {
                "checksums": {
                    "sha256": "sampleETagValue"
                }
            }
        }
    }
```

------

# 创建 AMI 和跨区域副本
<a name="automation-document-backup-maintenance-example"></a>

创建实例的 Amazon Machine Image (AMI) 是备份和恢复操作中的常用过程。也可以选择将 AMI 作为灾难恢复架构的一部分复制到另一个 AWS 区域。如果问题需要进行故障转移，则自动执行常见的维护任务可以减少停机时间。AWS Systems Manager自动化操作可帮助您做到这一点。Automation 是 AWS Systems Manager 中的一项工具。

以下示例 AWS Systems Manager 运行手册执行这些操作：
+ 使用 `aws:executeAwsApi` 自动化操作创建 AMI。
+ 使用 `aws:waitForAwsResourceProperty` 自动化操作确认 AMI 的可用性。
+ 使用 `aws:executeScript` 自动化操作将 AMI 复制到目标区域。

------
#### [ YAML ]

```
    ---
    description: Custom Automation Backup and Recovery Example
    schemaVersion: '0.3'
    assumeRole: "{{ AutomationAssumeRole }}"
    parameters:
      AutomationAssumeRole:
        type: String
        description: "(Required) The ARN of the role that allows Automation to perform
          the actions on your behalf. If no role is specified, Systems Manager Automation
          uses your IAM permissions to use this runbook."
        default: ''
      InstanceId:
        type: String
        description: "(Required) The ID of the EC2 instance."
        default: ''
    mainSteps:
    - name: createImage
      action: aws:executeAwsApi
      onFailure: Abort
      inputs:
        Service: ec2
        Api: CreateImage
        InstanceId: "{{ InstanceId }}"
        Name: "Automation Image for {{ InstanceId }}"
        NoReboot: false
      outputs:
        - Name: newImageId
          Selector: "$.ImageId"
          Type: String
      nextStep: verifyImageAvailability
    - name: verifyImageAvailability
      action: aws:waitForAwsResourceProperty
      timeoutSeconds: 600
      inputs:
        Service: ec2
        Api: DescribeImages
        ImageIds:
        - "{{ createImage.newImageId }}"
        PropertySelector: "$.Images[0].State"
        DesiredValues:
        - available
      nextStep: copyImage
    - name: copyImage
      action: aws:executeScript
      timeoutSeconds: 45
      onFailure: Abort
      inputs:
        Runtime: python3.11
        Handler: crossRegionImageCopy
        InputPayload:
          newImageId : "{{ createImage.newImageId }}"
        Script: |-
          def crossRegionImageCopy(events,context):
            import boto3
    
            #Initialize client
            ec2 = boto3.client('ec2', region_name='us-east-1')
            newImageId = events['newImageId']
    
            ec2.copy_image(
              Name='DR Copy for ' + newImageId,
              SourceImageId=newImageId,
              SourceRegion='us-west-2'
            )
```

------
#### [ JSON ]

```
    {
       "description": "Custom Automation Backup and Recovery Example",
       "schemaVersion": "0.3",
       "assumeRole": "{{ AutomationAssumeRole }}",
       "parameters": {
          "AutomationAssumeRole": {
             "type": "String",
             "description": "(Required) The ARN of the role that allows Automation to perform\nthe actions on your behalf. If no role is specified, Systems Manager Automation\nuses your IAM permissions to run this runbook.",
             "default": ""
          },
          "InstanceId": {
             "type": "String",
             "description": "(Required) The ID of the EC2 instance.",
             "default": ""
          }
       },
       "mainSteps": [
          {
             "name": "createImage",
             "action": "aws:executeAwsApi",
             "onFailure": "Abort",
             "inputs": {
                "Service": "ec2",
                "Api": "CreateImage",
                "InstanceId": "{{ InstanceId }}",
                "Name": "Automation Image for {{ InstanceId }}",
                "NoReboot": false
             },
             "outputs": [
                {
                   "Name": "newImageId",
                   "Selector": "$.ImageId",
                   "Type": "String"
                }
             ],
             "nextStep": "verifyImageAvailability"
          },
          {
             "name": "verifyImageAvailability",
             "action": "aws:waitForAwsResourceProperty",
             "timeoutSeconds": 600,
             "inputs": {
                "Service": "ec2",
                "Api": "DescribeImages",
                "ImageIds": [
                   "{{ createImage.newImageId }}"
                ],
                "PropertySelector": "$.Images[0].State",
                "DesiredValues": [
                   "available"
                ]
             },
             "nextStep": "copyImage"
          },
          {
             "name": "copyImage",
             "action": "aws:executeScript",
             "timeoutSeconds": 45,
             "onFailure": "Abort",
             "inputs": {
                "Runtime": "python3.11",
                "Handler": "crossRegionImageCopy",
                "InputPayload": {
                   "newImageId": "{{ createImage.newImageId }}"
                },
                "Attachment": "crossRegionImageCopy.py"
             }
          }
       ],
       "files": {
            "crossRegionImageCopy.py": {
                "checksums": {
                    "sha256": "sampleETagValue"
                }
            }
        }
    }
```

------

# 创建填充 AWS 资源的输入参数
<a name="populating-input-parameters"></a>

Automation 是 Systems Manager 中的一项工具，可在 AWS 管理控制台中填充与您为输入参数定义的资源类型相匹配的 AWS 资源。与资源类型匹配的 AWS 账户 中的资源将显示在下拉列表中供您选择。您可以为 Amazon Elastic Compute Cloud (Amazon EC2) 实例、Amazon Simple Storage Service (Amazon S3) 存储桶以及 AWS Identity and Access Management (IAM) 角色定义输入参数类型。支持的类型定义与用于查找匹配资源的正则表达式如下：
+ `AWS::EC2::Instance::Id` - `^m?i-([a-z0-9]{8}|[a-z0-9]{17})$`
+ `List<AWS::EC2::Instance::Id>` - `^m?i-([a-z0-9]{8}|[a-z0-9]{17})$`
+ `AWS::S3::Bucket::Name` - `^[0-9a-z][a-z0-9\\-\\.]{3,63}$`
+ `List<AWS::S3::Bucket::Name>` - `^[0-9a-z][a-z0-9\\-\\.]{3,63}$`
+ `AWS::IAM::Role::Arn` - `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$`
+ `List<AWS::IAM::Role::Arn>` - `^arn:(aws|aws-cn|aws-us-gov|aws-iso|aws-iso-b):iam::[0-9]{12}:role/.*$`

以下是在运行手册内容中定义的输入参数类型的示例。

------
#### [ YAML ]

```
description: Enables encryption on an Amazon S3 bucket
schemaVersion: '0.3'
assumeRole: '{{ AutomationAssumeRole }}'
parameters:
  BucketName:
    type: 'AWS::S3::Bucket::Name'
    description: (Required) The name of the Amazon S3 bucket you want to encrypt.
  SSEAlgorithm:
    type: String
    description: (Optional) The server-side encryption algorithm to use for the default encryption.
    default: AES256
  AutomationAssumeRole:
    type: 'AWS::IAM::Role::Arn'
    description: (Optional) The Amazon Resource Name (ARN) of the role that allows Automation to perform the actions on your behalf.
    default: ''
mainSteps:
  - name: enableBucketEncryption
    action: 'aws:executeAwsApi'
    inputs:
      Service: s3
      Api: PutBucketEncryption
      Bucket: '{{BucketName}}'
      ServerSideEncryptionConfiguration:
        Rules:
          - ApplyServerSideEncryptionByDefault:
              SSEAlgorithm: '{{SSEAlgorithm}}'
    isEnd: true
```

------
#### [ JSON ]

```
{
   "description": "Enables encryption on an Amazon S3 bucket",
   "schemaVersion": "0.3",
   "assumeRole": "{{ AutomationAssumeRole }}",
   "parameters": {
      "BucketName": {
         "type": "AWS::S3::Bucket::Name",
         "description": "(Required) The name of the Amazon S3 bucket you want to encrypt."
      },
      "SSEAlgorithm": {
         "type": "String",
         "description": "(Optional) The server-side encryption algorithm to use for the default encryption.",
         "default": "AES256"
      },
      "AutomationAssumeRole": {
         "type": "AWS::IAM::Role::Arn",
         "description": "(Optional) The Amazon Resource Name (ARN) of the role that allows Automation to perform the actions on your behalf.",
         "default": ""
      }
   },
   "mainSteps": [
      {
         "name": "enableBucketEncryption",
         "action": "aws:executeAwsApi",
         "inputs": {
            "Service": "s3",
            "Api": "PutBucketEncryption",
            "Bucket": "{{BucketName}}",
            "ServerSideEncryptionConfiguration": {
               "Rules": [
                  {
                     "ApplyServerSideEncryptionByDefault": {
                        "SSEAlgorithm": "{{SSEAlgorithm}}"
                     }
                  }
               ]
            }
         },
         "isEnd": true
      }
   ]
}
```

------

# 正在使用文档生成器创建运行手册
<a name="automation-document-builder"></a>

如果 AWS Systems Manager 公有运行手册不支持您希望在 AWS 资源上执行的操作，您可以创建自己的运行手册。要创建自定义运行手册，您可以手动创建包含相应自动化操作的本地 YAML 或 JSON 格式文件。或者，您也可以使用 Systems Manager Automation 控制台中的文档生成器来构建自定义运行手册。

通过使用文档生成器，您可以将自动化操作添加到自定义运行手册中，并提供所需的参数，而无需使用 JSON 或 YAML 语法。在添加步骤并创建运行手册后，系统将您添加的操作转换为 Systems Manager 可用于运行自动化的 YAML 格式。

自动化文档支持使用 Markdown（一种标记语言），它允许您为运行手册和其中的各个步骤添加 Wiki 样式的描述。有关使用 Markdown 的更多信息，请参阅[在 AWS 中使用 Markdown](https://docs.aws.amazon.com/general/latest/gr/aws-markdown.html)。

## 使用文档生成器创建运行手册
<a name="create-runbook"></a>

**开始前的准备工作**  
我们建议您阅读可在运行手册中使用的各种操作。有关更多信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

**使用文档生成器创建运行手册**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择**创建自动化**。

1. 对于**名称**，为运行手册输入一个描述性名称。

1. 对于**文档描述**，请提供运行手册的 markdown 样式描述。您可以提供使用运行手册的说明、编号的步骤或描述运行手册的任何其他类型的信息。请参阅默认文本以了解设置内容格式的信息。
**提示**  
在**隐藏预览**和**显示预览**之间切换，以便在编写时查看描述内容的效果。

1. （可选）对于 **Assume role (担任角色)**，请输入代表您执行操作的服务角色的名称或 ARN。如果未指定角色，自动化使用运行自动化的用户的访问权限。
**重要**  
对于不归 Amazon 所有并使用 `aws:executeScript` 操作的运行手册，必须指定一个角色。有关信息，请参阅[使用运行手册的权限](automation-document-script-considerations.md#script-permissions)。

1. （可选）对于**输出**，请输入执行该运行手册的自动化的任何输出以供其他进程使用。

   例如，如果文档创建新的 AMI，您可以指定 ["CreateImage.ImageId"]，然后使用该输出以在后续自动化中创建新的实例。

1. （可选）展开**输入参数**部分，然后执行以下操作。

   1. 对于**参数名称**，请输入要创建的运行手册参数的描述性名称。

   1. 对于**类型**，请选择参数的类型，例如 `String` 或 `MapList`。

   1. 对于**必需**，请执行以下操作之一：
      + 如果必须在运行时提供该运行手册参数的值，请选择**是**。
      + 如果该参数不是必需的，请选择**否**，然后（可选）在**默认值**中输入默认参数值。

   1. 对于**描述**，请输入运行手册参数的描述。
**注意**  
要添加更多运行手册参数，请选择**添加参数**。要删除运行手册参数，请选择 **X**（删除）按钮。

1. （可选）展开**目标类型**部分，然后选择一种目标类型以定义可以运行自动化的资源的类型。例如，要在 EC2 实例上使用运行手册，请选择 `/AWS::EC2::Instance`。
**注意**  
如果指定“`/`”值，则运行文档可以在所有类型的资源上运行。有关有效资源类型列表，请参阅 *AWS CloudFormation 用户指南* 中的 [AWS 资源类型参考](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/aws-template-resource-type-ref.html)。

1. （可选）展开**文档标签**部分，然后输入一个或多个标签键值对以应用于运行手册。标签可以轻松标识、划分和搜索资源。

1. 在**步骤 1** 部分中，提供以下信息。
   + 对于**步骤名称**，请输入自动化的第一步的描述性名称。
   + 对于**操作类型**，请选择用于该步骤的操作类型。

     有关可用操作类型的列表和信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。
   + 对于**描述**，请输入自动化步骤的描述。您可以使用 Markdown 设置文本格式。
   + 根据选定的**操作类型**，在**步骤输入**部分中输入操作类型所需的输入。例如，如果选择了 `aws:approve` 操作，您必须为 `Approvers` 属性指定一个值。

     有关步骤输入字段的信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)中的选定操作类型的条目。例如：[`aws:executeStateMachine` - 运行 AWS Step Functions 状态机。](automation-action-executeStateMachine.md)。
   + （可选）对于**其他输入**，请提供运行手册所需的任何其他输入值。可用的输入类型取决于您为步骤选择的操作类型。（请注意，某些操作类型需要使用输入值。）
**注意**  
要添加更多输入，请选择 **Add optional input (添加可选的输入)**。要删除输入，请选择 **X**（删除）按钮。
   + （可选）对于**输出**，请输入执行该步骤的任何输出以供其他进程使用。
**注意**  
**输出**并非适用于所有操作类型。
   + （可选）展开**通用属性**部分，然后指定所有自动化操作的通用操作属性。例如，对于**超时秒数**，您可以提供一个值以指定步骤在停止之前可以运行多长时间（以秒为单位）。

     有关更多信息，请参阅 [所有操作共享的属性](automation-actions.md#automation-common)。
**注意**  
要添加更多步骤，请选择**添加步骤**，然后重复创建步骤的过程。要删除步骤，请选择**删除步骤**。

1. 选择**创建自动化**以保存运行手册。

## 创建运行脚本的运行手册
<a name="create-runbook-scripts"></a>

以下过程展示了如何在 AWS Systems Manager Automation 控制台中使用文档生成器创建运行脚本的自定义运行手册。

您创建的运行手册的第一步运行一个脚本以启动 Amazon Elastic Compute Cloud (Amazon EC2) 实例。第二步运行另一个脚本来监控要更改为 `ok` 的实例状态检查。然后，报告自动化的整体状态 `Success`。

**开始前的准备工作**  
确保您已完成以下步骤：
+ 确认您具有管理员权限，或为您授予了相应的权限以在 AWS Identity and Access Management (IAM) 中访问 Systems Manager。

  有关信息，请参阅[验证用户的运行手册访问权限](automation-setup.md#automation-setup-user-access)。
+ 确认在您的 AWS 账户 账户中具有自动化的 IAM 服务角色（也称为*担任角色*）。该角色是必需的，因为该演练使用 `aws:executeScript` 操作。

  有关创建此角色的信息，请参阅 [为自动化配置服务角色（担任角色）访问权限](automation-setup.md#automation-setup-configure-role)。

  有关用于运行 `aws:executeScript` 的 IAM 服务角色要求的信息，请参阅 [使用运行手册的权限](automation-document-script-considerations.md#script-permissions)。
+ 确认您具有启动 EC2 实例的权限。

  有关更多信息，请参阅《Amazon EC2 用户指南》**中的 [IAM 与 Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/UsingIAM.html#intro-to-iam)。

**创建使用文档生成器运行脚本的自定义运行手册**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择**创建自动化**。

1. 对于**名称**，请为运行手册键入以下描述性名称：**LaunchInstanceAndCheckStatus**。

1. （可选）对于**文档描述)**，请使用 Markdown 将默认文本替换为该运行手册的描述。示例如下：

   ```
   ##Title: LaunchInstanceAndCheckState
       -----
       **Purpose**: This runbook first launches an EC2 instance using the AMI ID provided in the parameter ```imageId```. The second step of this runbook continuously checks the instance status check value for the launched instance until the status ```ok``` is returned.
       
       ##Parameters:
       -----
       Name | Type | Description | Default Value
       ------------- | ------------- | ------------- | -------------
       assumeRole | String | (Optional) The ARN of the role that allows Automation to perform the actions on your behalf. | -
       imageId  | String | (Optional) The AMI ID to use for launching the instance. The default value uses the latest Amazon Linux 2023 AMI ID available. | {{ ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-arm64 }}
   ```

1. 对于**担任角色**，请使用 **arn:aws:iam::111122223333:role/AutomationServiceRole** 格式输入自动化的自动化 IAM 服务角色（担任角色）的 ARN。使用您的 AWS 账户 ID 替代 111122223333。

   您指定的角色用于提供启动自动化执行所需的权限。
**重要**  
对于不归 Amazon 所有并使用 `aws:executeScript` 操作的运行手册，必须指定一个角色。有关信息，请参阅[使用运行手册的权限](automation-document-script-considerations.md#script-permissions)。

1. 展开**输入参数**，然后执行以下操作。

   1. 对于**参数名称**，请输入 **imageId**。

   1. 对于**类型**，选择 **String**。

   1. 对于**必需**，请选择 `No`。

   1. 对于**默认值**，请输入以下内容。

      ```
      {{ ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-arm64 }}
      ```
**注意**  
该值使用最新的 Amazon Linux 2023 Amazon Machine Image（AMI）ID 启动 Amazon EC2 实例。如果要使用不同的 AMI，请将该值替换为您的 AMI ID。

   1. 对于**描述**，请输入以下内容。

      ```
      (Optional) The AMI ID to use for launching the instance. The default value uses the latest released Amazon Linux 2023 AMI ID.
      ```

1. 选择**添加参数)**以创建第二个参数 **tagValue**，然后输入以下内容。

   1. 对于**参数名称**，请输入 **tagValue**。

   1. 对于**类型**，选择 **String**。

   1. 对于**必需**，请选择 `No`。

   1. 对于**默认值**，请输入 **LaunchedBySsmAutomation**。这会将标签键对值 `Name:LaunchedBySsmAutomation` 添加到实例中。

   1. 对于**描述**，请输入以下内容。

      ```
      (Optional) The tag value to add to the instance. The default value is LaunchedBySsmAutomation.
      ```

1. 选择**添加参数** 以创建第三个参数 **instanceType**，然后输入以下信息。

   1. 对于**参数名称**，请输入 **instanceType**。

   1. 对于**类型**，选择 **String**。

   1. 对于**必需**，请选择 `No`。

   1. 对于**默认值**，请输入 **t2.micro**。

   1. 对于**参数描述**，请输入以下内容。

      ```
      (Optional) The instance type to use for the instance. The default value is t2.micro.
      ```

1. 展开**目标类型**，然后选择 **"/"**。

1. （可选）展开**文档标签**以将资源标签应用于运行手册。为**标签键** 输入 **Purpose**，并为**标签值**输入 **LaunchInstanceAndCheckState**。

1. 在**步骤 1** 部分中，完成以下步骤。

   1. 对于**步骤名称**，为自动化的第一步输入以下描述性步骤名称：**LaunchEc2Instance**。

   1. 对于**操作类型**，请选择**运行脚本)** (**aws:executeScript**)。

   1. 对于**描述**，请输入自动化步骤的描述，例如以下内容。

      ```
      **About This Step**
          
          This step first launches an EC2 instance using the ```aws:executeScript``` action and the provided script.
      ```

   1. 展开**输入**。

   1. 对于**运行时**，请选择运行提供的脚本所使用的运行时语言。

   1. 对于**处理程序**，输入 **launch\$1instance**。这是在以下脚本中声明的函数名称。
**注意**  
这对于 PowerShell 不是必需的。

   1. 对于**脚本**，请将默认内容替换为以下内容。请确保将脚本与相应的运行时值匹配。

------
#### [ Python ]

      ```
      def launch_instance(events, context):
            import boto3
            ec2 = boto3.client('ec2')
          
            image_id = events['image_id']
            tag_value = events['tag_value']
            instance_type = events['instance_type']
          
            tag_config = {'ResourceType': 'instance', 'Tags': [{'Key':'Name', 'Value':tag_value}]}
          
            res = ec2.run_instances(ImageId=image_id, InstanceType=instance_type, MaxCount=1, MinCount=1, TagSpecifications=[tag_config])
          
            instance_id = res['Instances'][0]['InstanceId']
          
            print('[INFO] 1 EC2 instance is successfully launched', instance_id)
          
            return { 'InstanceId' : instance_id }
      ```

------
#### [ PowerShell ]

      ```
      Install-Module AWS.Tools.EC2 -Force
          Import-Module AWS.Tools.EC2
          
          $payload = $env:InputPayload | ConvertFrom-Json
          
          $imageid = $payload.image_id
          
          $tagvalue = $payload.tag_value
          
          $instanceType = $payload.instance_type
          
          $type = New-Object Amazon.EC2.InstanceType -ArgumentList $instanceType
          
          $resource = New-Object Amazon.EC2.ResourceType -ArgumentList 'instance'
          
          $tag = @{Key='Name';Value=$tagValue}
          
          $tagSpecs = New-Object Amazon.EC2.Model.TagSpecification
          
          $tagSpecs.ResourceType = $resource
          
          $tagSpecs.Tags.Add($tag)
          
          $res = New-EC2Instance -ImageId $imageId -MinCount 1 -MaxCount 1 -InstanceType $type -TagSpecification $tagSpecs
          
          return @{'InstanceId'=$res.Instances.InstanceId}
      ```

------

   1. 展开**其他输入**。

   1. 对于**输入名称**，请选择 **InputPayload**。对于**输入值**，请输入以下 YAML 数据。

      ```
      image_id: "{{ imageId }}"
          tag_value: "{{ tagValue }}"
          instance_type: "{{ instanceType }}"
      ```

1. 展开**输出**，然后执行以下操作：
   + 对于**名称**，请输入 **payload**。
   + 对于**选择器**，请输入 **\$1.Payload**。
   + 对于**类型**，选择 `StringMap`。

1. 选择**添加步骤**将第二步添加到运行手册中。第二步查询在步骤 1 中启动的实例的状态，并等到返回的状态为 `ok`。

1. 在 **Step 2 (步骤 2)** 部分中，执行以下操作。

   1. 对于**步骤名称**，请为自动化的第二步输入以下描述性名称：**WaitForInstanceStatusOk**。

   1. 对于**操作类型**，请选择**运行脚本** (**aws:executeScript**)。

   1. 对于**描述**，请输入自动化步骤的描述，例如以下内容。

      ```
      **About This Step**
          
          The script continuously polls the instance status check value for the instance launched in Step 1 until the ```ok``` status is returned.
      ```

   1. 对于**运行时**，选择用于执行提供的脚本的运行时语言。

   1. 对于**处理程序**，输入 **poll\$1instance**。这是在以下脚本中声明的函数名称。
**注意**  
这对于 PowerShell 不是必需的。

   1. 对于**脚本**，请将默认内容替换为以下内容。请确保将脚本与相应的运行时值匹配。

------
#### [ Python ]

      ```
      def poll_instance(events, context):
            import boto3
            import time
          
            ec2 = boto3.client('ec2')
          
            instance_id = events['InstanceId']
          
            print('[INFO] Waiting for instance status check to report ok', instance_id)
          
            instance_status = "null"
          
            while True:
              res = ec2.describe_instance_status(InstanceIds=[instance_id])
          
              if len(res['InstanceStatuses']) == 0:
                print("Instance status information is not available yet")
                time.sleep(5)
                continue
          
              instance_status = res['InstanceStatuses'][0]['InstanceStatus']['Status']
          
              print('[INFO] Polling to get status of the instance', instance_status)
          
              if instance_status == 'ok':
                break
          
              time.sleep(10)
          
            return {'Status': instance_status, 'InstanceId': instance_id}
      ```

------
#### [ PowerShell ]

      ```
          Install-Module AWS.Tools.EC2 -Force
          
          $inputPayload = $env:InputPayload | ConvertFrom-Json
          
          $instanceId = $inputPayload.payload.InstanceId
          
          $status = Get-EC2InstanceStatus -InstanceId $instanceId
          
          while ($status.Status.Status -ne 'ok'){
             Write-Host 'Polling get status of the instance', $instanceId
          
             Start-Sleep -Seconds 5
          
             $status = Get-EC2InstanceStatus -InstanceId $instanceId
          }
          
          return @{Status = $status.Status.Status; InstanceId = $instanceId}
      ```

------

   1. 展开**其他输入**。

   1. 对于**输入名称**，请选择 **InputPayload**。对于**输入值**，请输入以下内容：

      ```
      {{ LaunchEc2Instance.payload }}
      ```

1. 选择**创建自动化**以保存运行手册。

# 在运行手册中使用脚本
<a name="automation-document-script-considerations"></a>

自动化运行手册支持将脚本作为自动化的一部分运行。Automation 是 AWS Systems Manager 中的一项工具。通过使用运行手册，您可以直接在 AWS 中运行脚本，而无需创建单独的计算环境来运行脚本。由于运行手册可以将脚本步骤与其他自动化步骤类型（例如批准）一起运行，因此您能够在紧急或不明确的情况下手动进行干预。您可以把来自运行手册中 `aws:executeScript` 操作的输出添加到 Amazon CloudWatch Logs。有关更多信息，请参阅 [使用 CloudWatch Logs 记录自动化操作输出](automation-action-logging.md)。

## 使用运行手册的权限
<a name="script-permissions"></a>

要使用运行手册，Systems Manager 必须使用 AWS Identity and Access Management (IAM) 角色的权限。自动化用于确定使用哪个角色的权限的方法取决于一些因素，以及步骤是否使用 `aws:executeScript` 操作。

对于不使用 `aws:executeScript` 的运行手册，自动化将使用以下两种权限来源之一：
+ 在运行手册中指定或作为参数传递的 IAM 服务角色或担任角色的权限。
+ 如果未指定 IAM 服务角色，则为启动自动化的用户的权限。

不过，如果运行手册中的步骤包含 `aws:executeScript` 操作，并且为该操作指定的 Python 或 PowerShell 脚本调用任何 AWS API 操作，则始终需要使用 IAM 服务角色（担任角色）。自动化按以下顺序检查该角色：
+ 在运行手册中指定或作为参数传递的 IAM 服务角色或担任角色的权限。
+ 如果找不到任何角色，自动化尝试在没有任何权限的情况下运行为 `aws:executeScript` 指定的 Python 或 PowerShell 脚本。如果脚本调用 AWS API 操作（例如，Amazon EC2 `CreateImage` 操作）或者尝试对 AWS 资源（例如 EC2 实例）执行操作，则包含脚本的步骤将失败，并且 Systems Manager 返回一条错误消息以报告失败。

## 将脚本添加到运行手册
<a name="adding-scripts"></a>

您可以通过内联方式将脚本作为运行手册中的步骤的一部分，从而将其添加到运行手册中。您还可以从本地计算机中上传脚本或指定脚本所在的 Amazon Simple Storage Service (Amazon S3) 存储桶，以将脚本附加到运行手册。在运行脚本的步骤完成后，脚本的输出将作为 JSON 对象提供，您可以将其作为运行手册中的后续步骤的输入。有关 `aws:executeScript` 操作以及如何使用脚本附件的更多信息，请参阅 [`aws:executeScript` - 运行脚本](automation-action-executeScript.md)。

## 运行手册的脚本限制
<a name="script-constraints"></a>

运行手册强制执行 5 个文件附加文件的限制。脚本可以采用 Python 脚本 (.py) 或 PowerShell Core 脚本 (.ps1) 的形式，也可以作为 .zip 文件中的内容附加。

# 在运行手册中使用条件语句
<a name="automation-branch-condition"></a>

默认情况下，在运行手册的 `mainSteps` 部分中定义的步骤将按先后顺序运行。在一个操作完成后，`mainSteps` 部分中指定的下一个操作将开始。此外，如果一个操作无法运行，则整个自动化将失败（默认情况下）。可以使用本节所述的 `aws:branch` 自动化操作和运行手册选项来创建执行*条件分支*的自动化。也就是说，您可以创建在评估不同选项后跳转到不同步骤或在某个步骤完成时动态响应更改的自动化。以下是可用于创建动态自动化的选项的列表：
+ **`aws:branch`**：此自动化操作让您能够创建一个动态自动化，该自动化可以在一个步骤中评估多个选项，然后根据评估结果跳转到运行手册中的不同步骤。
+ **`nextStep`**：此选项指定在成功完成一个步骤后，接下来处理自动化中的哪个步骤。
+ **`isEnd`**：此选项在特定步骤结束时停止自动化。该选项的默认值为 false。
+ **`isCritical`**：此选项将一个步骤指定为成功完成自动化的关键步骤。如果具有此分派的步骤失败，自动化会将自动化的最终状态报告为 `Failed`。该选项的默认值为 `true`。
+ **`onFailure`**：此选项指示自动化在失败时是应中止、继续还是转到其他步骤。该选项的默认值为 abort。

下一节介绍 `aws:branch` 自动化操作。有关 `nextStep`、`isEnd`、`isCritical` 和 `onFailure` 选项的更多信息，请参阅 [示例 `aws:branch` 运行手册](#branch-runbook-examples)。

## 使用 `aws:branch` 操作
<a name="branch-action-explained"></a>

`aws:branch` 操作提供适用于自动化的大部分动态条件分支选项。如前所述，此操作让自动化能够在一个步骤中评估多个条件，然后根据评估结果跳转到新的步骤。`aws:branch` 操作的功能类似于编程中的 `IF-ELIF-ELSE` 语句。

下面是一个 `aws:branch` 步骤的 YAML 示例：

```
- name: ChooseOSforCommands
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runPowerShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Windows
    - NextStep: runShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Linux
    Default:
      PostProcessing
```

在为步骤指定 `aws:branch` 操作时，请指定自动化必须评估的 `Choices`。自动化可以根据在运行手册的 `Parameters` 部分中指定的参数值来评估 `Choices`。自动化也可以基于上一步的输出来评估 `Choices`。

自动化使用布尔表达式评估每个选择。如果评估确定第一个选择为 `true`，自动化跳转到为该选择指定的步骤。如果评估确定第一个选择为 `false`，自动化程评估下一个选择。如果您的步骤包含三个或更多的 `Choices`，自动化按顺序评估每个选择，直到某个选择的评估结果为 `true`。然后，自动化跳转到为结果为 `true` 的选择指定的步骤。

如果所有 `Choices` 都为 `true`，则工作流程检查该步骤是否包含 `Default` 值。`Default` 值定义当所有选择都为 `true` 时工作流程应跳转到的步骤。如果没有为该步骤指定 `Default` 值，自动化处理文档中的下一个步骤。

以下是 YAML 的 `aws:branch` 步骤，命名为 **chooseOSfromParameter**。此步骤包含两个 `Choices`：(`NextStep: runWindowsCommand`) 和 (`NextStep: runLinuxCommand`)。自动化评估这些 `Choices`，以确定应为适当的操作系统运行哪个命令。每个选择的 `Variable` 都使用 `{{OSName}}`，这是运行手册作者在运行手册的 `Parameters` 部分中定义的参数。

```
mainSteps:
- name: chooseOSfromParameter
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runWindowsCommand
      Variable: "{{OSName}}"
      StringEquals: Windows
    - NextStep: runLinuxCommand
      Variable: "{{OSName}}"
      StringEquals: Linux
```

以下是 YAML 的 `aws:branch` 步骤，命名为 **chooseOSfromOutput**。此步骤包含两个 `Choices`：(`NextStep: runPowerShellCommand`) 和 (`NextStep: runShellCommand`)。自动化评估这些 `Choices`，以确定应为适当的操作系统运行哪个命令。每个选择的 `Variable` 都使用 `{{GetInstance.platform}}`，这是文档中上一步的输出。此示例还包含一个名为 `Default` 的选项。如果自动化评估两个的结果都为 `Choices`，而且两个选择均为 `true`，自动化跳转到名为 `PostProcessing` 的步骤。

```
mainSteps:
- name: chooseOSfromOutput
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runPowerShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Windows
    - NextStep: runShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Linux
    Default:
      PostProcessing
```

### 在运行手册中创建 `aws:branch` 步骤
<a name="create-branch-action"></a>

在运行手册中创建 `aws:branch` 步骤时，请定义自动化应对其进行评估的 `Choices` 以确定自动化应跳转到哪个步骤。如前所述，`Choices` 使用布尔表达式进行评估。每个选择都必须定义以下选项：
+ **NextStep**：当指定的选择为 `true` 时，运行手册要处理的下一个步骤。
+ **变量**：指定在运行手册的 `Parameters` 部分中定义的参数的名称（在 `Variables` 部分中定义的参数），或指定上一步的输出对象。

  使用以下格式指定变量值。

  `Variable: "{{variable name}}"`

  使用以下格式指定参数值。

  `Variable: "{{parameter name}}"`

  使用以下格式指定输出对象变量：

  `Variable: "{{previousStepName.outputName}}"`
**注意**  
下一节[关于创建输出变量](#branch-action-output)更详细地介绍如何创建输出变量。
+ **Operation**：用于评估选择的标准，例如 `StringEquals: Linux`。`aws:branch` 操作支持以下运算：

**字符串运算**
  + 字符串等于
  + EqualsIgnoreCase
  + StartsWith
  + EndsWith
  + 包含

**数值运算**
  + NumericEquals
  + NumericGreater
  + NumericLesser
  + NumericGreaterOrEquals
  + NumericLesser
  + NumericLesserOrEquals

**布尔运算**
  + BooleanEquals
**重要**  
创建运行手册时，系统将验证运行手册中的每个操作。在尝试创建运行手册时，如果某个操作不受支持，系统会返回错误。
+ **Default**：指定当所有 `Choices` 都为 `true` 时自动化应跳转到的回退步骤。
**注意**  
如果不想指定 `Default` 值，则可以指定 `isEnd` 选项。如果所有 `Choices` 都为 `true` 并且未指定 `Default` 值，自动化在此步骤结束时停止。

使用以下模板可以帮助您在运行手册中构建 `aws:branch` 步骤：将每个*示例资源占位符*替换为您自己的信息。

------
#### [ YAML ]

```
mainSteps:
- name: step name
  action: aws:branch
  inputs:
    Choices:
    - NextStep: step to jump to if evaluation for this choice is true
      Variable: "{{parameter name or output from previous step}}"
      Operation type: Operation value
    - NextStep: step to jump to if evaluation for this choice is true
      Variable: "{{parameter name or output from previous step}}"
      Operation type: Operation value
    Default:
      step to jump to if all choices are false
```

------
#### [ JSON ]

```
{
   "mainSteps":[
      {
         "name":"a name for the step",
         "action":"aws:branch",
         "inputs":{
            "Choices":[
               {
                  "NextStep":"step to jump to if evaluation for this choice is true",
                  "Variable":"{{parameter name or output from previous step}}",
                  "Operation type":"Operation value"
               },
               {
                  "NextStep":"step to jump to if evaluation for this choice is true",
                  "Variable":"{{parameter name or output from previous step}}",
                  "Operation type":"Operation value"
               }
            ],
            "Default":"step to jump to if all choices are false"
         }
      }
   ]
}
```

------

#### 关于创建输出变量
<a name="branch-action-output"></a>

要创建引用上一步输出的 `aws:branch` 选择，您需要标识上一步的名称和输出字段的名称。然后，使用以下格式组合步骤和字段的名称：

`Variable: "{{previousStepName.outputName}}"`

例如，以下示例中的第一个步骤名为 `GetInstance`。然后，在 `outputs` 下，有一个名为 `platform` 的字段。在第二个步骤 (`ChooseOSforCommands`) 中，作者希望将平台字段的输出引用为变量。要创建变量，只需将步骤名称 (GetInstance) 与输出字段名称 (platform) 组合在一起即可创建 `Variable: "{{GetInstance.platform}}"`。

```
mainSteps:
- Name: GetInstance
  action: aws:executeAwsApi
  inputs:
    Service: ssm
    Api: DescribeInstanceInformation
    Filters:
    - Key: InstanceIds
      Values: ["{{ InstanceId }}"]
  outputs:
  - Name: myInstance
    Selector: "$.InstanceInformationList[0].InstanceId"
    Type: String
  - Name: platform
    Selector: "$.InstanceInformationList[0].PlatformType"
    Type: String
- name: ChooseOSforCommands
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runPowerShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Windows
    - NextStep: runShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Linux
    Default:
      Sleep
```

这是一个示例，展示了从上一步和输出创建 *"Variable": "\$1\$1 describeInstance.Platform \$1\$1"* 的方法。

```
- name: describeInstance
  action: aws:executeAwsApi
  onFailure: Abort
  inputs:
    Service: ec2
    Api: DescribeInstances
    InstanceIds:
    - "{{ InstanceId }}"
  outputs:
  - Name: Platform
    Selector: "$.Reservations[0].Instances[0].Platform"
    Type: String
  nextStep: branchOnInstancePlatform
- name: branchOnInstancePlatform
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runEC2RescueForWindows
      Variable: "{{ describeInstance.Platform }}"
      StringEquals: windows
    Default: runEC2RescueForLinux
```

### 示例 `aws:branch` 运行手册
<a name="branch-runbook-examples"></a>

下面是一些使用 `aws:branch` 的示例运行手册。

**示例 1：使用 `aws:branch` 和输出变量基于操作系统类型运行命令**

在此示例的第一步（`GetInstance`）中，运行手册作者使用 `aws:executeAwsApi` 操作来调用 `ssm` `DescribeInstanceInformation` API 操作。作者使用此操作确定实例使用的操作系统的类型。`aws:executeAwsApi` 操作输出实例 ID 和平台类型。

在第二个步骤 (`ChooseOSforCommands`) 中，作者使用了 `aws:branch` 操作和两个 `Choices`：(`NextStep: runPowerShellCommand`) 和 (`NextStep: runShellCommand`)。自动化使用上一步 (`Variable: "{{GetInstance.platform}}"`) 的输出评估实例的操作系统。自动化跳转到指定操作系统的步骤。

```
---
schemaVersion: '0.3'
assumeRole: "{{AutomationAssumeRole}}"
parameters:
  AutomationAssumeRole:
    default: ""
    type: String
mainSteps:
- name: GetInstance
  action: aws:executeAwsApi
  inputs:
    Service: ssm
    Api: DescribeInstanceInformation
  outputs:
  - Name: myInstance
    Selector: "$.InstanceInformationList[0].InstanceId"
    Type: String
  - Name: platform
    Selector: "$.InstanceInformationList[0].PlatformType"
    Type: String
- name: ChooseOSforCommands
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runPowerShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Windows
    - NextStep: runShellCommand
      Variable: "{{GetInstance.platform}}"
      StringEquals: Linux
    Default:
      Sleep
- name: runShellCommand
  action: aws:runCommand
  inputs:
    DocumentName: AWS-RunShellScript
    InstanceIds:
    - "{{GetInstance.myInstance}}"
    Parameters:
      commands:
      - ls
  isEnd: true
- name: runPowerShellCommand
  action: aws:runCommand
  inputs:
    DocumentName: AWS-RunPowerShellScript
    InstanceIds:
    - "{{GetInstance.myInstance}}"
    Parameters:
      commands:
      - ls
  isEnd: true
- name: Sleep
  action: aws:sleep
  inputs:
    Duration: PT3S
```

**示例 2：使用 `aws:branch` 和参数变量基于操作系统类型运行命令**

运行手册作者在 `parameters` 部分的运行手册开头定义了几个参数选项。一个参数名为 `OperatingSystemName`。在第一个步骤 (`ChooseOS`) 中，作者使用了 `aws:branch` 操作和两个 `Choices`：(`NextStep: runWindowsCommand`) 和 (`NextStep: runLinuxCommand`)。这些 `Choices` 的变量引用在参数部分 (`Variable: "{{OperatingSystemName}}"`) 中指定的参数选项。当用户运行此自动化时，他们在运行时为 `OperatingSystemName` 指定值。自动化在 `Choices` 评估期间使用运行时参数。自动化基于为 `OperatingSystemName` 指定的运行时参数跳转到指定操作系统的步骤。

```
---
schemaVersion: '0.3'
assumeRole: "{{AutomationAssumeRole}}"
parameters:
  AutomationAssumeRole:
    default: ""
    type: String
  OperatingSystemName:
    type: String
  LinuxInstanceId:
    type: String
  WindowsInstanceId:
    type: String
mainSteps:
- name: ChooseOS
  action: aws:branch
  inputs:
    Choices:
    - NextStep: runWindowsCommand
      Variable: "{{OperatingSystemName}}"
      StringEquals: windows
    - NextStep: runLinuxCommand
      Variable: "{{OperatingSystemName}}"
      StringEquals: linux
    Default:
      Sleep
- name: runLinuxCommand
  action: aws:runCommand
  inputs:
    DocumentName: "AWS-RunShellScript"
    InstanceIds:
    - "{{LinuxInstanceId}}"
    Parameters:
      commands:
      - ls
  isEnd: true
- name: runWindowsCommand
  action: aws:runCommand
  inputs:
    DocumentName: "AWS-RunPowerShellScript"
    InstanceIds:
    - "{{WindowsInstanceId}}"
    Parameters:
      commands:
      - date
  isEnd: true
- name: Sleep
  action: aws:sleep
  inputs:
    Duration: PT3S
```

### 使用运算符创建复杂的分支自动化
<a name="branch-operators"></a>

您可以在 `aws:branch` 步骤中使用 `And`、`Or` 和 `Not` 运算符来创建复杂的分支自动化。

**“And”运算符**  
如果某个选择的多个变量需要为 `true`，可以使用 `And` 运算符。在下面的示例中，第一个选择评估实例是否 `running` 并且使用的是 `Windows` 操作系统。如果这*两个*变量的评估结果都为真，自动化跳转到 `runPowerShellCommand` 步骤。如果一个或多个变量为 `false`，自动化评估第二个选择的变量。

```
mainSteps:
- name: switch2
  action: aws:branch
  inputs:
    Choices:
    - And:
      - Variable: "{{GetInstance.pingStatus}}"
        StringEquals: running
      - Variable: "{{GetInstance.platform}}"
        StringEquals: Windows
      NextStep: runPowerShellCommand

    - And:
      - Variable: "{{GetInstance.pingStatus}}"
        StringEquals: running
      - Variable: "{{GetInstance.platform}}"
        StringEquals: Linux
      NextStep: runShellCommand
    Default:
      sleep3
```

**“Or”运算符**  
如果*某个*选择的多个变量需要为真，可以使用 `Or` 运算符。在下面的示例中，第一个选择评估参数字符串是不是 `Windows` 和 AWS Lambda 步骤的输出是不是真。如果*任意一个*变量的评估结果都为真，自动化跳转到 `RunPowerShellCommand` 步骤。如果两个变量都为假，自动化评估第二个选择的变量。

```
- Or:
  - Variable: "{{parameter1}}"
    StringEquals: Windows
  - Variable: "{{BooleanParam1}}"
    BooleanEquals: true
  NextStep: RunPowershellCommand
- Or:
  - Variable: "{{parameter2}}"
    StringEquals: Linux
  - Variable: "{{BooleanParam2}}"
    BooleanEquals: true
  NextStep: RunShellScript
```

**“Not”运算符**  
当变量*不*为真时，如果您想要跳转到定义的步骤，则使用 `Not` 运算符。在下面的示例中，第一个选择评估参数字符串是不是 `Not Linux`。如果变量的评估结果不为 Linux，自动化跳转到 `sleep2` 步骤。如果第一个选择的评估结果*为* Linux，自动化评估下一个选择。

```
mainSteps:
- name: switch
  action: aws:branch
  inputs:
    Choices:
    - NextStep: sleep2
      Not:
        Variable: "{{testParam}}"
        StringEquals: Linux
    - NextStep: sleep1
      Variable: "{{testParam}}"
      StringEquals: Windows
    Default:
      sleep3
```

## 如何使用条件选项的示例
<a name="conditional-examples"></a>

本部分包括有关如何使用运行手册中的动态选项的其他示例。本部分中的每个示例均扩展以下运行手册。该运行手册包含两个操作。第一个操作名为 `InstallMsiPackage`。它使用 `aws:runCommand` 操作将应用程序安装到 Windows Server 实例上。第二个操作名为 `TestInstall`。它使用 `aws:invokeLambdaFunction` 操作在成功安装应用程序后测试该应用程序。步骤 1 指定 `onFailure: Abort`。这意味着，如果应用程序未成功安装，自动化会在进入步骤 2 前停止。

**示例 1：包含两个线性操作的运行手册**

```
---
schemaVersion: '0.3'
description: Install MSI package and run validation.
assumeRole: "{{automationAssumeRole}}"
parameters:
  automationAssumeRole:
    type: String
    description: "(Required) Assume role."
  packageName:
    type: String
    description: "(Required) MSI package to be installed."
  instanceIds:
    type: String
    description: "(Required) Comma separated list of instances."
mainSteps:
- name: InstallMsiPackage
  action: aws:runCommand
  maxAttempts: 2
  onFailure: Abort
  inputs:
    InstanceIds:
    - "{{instanceIds}}"
    DocumentName: AWS-RunPowerShellScript
    Parameters:
      commands:
      - msiexec /i {{packageName}}
- name: TestInstall
  action: aws:invokeLambdaFunction
  maxAttempts: 1
  timeoutSeconds: 500
  inputs:
    FunctionName: TestLambdaFunction
...
```

**使用 `onFailure` 选项创建跳转到不同步骤的动态自动化**

下面的示例使用 `onFailure: step:step name`、`nextStep` 和 `isEnd` 选项创建一个动态自动化。在此示例中，如果 `InstallMsiPackage` 操作失败，自动化将跳转到名为 *PostFailure* (`onFailure: step:PostFailure`) 的操作以运行 AWS Lambda 函数，从而在安装失败时执行某个操作。如果安装成功，自动化将跳转到 TestInstall 操作 (`nextStep: TestInstall`)。`TestInstall` 和 `PostFailure` 步骤都使用 `isEnd` 选项 (`isEnd: true`)，以便自动化在任一步骤完成时结束。

**注意**  
可以选择在 `mainSteps` 部分的最后一步中使用 `isEnd` 选项。如果最后一个步骤未跳转到其他步骤，自动化会在最后一步中运行操作后停止。

**示例 2：跳转到不同步骤的动态自动化**

```
mainSteps
- name: InstallMsiPackage
  action: aws:runCommand
  onFailure: step:PostFailure
  maxAttempts: 2
  inputs:
    InstanceIds:
    - "{{instanceIds}}"
    DocumentName: AWS-RunPowerShellScript
    Parameters:
      commands:
      - msiexec /i {{packageName}}
  nextStep: TestInstall
- name: TestInstall
  action: aws:invokeLambdaFunction
  maxAttempts: 1
  timeoutSeconds: 500
  inputs:
    FunctionName: TestLambdaFunction
  isEnd: true
- name: PostFailure
  action: aws:invokeLambdaFunction
  maxAttempts: 1
  timeoutSeconds: 500
  inputs:
    FunctionName: PostFailureRecoveryLambdaFunction
  isEnd: true
...
```

**注意**  
在处理运行手册之前，系统将验证运行手册不会创建无限循环。如果检测到无限循环，自动化将返回一个错误和一个显示哪些步骤创建循环的循环跟踪。

**创建定义关键步骤的动态自动化**

您可以指定一个对于自动化的整体成功很重要的步骤。如果关键步骤失败，自动化会将自动化状态报告为 `Failed`，即使已成功运行一个或多个步骤也是如此。在以下示例中，用户在 *InstallMsiPackage* 步骤失败 (`onFailure: step:VerifyDependencies`) 时标识 *VerifyDependencies* 步骤。用户指定 `InstallMsiPackage` 步骤为非关键步骤 (`isCritical: false`)。在此示例中，如果应用程序安装失败，自动化处理 `VerifyDependencies` 步骤以确定是否因一个或多个依赖项缺失而导致应用程序安装失败。

**示例 3：定义自动化的关键步骤**

```
---
name: InstallMsiPackage
action: aws:runCommand
onFailure: step:VerifyDependencies
isCritical: false
maxAttempts: 2
inputs:
  InstanceIds:
  - "{{instanceIds}}"
  DocumentName: AWS-RunPowerShellScript
  Parameters:
    commands:
    - msiexec /i {{packageName}}
nextStep: TestPackage
...
```

# 使用操作输出作为输入
<a name="automation-action-outputs-inputs"></a>

多个自动化操作会返回预定义的输出。您可以使用格式 `{{stepName.outputName}}` 将这些输出作为输入传递到运行手册的后续步骤。您还可以在运行手册中为自动化操作定义自定义输出。让您可以运行脚本，或调用其他 AWS 服务 的 API 操作一次，以便您在后续操作中重复使用这些值作为输入。运行手册中的参数类型是静态的。这意味着参数类型在定义后无法更改。要定义步骤输出，请提供以下字段：
+ 名称：（必需）输出名称，用于在后续步骤中引用输出值。
+ 选择器：（必需）用于确定输出值的 JSONPath 表达式。
+ 类型：（可选）选择器字段返回的值的数据类型。有效的类型值为 `String`、`Integer`、`Boolean`、`StringList`、`StringMap`、`MapList`。默认值为 `String`。

如果输出的值与您指定的数据类型不匹配，自动化会尝试转换该数据类型。例如，如果返回的值是 `Integer`，但指定的 `Type` 是 `String`，则最终输出值为 `String` 值。支持以下类型转换：
+ `String` 值可以转换为 `StringList`、`Integer` 和 `Boolean`。
+ `Integer` 值可以转换为 `String` 和 `StringList`。
+ `Boolean` 值可以转换为 `String` 和 `StringList`。
+ 包含一个元素的 `StringList`、`IntegerList` 或 `BooleanList` 值可以转换为 `String`、`Integer` 或 `Boolean`。

将参数或输出与自动化操作一起使用时，不能在操作的输入中动态更改数据类型。

这份示例运行手册演示了如何定义操作输出，并将该值引用为后续操作的输入。运行手册执行以下操作：
+ 使用 `aws:executeAwsApi` 操作调用 Amazon EC2 DescribeImages API 操作来获取特定 Windows Server 2016 AMI 的名称。它将映像 ID 输出为 `ImageId`。
+ 使用 `aws:executeAwsApi` 操作调用 Amazon EC2 RunInstances API 操作来启动一个实例，它使用上一步中的 `ImageId`。它将实例 ID 输出为 `InstanceId`。
+ 使用 ` aws:waitForAwsResourceProperty` 操作轮询 Amazon EC2 DescribeInstanceStatus API 操作来等待实例进入 `running` 状态。此操作的超时时间为 60 秒。如果实例在轮询 60 秒后未能进入 `running` 状态，则此步骤超时。
+ 使用 `aws:assertAwsResourceProperty` 操作调用 Amazon EC2 `DescribeInstanceStatus` API 操作来断言实例处于 `running` 状态。如果实例状态不为 `running`，则此步骤失败。

```
---
description: Sample runbook using AWS API operations
schemaVersion: '0.3'
assumeRole: "{{ AutomationAssumeRole }}"
parameters:
  AutomationAssumeRole:
    type: String
    description: "(Optional) The ARN of the role that allows Automation to perform the actions on your behalf."
    default: ''
  ImageName:
    type: String
    description: "(Optional) Image Name to launch EC2 instance with."
    default: "Windows_Server-2022-English-Full-Base*"
mainSteps:
- name: getImageId
  action: aws:executeAwsApi
  inputs:
    Service: ec2
    Api: DescribeImages
    Filters:  
    - Name: "name"
      Values: 
      - "{{ ImageName }}"
  outputs:
  - Name: ImageId
    Selector: "$.Images[0].ImageId"
    Type: "String"
- name: launchOneInstance
  action: aws:executeAwsApi
  inputs:
    Service: ec2
    Api: RunInstances
    ImageId: "{{ getImageId.ImageId }}"
    MaxCount: 1
    MinCount: 1
  outputs:
  - Name: InstanceId
    Selector: "$.Instances[0].InstanceId"
    Type: "String"
- name: waitUntilInstanceStateRunning
  action: aws:waitForAwsResourceProperty
  timeoutSeconds: 60
  inputs:
    Service: ec2
    Api: DescribeInstanceStatus
    InstanceIds:
    - "{{ launchOneInstance.InstanceId }}"
    PropertySelector: "$.InstanceStatuses[0].InstanceState.Name"
    DesiredValues:
    - running
- name: assertInstanceStateRunning
  action: aws:assertAwsResourceProperty
  inputs:
    Service: ec2
    Api: DescribeInstanceStatus
    InstanceIds:
    - "{{ launchOneInstance.InstanceId }}"
    PropertySelector: "$.InstanceStatuses[0].InstanceState.Name"
    DesiredValues:
    - running
outputs:
- "launchOneInstance.InstanceId"
...
```

前面介绍的每个自动化操作都允许您通过指定服务命名空间、API 操作名称、输入参数和输出参数来调用特定的 API 操作。输入由您选择的 API 操作定义。您可以在以下[服务参考](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/index.html)页面的左侧导航栏中选择服务来查看 API 操作（也称为方法）。在要调用的服务的**客户端**部分中选择一种方法。例如，以下页面中列出了 Amazon Relational Database Service (Amazon RDS) 的所有 API 操作（方法）：[Amazon RDS 方法](https://boto3.amazonaws.com/v1/documentation/api/latest/reference/services/rds.html)。

您可以在以下位置查看每个自动化操作的架构：
+ [`aws:assertAwsResourceProperty` - 断言 AWS 资源状态或事件状态](automation-action-assertAwsResourceProperty.md)
+ [`aws:executeAwsApi` - 调用并运行 AWS API 操作](automation-action-executeAwsApi.md)
+ [`aws:waitForAwsResourceProperty` - 等待 AWS 资源属性](automation-action-waitForAwsResourceProperty.md)

架构包括使用每个操作所需字段的描述。

**使用 Selector/PropertySelector 字段**  
每个自动化操作都要求您指定一个输出 `Selector`（用于 `aws:executeAwsApi`）或 `PropertySelector`（用于 `aws:assertAwsResourceProperty` 和 `aws:waitForAwsResourceProperty`)。这些字段用于处理 AWS API 操作的 JSON 响应。这些字段使用 JSONPath 语法。

以下是帮助说明这一概念的 `aws:executeAwsAPi` 操作的示例：

```
---
mainSteps:
- name: getImageId
  action: aws:executeAwsApi
  inputs:
    Service: ec2
    Api: DescribeImages
    Filters:  
      - Name: "name"
        Values: 
          - "{{ ImageName }}"
  outputs:
    - Name: ImageId
      Selector: "$.Images[0].ImageId"
      Type: "String"
...
```

在 `aws:executeAwsApi` 步骤 `getImageId` 中，自动化将调用 `DescribeImages` API 操作并接收来自 `ec2` 的响应。然后，自动化将 `Selector - "$.Images[0].ImageId"` 应用于 API 响应，并将所选值分配给输出 `ImageId` 变量。通过指定 `"{{ getImageId.ImageId }}"`，同一自动化中的其他步骤可以使用 `ImageId` 的值。

以下是帮助说明这一概念的 `aws:waitForAwsResourceProperty` 操作的示例：

```
---
- name: waitUntilInstanceStateRunning
  action: aws:waitForAwsResourceProperty
  # timeout is strongly encouraged for action - aws:waitForAwsResourceProperty
  timeoutSeconds: 60
  inputs:
    Service: ec2
    Api: DescribeInstanceStatus
    InstanceIds:
    - "{{ launchOneInstance.InstanceId }}"
    PropertySelector: "$.InstanceStatuses[0].InstanceState.Name"
    DesiredValues:
    - running
...
```

在 `aws:waitForAwsResourceProperty` 步骤 `waitUntilInstanceStateRunning` 中，自动化将调用 `DescribeInstanceStatus` API 操作并接收来自 `ec2` 的响应。然后，自动化将 `PropertySelector - "$.InstanceStatuses[0].InstanceState.Name"` 应用于响应，并检查指定的返回值是否与 `DesiredValues` 列表中的值匹配（在本例中为 `running`）。此步骤重复这一过程，直到响应返回 `running` 实例状态。

## 在运行手册中使用 JSONPath
<a name="automation-action-json-path"></a>

JSONPath 表达式是以“\$1”开头的字符串。用于选择 JSON 元素中的一个或多个组件。下面的列表包含有关 Systems Manager 自动化支持的 JSONPath 运算符的信息：
+ **点表示的子字段 (.)**：用于 JSON 对象。此运算符选择特定键的值。
+ **深层扫描 (..)**：用于 JSON 元素。此运算符逐级扫描 JSON 元素，并使用特定键选择值列表。此运算符的返回类型始终为 JSON 数组。在自动化步骤输出类型上下文中，运算符可以是 StringList 或 MapList。
+ **数组索引 ([ ])**：用于 JSON 数组。此运算符获取特定索引的值。
+ **筛选条件 ([?(*expression*)])**：与 JSON 数组一起使用。此运算符筛选条件 JSON 数组值与筛选条件表达式中定义的标准相匹配。筛选条件表达式只能使用以下运算符：==、\$1=、>、<、>= 或 <=。不支持将多个筛选条件表达式与 AND (&&) 或 OR (\$1\$1) 组合使用。此运算符的返回类型始终为 JSON 数组。

为了更好地理解 JSONPath 运算符，请查看以下 ec2 `DescribeInstances` API 操作的 JSON 响应。此响应下面提供了几个示例，它们说明通过向 `DescribeInstances` API 操作响应应用不同的 JSONPath 表达式获取的不同结果。

```
{
    "NextToken": "abcdefg",
    "Reservations": [
        {
            "OwnerId": "123456789012",
            "ReservationId": "r-abcd12345678910",
            "Instances": [
                {
                    "ImageId": "ami-12345678",
                    "BlockDeviceMappings": [
                        {
                            "Ebs": {
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-000000000000"
                            },
                            "DeviceName": "/dev/xvda"
                        }
                    ],
                    "State": {
                        "Code": 16,
                        "Name": "running"
                    }
                }
            ],
            "Groups": []
        },
        {
            "OwnerId": "123456789012",
            "ReservationId": "r-12345678910abcd",
            "Instances": [
                {
                    "ImageId": "ami-12345678",
                    "BlockDeviceMappings": [
                        {
                            "Ebs": {
                                "DeleteOnTermination": true,
                                "Status": "attached",
                                "VolumeId": "vol-111111111111"
                            },
                            "DeviceName": "/dev/xvda"
                        }
                    ],
                    "State": {
                        "Code": 80,
                        "Name": "stopped"
                    }
                }
            ],
            "Groups": []
        }
    ]
}
```

**JSONPath 示例 1：从 JSON 响应获取特定的 String**

```
JSONPath: 
$.Reservations[0].Instances[0].ImageId 

Returns:
"ami-12345678"

Type: String
```

**JSONPath 示例 2：从 JSON 响应获取特定的 Boolean**

```
JSONPath:
$.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.DeleteOnTermination
        
Returns:
true

Type: Boolean
```

**JSONPath 示例 3：从 JSON 响应获取特定的 Integer**

```
JSONPath:
$.Reservations[0].Instances[0].State.Code
        
Returns:
16

Type: Integer
```

**JSONPath 示例 4：深层扫描 JSON 响应，然后以 StringList 的形式获取 VolumeId 的所有值** 

```
JSONPath:
$.Reservations..BlockDeviceMappings..VolumeId
        
Returns:
[
   "vol-000000000000",
   "vol-111111111111"
]

Type: StringList
```

**JSONPath 示例 5：以 StringMap 的形式获取特定的 BlockDeviceMappings 对象**

```
JSONPath:
$.Reservations[0].Instances[0].BlockDeviceMappings[0]
        
Returns:
{
   "Ebs" : {
      "DeleteOnTermination" : true,
      "Status" : "attached",
      "VolumeId" : "vol-000000000000"
   },
   "DeviceName" : "/dev/xvda"
}

Type: StringMap
```

**JSONPath 示例 6：深层扫描 JSON 响应，然后以 MapList 的形式获取所有 State 对象**

```
JSONPath:
$.Reservations..Instances..State 
    
Returns:
[
   {
      "Code" : 16,
      "Name" : "running"
   },
   {
      "Code" : 80,
      "Name" : "stopped"
   }
]

Type: MapList
```

**JSONPath 示例 7：筛选处于 `running` 状态的实例**

```
JSONPath:
$.Reservations..Instances[?(@.State.Name == 'running')]

Returns:
[
  {
    "ImageId": "ami-12345678",
    "BlockDeviceMappings": [
      {
        "Ebs": {
          "DeleteOnTermination": true,
          "Status": "attached",
          "VolumeId": "vol-000000000000"
        },
        "DeviceName": "/dev/xvda"
      }
    ],
    "State": {
      "Code": 16,
      "Name": "running"
    }
  }
]

Type: MapList
```

**JSONPath 示例 8：返回未处于 `running` 状态实例的 `ImageId`**

```
JSONPath:
$.Reservations..Instances[?(@.State.Name != 'running')].ImageId

Returns:
[
  "ami-12345678"
]

Type: StringList | String
```

# 为 Automation 创建 Webhook 集成
<a name="creating-webhook-integrations"></a>

要在自动化期间使用 Webhooks 发送消息，请创建集成。可以在自动化过程中使用您的运行手册中的 `aws:invokeWebhook` 操作调用集成。如果尚未创建 Webhook，请参阅 [为集成创建 Webhooks](#creating-webhooks)。要了解有关 `aws:invokeWebhook` 操作的更多信息，请参阅 [`aws:invokeWebhook` – 调用 Automation Webhook 集成](invoke-webhook.md)。

如以下程序所示，您可以使用 Systems Manager Automation 控制台或您的首选命令行工具来创建集成。

## 创建集成（控制台）
<a name="creating-integrations-console"></a>

**要为 Automation 创建集成（控制台）**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 请选择 **Integrations**（集成）选项卡。

1. 请选择 **Add integration**（添加集成），然后选择 **Webhook**。

1. 请输入要为集成包括的所需值和任何可选值。

1. 请选择 **Add**（添加）来创建集成。

## 创建集成（命令行）
<a name="creating-integrations-commandline"></a>

要使用命令行工具创建集成，您必须为集成创建所需的 `SecureString` 参数。Automation 使用 Parameter Store（Systems Manager 中的一项工具）中的预留命名空间来存储有关集成的信息。如果您使用 AWS 管理控制台 创建集成，Automation 会为您处理此过程。在命名空间之后，您必须指定要创建的集成类型，然后指定集成的名称。目前，Automation 支持 `webhook` 类型集成。

`webhook` 类型集成支持的字段如下：
+ 说明
+ headers
+ payload
+ URL

**开始前的准备工作**  
安装并配置 AWS Command Line Interface (AWS CLI) 或 AWS Tools for PowerShell（如果尚未这样做）。有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

**要为 Automation 创建集成（命令行）**
+ 运行下列命令以为集成创建所需的 `SecureString` 参数。将每个*示例资源占位符*替换为您自己的信息。`/d9d01087-4a3f-49e0-b0b4-d568d7826553/ssm/integrations/webhook/` 命名空间在 Parameter Store 中为集成预留。参数的名称必须使用此命名空间，后跟集成的名称。例如 `/d9d01087-4a3f-49e0-b0b4-d568d7826553/ssm/integrations/webhook/myWebhookIntegration`。

------
#### [ Linux & macOS ]

  ```
  aws ssm put-parameter \
      --name "/d9d01087-4a3f-49e0-b0b4-d568d7826553/ssm/integrations/webhook/myWebhookIntegration" \
      --type "SecureString" \
      --data-type "aws:ssm:integration" \
      --value '{"description": "My first webhook integration for Automation.", "url": "myWebHookURL"}'
  ```

------
#### [ Windows ]

  ```
  aws ssm put-parameter ^
      --name "/d9d01087-4a3f-49e0-b0b4-d568d7826553/ssm/integrations/webhook/myWebhookIntegration" ^
      --type "SecureString" ^
      --data-type "aws:ssm:integration" ^
      --value  "{\"description\":\"My first webhook integration for Automation.\",\"url\":\"myWebHookURL\"}"
  ```

------
#### [ PowerShell ]

  ```
  Write-SSMParameter `
      -Name "/d9d01087-4a3f-49e0-b0b4-d568d7826553/ssm/integrations/webhook/myWebhookIntegration" `
      -Type "SecureString"
      -DataType "aws:ssm:integration"
      -Value '{"description": "My first webhook integration for Automation.", "url": "myWebHookURL"}'
  ```

------

## 为集成创建 Webhooks
<a name="creating-webhooks"></a>

在使用您的提供商创建 Webhooks 时，请注意以下几点：
+ 协议必须是 HTTPS。
+ 支持自定义请求标头。
+ 可以指定默认的请求正文。
+ 当使用 `aws:invokeWebhook` 操作调用集成时，可以覆盖默认的请求正文。

# 处理运行手册中的超时
<a name="automation-handling-timeouts"></a>

`timeoutSeconds` 属性由所有自动化操作共享。您可以使用此属性指定操作的执行超时值。此外，您还可以更改操作超时如何影响自动化和整体执行状态。另外，您可以通过定义操作的 `onFailure` 和 `isCritical` 共享属性来完成此操作。

例如，根据您的使用案例，您可能希望自动化继续执行其他操作，并且在操作超时的情况下不影响自动化的整体状态。在此示例中，您可以使用 `timeoutSeconds` 属性指定操作超时之前等待的时间长度。然后，您可以指定存在超时的情况下自动化应转到的操作（即步骤）。使用 `onFailure` 属性的格式 `step:step name` 指定值，而不是指定默认值 `Abort`。默认情况下，如果操作超时，在自动化执行状态将为 `Timed Out`。要防止超时影响自动化执行状态，请为 `false` 属性指定 `isCritical`。

以下示例演示如何为此情况中描述的操作定义共享属性。

------
#### [ YAML ]

```
- name: verifyImageAvailability
  action: 'aws:waitForAwsResourceProperty'
  timeoutSeconds: 600
  isCritical: false
  onFailure: 'step:getCurrentImageState'
  inputs:
    Service: ec2
    Api: DescribeImages
    ImageIds:
      - '{{ createImage.newImageId }}'
    PropertySelector: '$.Images[0].State'
    DesiredValues:
      - available
  nextStep: copyImage
```

------
#### [ JSON ]

```
{
    "name": "verifyImageAvailability",
    "action": "aws:waitForAwsResourceProperty",
    "timeoutSeconds": 600,
    "isCritical": false,
    "onFailure": "step:getCurrentImageState",
    "inputs": {
        "Service": "ec2",
        "Api": "DescribeImages",
        "ImageIds": [
            "{{ createImage.newImageId }}"
        ],
        "PropertySelector": "$.Images[0].State",
        "DesiredValues": [
            "available"
        ]
    },
    "nextStep": "copyImage"
}
```

------

有关所有自动化操作共享的属性的更多信息，请参阅 [所有操作共享的属性](automation-actions.md#automation-common)。

# Systems Manager 自动化运行手册参考
<a name="automation-documents-reference"></a>

为了帮助您快速入门，AWS Systems Manager 提供了预定义运行手册。这些运行手册由 Amazon Web Services、AWS 支持 和 AWS Config 维护。运行手册参考描述了 Systems Manager、支持 和 AWS Config 提供的每个预定义运行手册。有关更多信息，请参阅 [Systems Manager 自动化运行手册参考](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide)。

# 教程
<a name="automation-tutorials"></a>

以下教程可帮助您使用 AWS Systems Manager Automation 来解决常见应用场景的问题。这些教程演示了如何将自己的运行手册、Automation 提供的预定义运行手册以及别的 Systems Manager 工具与其他 AWS 服务一起使用。

**Contents**
+ [更新 AMIs](automation-tutorial-update-ami.md)
  + [更新 Linux AMI](automation-tutorial-update-patch-linux-ami.md)
  + [更新 Linux AMI（AWS CLI）](automation-tutorial-update-ami.md#update-patch-linux-ami-cli)
  + [更新 Windows Server AMI](automation-tutorial-update-patch-windows-ami.md)
  + [使用 Automation、AWS Lambda 和 Parameter Store 来更新黄金 AMI](automation-tutorial-update-patch-golden-ami.md)
    + [任务 1：在 Systems Manager Parameter Store 中创建一个参数](automation-tutorial-update-patch-golden-ami.md#create-parameter-ami)
    + [任务 2：为 AWS Lambda 创建 IAM 角色](automation-tutorial-update-patch-golden-ami.md#create-lambda-role)
    + [任务 3：创建 AWS Lambda 函数](automation-tutorial-update-patch-golden-ami.md#create-lambda-function)
    + [任务 4：创建运行手册并修补 AMI](automation-tutorial-update-patch-golden-ami.md#create-custom-ami-update-runbook)
  + [使用 Automation 和 Jenkins 更新 AMIs](automation-tutorial-update-patch-ami-jenkins-integration.md)
  + [更新自动扩缩组的 AMIs](automation-tutorial-update-patch-windows-ami-autoscaling.md)
    + [创建 **PatchAMIAndUpdateASG** 运行手册](automation-tutorial-update-patch-windows-ami-autoscaling.md#create-autoscaling-update-runbook)
+ [使用 AWS 支持 自助服务运行手册](automation-tutorial-support-runbooks.md)
  + [在无法访问的实例上运行 EC2Rescue 工具](automation-ec2rescue.md)
    + [工作原理](automation-ec2rescue.md#automation-ec2rescue-how)
    + [开始前的准备工作](automation-ec2rescue.md#automation-ec2rescue-begin)
      + [向 `AWSSupport-EC2Rescue` 授予在您的实例上执行操作的权限](automation-ec2rescue.md#automation-ec2rescue-access)
        + [使用 IAM policy 授予权限](automation-ec2rescue.md#automation-ec2rescue-access-iam)
        + [使用 CloudFormation 模板授予权限](automation-ec2rescue.md#automation-ec2rescue-access-cfn)
    + [运行自动化](automation-ec2rescue.md#automation-ec2rescue-executing)
  + [在 EC2 实例上重置密码和 SSH 密钥](automation-ec2reset.md)
    + [工作原理](automation-ec2reset.md#automation-ec2reset-how)
    + [开始前的准备工作](automation-ec2reset.md#automation-ec2reset-begin)
      + [向 AWSSupport-EC2Rescue 授予在您的实例上执行操作的权限](automation-ec2reset.md#automation-ec2reset-access)
        + [使用 IAM policy 授予权限](automation-ec2reset.md#automation-ec2reset-access-iam)
        + [使用 CloudFormation 模板授予权限](automation-ec2reset.md#automation-ec2reset-access-cfn)
    + [运行自动化](automation-ec2reset.md#automation-ec2reset-executing)
+ [使用输入变压器将数据传递到 Automation](automation-tutorial-eventbridge-input-transformers.md)

# 更新 AMIs
<a name="automation-tutorial-update-ami"></a>

以下教程说明了如何更新 Amazon Machine Image（AMIs）以包含最新补丁。

**Topics**
+ [更新 Linux AMI](automation-tutorial-update-patch-linux-ami.md)
+ [更新 Linux AMI（AWS CLI）](#update-patch-linux-ami-cli)
+ [更新 Windows Server AMI](automation-tutorial-update-patch-windows-ami.md)
+ [使用 Automation、AWS Lambda 和 Parameter Store 来更新黄金 AMI](automation-tutorial-update-patch-golden-ami.md)
+ [使用 Automation 和 Jenkins 更新 AMIs](automation-tutorial-update-patch-ami-jenkins-integration.md)
+ [更新自动扩缩组的 AMIs](automation-tutorial-update-patch-windows-ami-autoscaling.md)

# 更新 Linux AMI
<a name="automation-tutorial-update-patch-linux-ami"></a>

本 Systems Manager Automation 演练向您展示了如何使用控制台或 AWS CLI 和 `AWS-UpdateLinuxAmi` 运行手册，使用您指定的最新软件包补丁更新Linux AMI。Automation 是 AWS Systems Manager 中的一项工具。`AWS-UpdateLinuxAmi` 运行手册也能自动安装其他具体站点相关的软件包和配置。您可以使用该演练更新各种 Linux 分发版，包括 Ubuntu Server、Red Hat Enterprise Linux（RHEL）或 Amazon Linux AMIs。有关支持的 Linux 版本的完整列表，请参阅 [Patch Manager 先决条件](patch-manager-prerequisites.md)。

使用 `AWS-UpdateLinuxAmi` 运行手册可以自动完成映像维护任务，而无需使用 JSON 或 YAML 编写运行手册。您可以使用 `AWS-UpdateLinuxAmi` 运行手册执行以下类型的任务。
+ 在 Amazon Linux、Red Hat Enterprise Linux 或 Ubuntu Server Amazon Machine Image（AMI）上升级所有分发版本程序包和 Amazon 软件。这是默认运行手册行为。
+ 在现有映像上安装 AWS Systems Manager SSM Agent 可启用 Systems Manager 的各项工具，例如使用 AWS Systems Manager Run Command 执行远程命令，或者使用 Inventory 收集软件清单。
+ 安装其他软件包。

**开始前的准备工作**  
在您开始使用运行手册之前，请先为自动化配置角色和 EventBridge（后者可选）。有关更多信息，请参阅 [设置自动化](automation-setup.md)。此演练还要求您指定 AWS Identity and Access Management (IAM) 实例配置文件的名称。有关创建 IAM 实例配置文件的更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)。

`AWS-UpdateLinuxAmi` 运行手册接受以下输入参数。


****  

| 参数 | 类型 | 说明 | 
| --- | --- | --- | 
|  SourceAmiId  |  字符串  |  （必需）源 AMI ID。  | 
|  IamInstanceProfileName  |  字符串  |  （必需）您在[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)中创建的 IAM 实例配置文件角色的名称。实例配置文件角色为自动化提供在您实例上执行操作的权限，例如运行命令或启动和停止服务。运行手册仅使用实例配置文件角色的名称。如果您指定 Amazon Resource Name (ARN)，则自动化会失败。  | 
|  AutomationAssumeRole  |  字符串  |  （必需）您在 [设置自动化](automation-setup.md) 中创建的 IAM 服务角色的名称。服务角色（也称为担任角色）为自动化提供权限，用于担任您的 IAM 角色和代表您执行操作。例如，在运行手册中运行 `aws:createImage` 操作时，服务角色允许自动化创建新的 AMI。对于此参数，必须指定完整的 ARN。  | 
|  TargetAmiName  |  字符串  |  （可选）新 AMI 在创建之后的名称。默认名称是系统生成的字符串，其中包括源 AMI ID 以及创建时间和日期。  | 
|  InstanceType  |  字符串  |  (可选) 启动作为工作区主机的实例的类型。实例类型因区域而异。默认类型为 t2.micro。  | 
|  PreUpdateScript  |  字符串  |  (可选) 在应用更新前要运行的脚本的 URL。默认值 (\$1"none\$1") 不运行脚本。  | 
|  PostUpdateScript  |  字符串  |  (可选) 在应用软件包更新后要运行的脚本的 URL。默认值 (\$1"none\$1") 不运行脚本。  | 
|  IncludePackages  |  字符串  |  (可选) 仅更新这些指定的软件包。默认值 (\$1"all\$1") 将应用所有可用的更新。  | 
|  ExcludePackages  |  字符串  |  (可选) 在所有情况下从更新中排除的软件包的名称。默认值 (\$1"none\$1") 不排除任何软件包。  | 

**自动化步骤**  
`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 S3 下载更新脚本。
+ 运行可选的更新前脚本。
+ 更新分发软件包和 Amazon 软件。
+ 运行可选的更新后脚本。
执行日志存储在 /tmp 文件夹中，供用户以后查看。  
如果您希望升级特定软件包集，则可以使用 `IncludePackages` 参数提供列表。在提供时，系统仅尝试更新这些软件包及其依赖项。不执行任何其他更新。默认情况下，如果未指定*包含* 软件包，则程序将更新所有可用软件包。  
如果要在升级中排除特定软件包集，则可以向 `ExcludePackages` 参数提供列表。如果提供，这些软件包保持其当前版本，与任何其他指定的选项无关。默认情况下，在未指定任何*排除*软件包时，将不排除软件包。

**步骤 3：stopInstance（`aws:changeInstanceState` 操作）**  
此步骤停止已更新实例。

**步骤 4：createImage（`aws:createImage` 操作） **  
此步骤创建一个新 AMI，带有可将其链接到源 ID 和创建时间的描述性名称。例如：“EC2 自动化在 \$1\$1global:DATE\$1TIME\$1\$1 从 \$1\$1SourceAmiId\$1\$1 生成了 AMI”，其中 DATE\$1TIME 和 SourceID 表示自动化变量。

**步骤 5：terminateInstance（`aws:changeInstanceState` 操作） **  
此步骤通过终止正在运行的实例来清除执行过程。

**Output**  
自动化返回新的 AMI ID 作为输出。

**注意**  
默认情况下，当自动化运行 `AWS-UpdateLinuxAmi` 运行手册时，系统会在默认 VPC (172.30.0.0/16) 中创建一个临时实例。如果您删除了默认 VPC，会收到以下错误：  
`VPC not defined 400`  
要解决此问题，您必须复制 `AWS-UpdateLinuxAmi` 运行手册并指定子网 ID。有关更多信息，请参阅 [VPC not defined 400](automation-troubleshooting.md#automation-trbl-common-vpc)。

**使用自动化创建经过修补的 AMI (AWS Systems Manager)**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**执行自动化**。

1. 在**自动化文档**列表中，选择 `AWS-UpdateLinuxAmi`。

1. 在**文档详细信息**部分，验证**文档版本**是否设置为**运行时的默认版本**。

1. 选择**下一步**。

1. 在**执行模式**部分中，选择**简单执行**。

1. 在**输入参数**部分，输入在**开始前的准备工作**部分收集的信息。

1. 选择**执行**。控制台将显示自动化执行的状态。

在自动化完成后，请从更新后的 AMI 启动测试实例以验证更改。

**注意**  
如果自动化有任何步骤失败，**自动化执行**页面上会列出有关失败的信息。自动化设计为在成功完成所有任务后终止临时实例。如果步骤失败，系统可能不会终止实例。因此，如果某个步骤失败，请手动终止临时实例。

## 更新 Linux AMI（AWS CLI）
<a name="update-patch-linux-ami-cli"></a>

此 AWS Systems Manager 自动化演练介绍如何使用 AWS Command Line Interface (AWS CLI) 和 Systems Manager `AWS-UpdateLinuxAmi` 运行手册通过指定的最新版本软件包自动修补 Linux Amazon Machine Image (AMI)。Automation 是 AWS Systems Manager 中的一项工具。`AWS-UpdateLinuxAmi` 运行手册也能自动安装其他具体站点相关的软件包和配置。您可以使用该演练更新各种 Linux 分发版，包括 Ubuntu Server、Red Hat Enterprise Linux（RHEL）或 Amazon Linux AMIs。有关支持的 Linux 版本的完整列表，请参阅 [Patch Manager 先决条件](patch-manager-prerequisites.md)。

使用 `AWS-UpdateLinuxAmi` 运行手册可以自动完成映像维护任务，而无需使用 JSON 或 YAML 编写运行手册。您可以使用 `AWS-UpdateLinuxAmi` 运行手册执行以下类型的任务。
+ 在 Amazon Linux、RHEL 或 Ubuntu Server Amazon Machine Image（AMI）上升级所有分发版本程序包和 Amazon 软件。这是默认运行手册行为。
+ 在现有映像上安装 AWS Systems Manager SSM Agent 以启用 Systems Manager 功能，例如使用 AWS Systems Manager Run Command 的远程命令执行，或者使用 Inventory 的软件清单收集。
+ 安装其他软件包。

**开始前的准备工作**  
在您开始使用运行手册之前，请先为自动化配置角色和 EventBridge（后者可选）。有关更多信息，请参阅 [设置自动化](automation-setup.md)。此演练还要求您指定 AWS Identity and Access Management (IAM) 实例配置文件的名称。有关创建 IAM 实例配置文件的更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)。

`AWS-UpdateLinuxAmi` 运行手册接受以下输入参数。


****  

| 参数 | 类型 | 描述 | 
| --- | --- | --- | 
|  SourceAmiId  |  字符串  |  （必需）源 AMI ID。您可以使用 AWS Systems Manager Parameter Store *公有*参数自动引用最新的 Linux Amazon EC2 AMI ID。有关更多信息，请参阅[使用 AWS Systems Manager Parameter Store 查询最新 Amazon Linux AMI ID](https://aws.amazon.com/blogs/compute/query-for-the-latest-amazon-linux-ami-ids-using-aws-systems-manager-parameter-store/)。  | 
|  IamInstanceProfileName  |  字符串  |  （必需）您在[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)中创建的 IAM 实例配置文件角色的名称。实例配置文件角色为自动化提供在您实例上执行操作的权限，例如运行命令或启动和停止服务。运行手册仅使用实例配置文件角色的名称。  | 
|  AutomationAssumeRole  |  字符串  |  （必需）您在 [设置自动化](automation-setup.md) 中创建的 IAM 服务角色的名称。服务角色（也称为担任角色）为自动化提供权限，用于担任您的 IAM 角色和代表您执行操作。例如，在运行手册中运行 `aws:createImage` 操作时，服务角色允许自动化创建新的 AMI。对于此参数，必须指定完整的 ARN。  | 
|  TargetAmiName  |  字符串  |  （可选）新 AMI 在创建之后的名称。默认名称是系统生成的字符串，其中包括源 AMI ID 以及创建时间和日期。  | 
|  InstanceType  |  字符串  |  (可选) 启动作为工作区主机的实例的类型。实例类型因区域而异。默认类型为 t2.micro。  | 
|  PreUpdateScript  |  字符串  |  (可选) 在应用更新前要运行的脚本的 URL。默认值 (\$1"none\$1") 不运行脚本。  | 
|  PostUpdateScript  |  字符串  |  (可选) 在应用软件包更新后要运行的脚本的 URL。默认值 (\$1"none\$1") 不运行脚本。  | 
|  IncludePackages  |  字符串  |  (可选) 仅更新这些指定的软件包。默认值 (\$1"all\$1") 将应用所有可用的更新。  | 
|  ExcludePackages  |  字符串  |  (可选) 在所有情况下从更新中排除的软件包的名称。默认值 (\$1"none\$1") 不排除任何软件包。  | 

**自动化步骤**  
默认情况下，`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 自动化在 \$1\$1global:DATE\$1TIME\$1\$1 从 \$1\$1SourceAmiId\$1\$1 生成了 AMI”，其中 DATE\$1TIME 和 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](automation-troubleshooting.md#automation-trbl-common-vpc)。

**使用自动化创建经过修补的 AMI**

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 运行以下命令来运行 `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"
   }
   ```

1. 要使用 AWS CLI 查看自动化，请运行以下命令：

   ```
   aws ssm describe-automation-executions
   ```

1. 运行以下命令以查看有关运行手册进程的详细信息。将 *automation execution ID* 替换为您自己的信息。

   ```
   aws ssm get-automation-execution --automation-execution-id automation execution ID
   ```

   更新过程可能需要 30 分钟或者更久。
**注意**  
您也可以在控制台中监控自动化的状态。在列表中，选择您刚才运行的自动化，然后选择**步骤**选项卡。该选项卡将显示自动化操作的状态。

在自动化完成后，请从更新后的 AMI 启动测试实例以验证更改。

**注意**  
如果自动化有任何步骤失败，**自动化执行**页面上会列出有关失败的信息。自动化设计为在成功完成所有任务后终止临时实例。如果步骤失败，系统可能不会终止实例。因此，如果某个步骤失败，请手动终止临时实例。

# 更新 Windows Server AMI
<a name="automation-tutorial-update-patch-windows-ami"></a>

使用 `AWS-UpdateWindowsAmi` 运行手册可以在 Amazon Windows Amazon Machine Image (AMI) 上自动完成映像维护任务，而无需使用 JSON 或 YAML 编写工作流程。本运行手册在 Windows Server 2008 R2 或更高版本中受支持。您可以使用 `AWS-UpdateWindowsAmi` 运行手册执行以下类型的任务。
+ 安装所有 Windows 更新并升级 Amazon 软件 (默认行为)。
+ 安装特定 Windows 更新并升级 Amazon 软件。
+ 使用您的脚本自定义 AMI。

**开始前的准备工作**  
在开始使用运行手册之前，[为自动化配置角色](automation-setup-iam.md)以添加 `iam:PassRole` 策略，此策略引用要授予其访问权限的实例配置文件的 ARN。也可选择为 Automation（AWS Systems Manager 中的一项工具）配置 Amazon EventBridge。有关更多信息，请参阅 [设置自动化](automation-setup.md)。此演练还要求您指定 AWS Identity and Access Management (IAM) 实例配置文件的名称。有关创建 IAM 实例配置文件的更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)。

**注意**  
AWS Systems Manager SSM Agent 的更新通常会在不同时间向不同区域推广。自定义或更新 AMI 时，请仅使用为您工作所在的区域发布的源 AMI。这将确保您使用该区域发布的最新 SSM Agent并避免兼容性问题。

`AWS-UpdateWindowsAmi` 运行手册接受以下输入参数。


****  

| 参数 | 类型 | 说明 | 
| --- | --- | --- | 
|  SourceAmiId  |  字符串  |  （必需）源 AMI ID。您可以使用 Systems Manager Parameter Store *公有*参数自动引用最新的 Windows Server AMI ID。有关更多信息，请参阅[使用 AWS Systems ManagerParameter Store 查询最新的 Windows AMI ID](https://aws.amazon.com/blogs/mt/query-for-the-latest-windows-ami-using-systems-manager-parameter-store/)。  | 
|  SubnetId  |  字符串  |  （可选）要在其中启动临时实例的子网。如果您已删除默认 VPC，则必须为此参数指定值。  | 
|  IamInstanceProfileName  |  字符串  |  （必需）您在[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)中创建的 IAM 实例配置文件角色的名称。实例配置文件角色为自动化提供在您实例上执行操作的权限，例如运行命令或启动和停止服务。运行手册仅使用实例配置文件角色的名称。  | 
|  AutomationAssumeRole  |  字符串  |  （必需）您在 [设置自动化](automation-setup.md) 中创建的 IAM 服务角色的名称。服务角色（也称为担任角色）为自动化提供权限，用于担任您的 IAM 角色和代表您执行操作。例如，在运行手册中运行 `aws:createImage` 操作时，服务角色允许自动化创建新的 AMI。对于此参数，必须指定完整的 ARN。  | 
|  TargetAmiName  |  字符串  |  （可选）新 AMI 在创建之后的名称。默认名称是系统生成的字符串，其中包括源 AMI ID 以及创建时间和日期。  | 
|  InstanceType  |  字符串  |  (可选) 启动作为工作区主机的实例的类型。实例类型因区域而异。默认类型为 t2.medium。  | 
|  PreUpdateScript  |  字符串  |  (可选) 要在更新 AMI 之前运行的脚本。在运行手册中或在运行时输入脚本作为参数。  | 
|  PostUpdateScript  |  字符串  |  （可选）要在更新 AMI 之后运行的脚本。在运行手册中或在运行时输入脚本作为参数。  | 
|  IncludeKbs  |  字符串  |  (可选) 指定一个或多个要包括的 Microsoft 知识库 (KB) 文章 ID。可以使用逗号分隔值安装多个 ID。有效格式：KB9876543 或 9876543。  | 
|  ExcludeKbs  |  字符串  |  (可选) 指定一个或多个要排除的 Microsoft 知识库 (KB) 文章 ID。可以使用逗号分隔值排除多个 ID。有效格式：KB9876543 或 9876543。  | 
|  类别  |  字符串  |  (可选) 指定一个或多个更新类别。可以使用逗号分隔值筛选类别。选项：关键更新、安全更新、定义更新、Update Rollup、Service Pack、工具、更新或驱动程序。有效格式包括单个条目，例如：关键更新。或者，可以指定逗号分隔列表：关键更新,安全更新,定义更新。  | 
|  SeverityLevels  |  字符串  |  (可选) 指定一个或多个与更新关联的 MSRC 严重性级别。可以使用逗号分隔值筛选严重性级别。选项：关键、重要、低、中或未指定。有效格式包括单个条目，例如：关键。或者，可以指定逗号分隔列表：关键,重要,低。  | 

**自动化步骤**  
默认情况下，`AWS-UpdateWindowsAmi` 运行手册包括以下步骤。

**步骤 1：launchInstance（`aws:runInstances` 操作）**  
此步骤以从指定的 `SourceAmiID` 启动一个具有 IAM 实例配置文件角色的实例。

**步骤 2：runPreUpdateScript（`aws:runCommand` 操作）**  
此步骤可让您以字符串形式指定一个在安装更新前运行的脚本。

**步骤 3：更新 EC2Config（`aws:runCommand` 操作）**  
此步骤使用 `AWS-InstallPowerShellModule` 运行手册下载 AWS 共有 PowerShell 模块。Systems Manager 使用 SHA-256 哈希验证模块的完整性。然后，Systems Manager 将检查操作系统，以确定是更新 EC2Config 还是 EC2Launch。EC2Config 通过 Windows Server 2012 R2 在 Windows Server 2008 R2 上运行。EC2Launch 在 Windows Server 2016 上运行。

**步骤 4：updateSSMAgent（`aws:runCommand`操作）**  
此步骤通过使用 `AWS-UpdateSSMAgent` 运行手册更新 SSM Agent。

**步骤 5：updateAWSPVDriver（`aws:runCommand`操作）**  
此步骤通过使用 `AWS-ConfigureAWSPackage` 运行手册更新 AWS PV 驱动程序。

**步骤 6：updateAwsEnaNetworkDriver（`aws:runCommand`操作）**  
此步骤通过使用 `AWS-ConfigureAWSPackage` 运行手册更新 AWS ENA 网络驱动程序。

**步骤 7：installWindowsUpdates（`aws:runCommand` 操作） **  
此步骤使用 `AWS-InstallWindowsUpdates` 运行手册安装 Windows 更新。默认情况下，Systems Manager 搜索并安装任何缺失的更新。可以通过指定下列参数之一更改默认行为：`IncludeKbs`、`ExcludeKbs`、`Categories` 或 `SeverityLevels`。

**步骤 8：runPostUpdateScript（`aws:runCommand` 操作)**  
此步骤可让您以字符串形式指定一个在安装更新后运行的脚本。

**步骤 9：runSysprepGeneralize（`aws:runCommand` 操作) **  
此步骤使用 `AWS-InstallPowerShellModule` 运行手册下载 AWS 共有 PowerShell 模块。Systems Manager 使用 SHA-256 哈希验证模块的完整性。然后 Systems Manager 使用 AWS 支持的方法针对 EC2Launch (Windows Server 2016) 或 EC2Config（Windows Server 2008 R2 到 2012 R2）运行 sysprep。

**步骤 10：stopInstance（`aws:changeInstanceState` 操作） **  
此步骤停止已更新实例。

**步骤 11：createImage（`aws:createImage` 操作） **  
此步骤创建一个新 AMI，带有可将其链接到源 ID 和创建时间的描述性名称。例如：“EC2自动化在 \$1\$1global:DATE\$1TIME\$1\$1 从 \$1\$1SourceAmiId\$1\$1 生成了 AMI”，其中 DATE\$1TIME 和 SourceID 表示自动化变量。

**步骤 12：TerminateInstance（`aws:changeInstanceState` 操作） **  
此步骤通过终止正在运行的实例来清除自动化。

**Output**  
此部分可让您将各个步骤的输出或任何参数的值指定为自动化输出。默认情况下，输出是由执行创建的已更新 Windows AMI 的 ID。

**注意**  
默认情况下，当自动化运行 `AWS-UpdateWindowsAmi` 运行手册并创建一个临时实例时，系统会使用默认 VPC (172.30.0.0/16)。如果您删除了默认 VPC，会收到以下错误：  
VPC not defined 400  
要解决此问题，您必须复制 `AWS-UpdateWindowsAmi` 运行手册并指定子网 ID。有关更多信息，请参阅 [VPC not defined 400](automation-troubleshooting.md#automation-trbl-common-vpc)。

**使用自动化创建经过修补的 Windows AMI**

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 运行以下命令来运行 `AWS-UpdateWindowsAmi` 运行手册。将每个*示例资源占位符*替换为您自己的信息。以下示例命令使用的是最新的 Amazon EC2 AMI，以最大限度减少需应用的补丁数量。如果您多次运行此命令，则必须为 `targetAMIname` 指定唯一的值。AMI 名称必须唯一。

   ```
   aws ssm start-automation-execution \
       --document-name="AWS-UpdateWindowsAmi" \
       --parameters SourceAmiId='AMI ID',IamInstanceProfileName='IAM instance profile',AutomationAssumeRole='arn:aws:iam::{{global:ACCOUNT_ID}}:role/AutomationServiceRole'
   ```

   该命令将会返回执行 ID。请将该 ID 复制到剪贴板。您将使用该 ID 查看自动化的状态。

   ```
   {
       "AutomationExecutionId": "automation execution ID"
   }
   ```

1. 要使用 AWS CLI 查看自动化，请运行以下命令：

   ```
   aws ssm describe-automation-executions
   ```

1. 要查看有关自动化进程的详细信息，请运行以下命令。

   ```
   aws ssm get-automation-execution 
       --automation-execution-id automation execution ID
   ```

**注意**  
根据应用的补丁数量，在该示例自动化中运行的 Windows 修补过程可能需要 30 分钟或更长时间才能完成。

# 使用 Automation、AWS Lambda 和 Parameter Store 来更新黄金 AMI
<a name="automation-tutorial-update-patch-golden-ami"></a>

以下示例使用组织维护和定期修补自己专有 AMIs 的模型，而非构建自 Amazon Elastic Compute Cloud (Amazon EC2) AMIs。

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

**开始前的准备工作**  
配置自动化角色以及（可选）为自动化配置 Amazon EventBridge。有关更多信息，请参阅 [设置自动化](automation-setup.md)。

**Topics**
+ [任务 1：在 Systems Manager Parameter Store 中创建一个参数](#create-parameter-ami)
+ [任务 2：为 AWS Lambda 创建 IAM 角色](#create-lambda-role)
+ [任务 3：创建 AWS Lambda 函数](#create-lambda-function)
+ [任务 4：创建运行手册并修补 AMI](#create-custom-ami-update-runbook)

## 任务 1：在 Systems Manager Parameter Store 中创建一个参数
<a name="create-parameter-ami"></a>

在 Parameter Store 中创建一个使用以下信息的字符串参数：
+ **名称**：`latestAmi`。
+ **值**：AMI ID。例如：` ami-188d6e0e`。

有关如何创建 Parameter Store 字符串参数的信息，请参阅 [在 Systems Manager 中创建 Parameter Store 参数](sysman-paramstore-su-create.md)。

## 任务 2：为 AWS Lambda 创建 IAM 角色
<a name="create-lambda-role"></a>

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

**为 Lambda 创建 IAM 服务角色**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中选择**策略**，然后选择**创建策略**。

1. 选择 **JSON** 选项卡。

1. 将默认内容替换为以下策略。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "logs:CreateLogGroup",
               "Resource": "arn:aws:logs:us-east-1:111122223333:*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "logs:CreateLogStream",
                   "logs:PutLogEvents"
               ],
               "Resource": [
                   "arn:aws:logs:us-east-1:111122223333:log-group:/aws/lambda/function name:*"
               ]
           }
       ]
   }
   ```

------

1. 选择**下一步：标签**。

1. （可选）添加一个或多个标签键值对，以组织、跟踪或控制此策略的访问权限。

1. 选择**下一步：审核**。

1. 在**查看策略**页面上，对于**名称**，输入内联策略的名称，例如 **amiLambda**。

1. 选择**创建策略**。

1. 重复步骤 2 和 3。

1. 粘贴以下策略。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:PutParameter",
               "Resource": "arn:aws:ssm:us-east-1:111122223333:parameter/latestAmi"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:DescribeParameters",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 选择**下一步：标签**。

1. （可选）添加一个或多个标签键值对，以组织、跟踪或控制此策略的访问权限。

1. 选择**下一步：审核**。

1. 在**查看策略**页面上，对于**名称**，输入内联策略的名称，例如 **amiParameter**。

1. 选择**创建策略**。

1. 在导航窗格中，选择 **Roles（角色）**，然后选择 **Create role（创建角色）**。

1. 直接在**使用案例**下，选择 **Lambda**，然后选择**下一步**。

1. 在**添加权限**页面上，使用**搜索**字段查找之前创建的两个策略。

1. 选中策略旁边的复选框，然后选择**下一步**。

1. 对于**角色名称**，请输入新角色的名称，如 **lambda-ssm-role**或所需其他名称。
**注意**  
由于多个实体可能引用该角色，因此创建角色后无法更改角色的名称。

1. （可选）添加一个或多个标签键值对，以组织、追踪或控制对此角色的访问，然后选择**创建角色**。

## 任务 3：创建 AWS Lambda 函数
<a name="create-lambda-function"></a>

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

**创建 Lambda 函数**

1. 通过以下网址登录 AWS 管理控制台 并打开 AWS Lambda 控制台：[https://console.aws.amazon.com/lambda/](https://console.aws.amazon.com/lambda/)。

1. 选择**创建函数**。

1. 在**创建函数**页面上，选择**从头开始创作**。

1. 对于**函数名称**，请输入 **Automation-UpdateSsmParam**。

1. 对于**运行时系统**，选择 **Python 3.11**。

1. 对于**架构**，选择 Lambda 用于运行该函数的计算机处理器类型，即 **x86\$164** 或 **arm64**，

1. 在**权限**部分中，展开**更改默认执行角色**。

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

1. 选择**创建函数**。

1. 在**代码源**区域中的 **lambda\$1function** 选项卡上，删除该字段中的预填充代码，然后粘贴以下代码示例。

   ```
   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
           )
           
       responseString = 'Updated parameter %s with value %s.' % (event['parameterName'], event['parameterValue'])
           
       return responseString
   ```

1. 依次选择**文件、保存**。

1. 要测试 Lambda 函数，请从**测试**菜单中选择**配置测试事件**。

1. 对于**事件名称**，输入测试事件的名称，如 **MyTestEvent**。

1. 使用以下 JSON 替换现有文本。将 *AMI ID* 替换为您自己的信息来设置 `latestAmi` 参数值。

   ```
   {
      "parameterName":"latestAmi",
      "parameterValue":"AMI ID"
   }
   ```

1. 选择**保存**。

1. 选择**测试**以测试该函数。在**执行结果**选项卡上，应将状态报告为**已成功**，以及有关更新的其他详细信息。

## 任务 4：创建运行手册并修补 AMI
<a name="create-custom-ami-update-runbook"></a>

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

**创建运行手册并运行**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 对于**创建文档**，选择**自动化**。

1. 对于**名称**，请输入 **UpdateMyLatestWindowsAmi**。

1. 选择**编辑器**选项卡，然后选择**编辑**。

1. 当系统提示时，选择**确定**。

1. 在**文档编辑器**字段中，将默认内容替换为以下 YAML 示例运行手册内容。

   ```
   ---
   description: Systems Manager Automation Demo - Patch AMI and Update ASG
   schemaVersion: '0.3'
   assumeRole: '{{ AutomationAssumeRole }}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to execute this document.'
       default: ''
     SourceAMI:
       type: String
       description: The ID of the AMI you want to patch.
       default: '{{ ssm:latestAmi }}'
     SubnetId:
       type: String
       description: The ID of the subnet where the instance from the SourceAMI parameter is launched.
     SecurityGroupIds:
       type: StringList
       description: The IDs of the security groups to associate with the instance that's launched from the SourceAMI parameter.
     NewAMI:
       type: String
       description: The name of of newly patched AMI.
       default: 'patchedAMI-{{global:DATE_TIME}}'
     InstanceProfile:
       type: String
       description: The name of the IAM instance profile you want the source instance to use.
     SnapshotId:
       type: String
       description: (Optional) The snapshot ID to use to retrieve a patch baseline snapshot.
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: (Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.
       allowedValues:
         - Install
         - Scan
       default: Install
   mainSteps:
     - name: startInstances
       action: 'aws:runInstances'
       timeoutSeconds: 1200
       maxAttempts: 1
       onFailure: Abort
       inputs:
         ImageId: '{{ SourceAMI }}'
         InstanceType: m5.large
         MinInstanceCount: 1
         MaxInstanceCount: 1
         IamInstanceProfileName: '{{ InstanceProfile }}'
         SubnetId: '{{ SubnetId }}'
         SecurityGroupIds: '{{ SecurityGroupIds }}'
     - name: verifyInstanceManaged
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 600
       inputs:
         Service: ssm
         Api: DescribeInstanceInformation
         InstanceInformationFilterList:
           - key: InstanceIds
             valueSet:
               - '{{ startInstances.InstanceIds }}'
         PropertySelector: '$.InstanceInformationList[0].PingStatus'
         DesiredValues:
           - Online
       onFailure: 'step:terminateInstance'
     - name: installPatches
       action: 'aws:runCommand'
       timeoutSeconds: 7200
       onFailure: Abort
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
     - 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: '{{ NewAMI }}'
         NoReboot: false
         ImageDescription: Patched AMI created by 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
   ```

1. 选择**创建自动化**。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在 **Choose document**（选择文档）页面上，选择 **Owned by me**（我拥有的）选项卡。

1. 搜索 **UpdateMyLatestWindowsAmi** 运行手册，然后选择 **UpdateMyLatestWindowsAmi** 卡中的按钮。

1. 选择**下一步**。

1. 选择**简单执行**。

1. 指定输入参数的值。

1. 选择**执行**。

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

# 使用 Automation 和 Jenkins 更新 AMIs
<a name="automation-tutorial-update-patch-ami-jenkins-integration"></a>

如果组织在 CI/CD 管道中使用 Jenkins 软件，则可以添加 Automation 作为构建后步骤，用于将应用程序发行版预安装到 Amazon Machine Images（AMIs）中。Automation 是 AWS Systems Manager 中的一项工具。您还可以使用 Jenkins 计划功能来调用 Automation 并创建自己的操作系统（OS）修补计划。

以下示例显示如何从运行在本地或 Amazon Elastic Compute Cloud（Amazon EC2）上的 Jenkins 服务器调用 Automation。对于身份验证，Jenkins 服务器使用 AWS 凭证，该凭证基于您在示例中创建并附加到实例配置文件的 IAM 策略。

**注意**  
配置实例时，请务必遵循 Jenkins 安全最佳实践。

**开始前的准备工作**  
在配置 Automation 用于 Jenkins 之前，请完成以下任务：
+ 完成 [使用 Automation、AWS Lambda 和 Parameter Store 来更新黄金 AMI](automation-tutorial-update-patch-golden-ami.md) 示例。以下示例使用在该示例中创建的 **UpdateMyLatestWindowsAmi** 运行手册。
+ 为自动化配置 IAM 角色。Systems Manager 需要实例配置文件角色和服务角色 ARN 来处理自动化。有关更多信息，请参阅 [设置自动化](automation-setup.md)。

**为 Jenkins 服务器创建 IAM 策略**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中选择**策略**，然后选择**创建策略**。

1. 选择 **JSON** 选项卡。

1. 将每个*示例资源占位符*替换为您自己的信息。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "ssm:StartAutomationExecution",
               "Resource": [
                   "arn:aws:ssm:us-east-1:111122223333:document/UpdateMyLatestWindowsAmi",
                   "arn:aws:ssm:us-east-1:111122223333:automation-execution/*"
               ]
           }
       ]
   }
   ```

------

1. 选择**查看策略**。

1. 在**查看策略**页面上，对于**名称**，输入内联策略的名称，例如 **JenkinsPolicy**。

1. 选择**创建策略**。

1. 在导航窗格中，选择**角色**。

1. 选择附加到 Jenkins 服务器的实例配置文件。

1. 在**权限**选项卡中，选择**添加权限**，然后选择**附加策略**。

1. 在**其他权限策略**部分中，输入您在之前步骤中创建的策略名称。例如，**JenkinsPolicy**。

1. 选中您的策略旁边的复选框，然后选择**附加策略**。

按照以下过程在 Jenkins 服务器上配置 AWS CLI。

**为 Automation 配置 Jenkins 服务器**

1. 使用首选浏览器连接到 8080 端口上的 Jenkins 服务器，以便访问管理界面。

1. 输入 `/var/lib/jenkins/secrets/initialAdminPassword` 在中找到的密码。要显示您的密码，请运行以下命令。

   ```
   sudo cat /var/lib/jenkins/secrets/initialAdminPassword
   ```

1. Jenkins 安装脚本会将您引导到**自定义 Jenkins** 页面。选择**安装建议的插件**。

1. 安装完成后，依次选择**管理员凭证**、**保存凭证**、**开始使用 Jenkins**。

1. 在左侧导航窗格中，选择**管理 Jenkins**，然后选择**管理插件**。

1. 选**可用**选项卡，然后输入 **Amazon EC2 plugin**。

1. 选中 **Amazon EC2 plugin** 的复选框，然后选择**安装但不重新启动**。

1. 安装完成后，选择**返回首页**。

1. 选择**管理 Jenkins**，然后选择**管理节点和云**。

1. 在**配置云**部分中，选择**添加新云**，然后选择 **Amazon EC2**。

1. 在其余字段中输入您的信息。确保选择**使用 EC2 实例配置文件获取凭证**选项。

按照以下过程配置 Jenkins 项目来调用 Automation。

**配置 Jenkins 服务器来调用 Automation**

1. 在 Web 浏览器中打开 Jenkins 控制台。

1. 选择要配置用于自动化的项目，然后选择**配置**。

1. 在**构建**选项卡上，选择**添加构建步骤**。

1. 选择**执行 shell** 或**执行 Windows 批命令**（具体取决于您的操作系统)。

1. 在 **Command**（命令）字段中，运行 AWS CLI 命令，如下所示。将每个*示例资源占位符*替换为您自己的信息。

   ```
   aws ssm start-automation-execution \
           --document-name runbook name \
           --region AWS 区域 of your source AMI \
           --parameters runbook parameters
   ```

   以下示例命令使用 **UpdateMyLatestWindowsAmi** 运行手册以及在 [使用 Automation、AWS Lambda 和 Parameter Store 来更新黄金 AMI](automation-tutorial-update-patch-golden-ami.md) 中创建的 Systems Manager 参数 `latestAmi`：

   ```
   aws ssm start-automation-execution \
           --document-name UpdateMyLatestWindowsAmi \
           --parameters \
               "sourceAMIid='{{ssm:latestAmi}}'"
           --region region
   ```

   在 Jenkins 中，命令类似于以下屏幕截图中的示例。  
![\[Jenkins 软件中的示例命令。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/sysman-ami-jenkins2.png)

1. 在 Jenkins 项目中，选择**立即构建**。Jenkins 会返回类似于以下示例的输出。  
![\[Jenkins 软件中的示例命令输出。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/sysman-ami-jenkins.png)

# 更新自动扩缩组的 AMIs
<a name="automation-tutorial-update-patch-windows-ami-autoscaling"></a>

以下示例使用新修补的 AMI 更新自动扩缩组。此方法确保新映像自动可供使用 Auto Scaling 组的不同计算环境使用。

此示例中自动化的最后一步使用 Python 函数创建将使用新修补的 AMI 的新启动模板。然后更新自动扩缩组以使用新的启动模板。在此类型的 Auto Scaling 方案中，用户可以终止 Auto Scaling 组中的现有实例以强制启动使用新映像的实例。或者，用户可以等待以允许缩减或扩展事件正常启动较新的实例。

**开始前的准备工作**  
在开始本示例之前，请完成以下任务。
+ 为 Automation（AWS Systems Manager 中的一项工具）配置 IAM 角色。Systems Manager 需要实例配置文件角色和服务角色 ARN 来处理自动化。有关更多信息，请参阅 [设置自动化](automation-setup.md)。

## 创建 **PatchAMIAndUpdateASG** 运行手册
<a name="create-autoscaling-update-runbook"></a>

使用以下过程创建 **PatchAMIAndUpdateASG** 运行手册，它将修补您为 **SourceAMI** 参数指定的 AMI。运行手册还会更新自动扩缩组以使用最新修补后的 AMI。

**创建运行手册并运行**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在**创建文档**下拉菜单中，选择**自动化**。

1. 在**名称**字段中，输入 **PatchAMIAndUpdateASG**。

1. 选择 **Editor**（编辑器）选项卡，然后选择 **Edit**（编辑）。

1. 出现提示时选择 **OK**（确定），然后删除 **Document editor**（文档编辑器）字段中的内容。

1. 在 **Document editor**（文档编辑器）字段中，粘贴以下 YAML 示例运行手册内容。

   ```
   ---
   description: Systems Manager Automation Demo - Patch AMI and Update ASG
   schemaVersion: '0.3'
   assumeRole: '{{ AutomationAssumeRole }}'
   parameters:
     AutomationAssumeRole:
       type: String
       description: '(Required) The ARN of the role that allows Automation to perform the actions on your behalf. If no role is specified, Systems Manager Automation uses your IAM permissions to execute this document.'
       default: ''
     SourceAMI:
       type: String
       description: '(Required) The ID of the AMI you want to patch.'
     SubnetId:
       type: String
       description: '(Required) The ID of the subnet where the instance from the SourceAMI parameter is launched.'
     SecurityGroupIds:
       type: StringList
       description: '(Required) The IDs of the security groups to associate with the instance launched from the SourceAMI parameter.'
     NewAMI:
       type: String
       description: '(Optional) The name of of newly patched AMI.'
       default: 'patchedAMI-{{global:DATE_TIME}}'
     TargetASG:
       type: String
       description: '(Required) The name of the Auto Scaling group you want to update.'
     InstanceProfile:
       type: String
       description: '(Required) The name of the IAM instance profile you want the source instance to use.'
     SnapshotId:
       type: String
       description: (Optional) The snapshot ID to use to retrieve a patch baseline snapshot.
       default: ''
     RebootOption:
       type: String
       description: '(Optional) Reboot behavior after a patch Install operation. If you choose NoReboot and patches are installed, the instance is marked as non-compliant until a subsequent reboot and scan.'
       allowedValues:
         - NoReboot
         - RebootIfNeeded
       default: RebootIfNeeded
     Operation:
       type: String
       description: (Optional) The update or configuration to perform on the instance. The system checks if patches specified in the patch baseline are installed on the instance. The install operation installs patches missing from the baseline.
       allowedValues:
         - Install
         - Scan
       default: Install
   mainSteps:
     - name: startInstances
       action: 'aws:runInstances'
       timeoutSeconds: 1200
       maxAttempts: 1
       onFailure: Abort
       inputs:
         ImageId: '{{ SourceAMI }}'
         InstanceType: m5.large
         MinInstanceCount: 1
         MaxInstanceCount: 1
         IamInstanceProfileName: '{{ InstanceProfile }}'
         SubnetId: '{{ SubnetId }}'
         SecurityGroupIds: '{{ SecurityGroupIds }}'
     - name: verifyInstanceManaged
       action: 'aws:waitForAwsResourceProperty'
       timeoutSeconds: 600
       inputs:
         Service: ssm
         Api: DescribeInstanceInformation
         InstanceInformationFilterList:
           - key: InstanceIds
             valueSet:
               - '{{ startInstances.InstanceIds }}'
         PropertySelector: '$.InstanceInformationList[0].PingStatus'
         DesiredValues:
           - Online
       onFailure: 'step:terminateInstance'
     - name: installPatches
       action: 'aws:runCommand'
       timeoutSeconds: 7200
       onFailure: Abort
       inputs:
         DocumentName: AWS-RunPatchBaseline
         Parameters:
           SnapshotId: '{{SnapshotId}}'
           RebootOption: '{{RebootOption}}'
           Operation: '{{Operation}}'
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
     - 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: '{{ NewAMI }}'
         NoReboot: false
         ImageDescription: Patched AMI created by Automation
     - name: terminateInstance
       action: 'aws:changeInstanceState'
       maxAttempts: 1
       onFailure: Continue
       inputs:
         InstanceIds:
           - '{{ startInstances.InstanceIds }}'
         DesiredState: terminated
     - name: updateASG
       action: 'aws:executeScript'
       timeoutSeconds: 300
       maxAttempts: 1
       onFailure: Abort
       inputs:
         Runtime: python3.11
         Handler: update_asg
         InputPayload:
           TargetASG: '{{TargetASG}}'
           NewAMI: '{{createImage.ImageId}}'
         Script: |-
           from __future__ import print_function
           import datetime
           import json
           import time
           import boto3
   
           # create auto scaling and ec2 client
           asg = boto3.client('autoscaling')
           ec2 = boto3.client('ec2')
   
           def update_asg(event, context):
               print("Received event: " + json.dumps(event, indent=2))
   
               target_asg = event['TargetASG']
               new_ami = event['NewAMI']
   
               # get object for the ASG we're going to update, filter by name of target ASG
               asg_query = asg.describe_auto_scaling_groups(AutoScalingGroupNames=[target_asg])
               if 'AutoScalingGroups' not in asg_query or not asg_query['AutoScalingGroups']:
                   return 'No ASG found matching the value you specified.'
   
               # gets details of an instance from the ASG that we'll use to model the new launch template after
               source_instance_id = asg_query.get('AutoScalingGroups')[0]['Instances'][0]['InstanceId']
               instance_properties = ec2.describe_instances(
                   InstanceIds=[source_instance_id]
               )
               source_instance = instance_properties['Reservations'][0]['Instances'][0]
   
               # create list of security group IDs
               security_groups = []
               for group in source_instance['SecurityGroups']:
                   security_groups.append(group['GroupId'])
   
               # create a list of dictionary objects for block device mappings
               mappings = []
               for block in source_instance['BlockDeviceMappings']:
                   volume_query = ec2.describe_volumes(
                       VolumeIds=[block['Ebs']['VolumeId']]
                   )
                   volume_details = volume_query['Volumes']
                   device_name = block['DeviceName']
                   volume_size = volume_details[0]['Size']
                   volume_type = volume_details[0]['VolumeType']
                   device = {'DeviceName': device_name, 'Ebs': {'VolumeSize': volume_size, 'VolumeType': volume_type}}
                   mappings.append(device)
   
               # create new launch template using details returned from instance in the ASG and specify the newly patched AMI
               time_stamp = time.time()
               time_stamp_string = datetime.datetime.fromtimestamp(time_stamp).strftime('%m-%d-%Y_%H-%M-%S')
               new_template_name = f'{new_ami}_{time_stamp_string}'
               try:
                   ec2.create_launch_template(
                       LaunchTemplateName=new_template_name,
                       LaunchTemplateData={
                           'BlockDeviceMappings': mappings,
                           'ImageId': new_ami,
                           'InstanceType': source_instance['InstanceType'],
                           'IamInstanceProfile': {
                               'Arn': source_instance['IamInstanceProfile']['Arn']
                           },
                           'KeyName': source_instance['KeyName'],
                           'SecurityGroupIds': security_groups
                       }
                   )
               except Exception as e:
                   return f'Exception caught: {str(e)}'
               else:
                   # update ASG to use new launch template
                   asg.update_auto_scaling_group(
                       AutoScalingGroupName=target_asg,
                       LaunchTemplate={
                           'LaunchTemplateName': new_template_name
                       }
                   )
                   return f'Updated ASG {target_asg} with new launch template {new_template_name} which uses AMI {new_ami}.'
   outputs:
   - createImage.ImageId
   ```

1. 选择**创建自动化**。

1. 在导航窗格中，选择**自动化**，然后选择**执行自动化**。

1. 在 **Choose document**（选择文档）页面上，选择 **Owned by me**（我拥有的）选项卡。

1. 搜索 **PatchAMIAndUpdateASG** 运行手册，然后选择 **PatchAMIAndUpdateASG** 卡中的按钮。

1. 选择**下一步**。

1. 选择**简单执行**。

1. 指定输入参数的值。确保您指定的 `SubnetId` 和 `SecurityGroupIds` 允许访问公有 Systems Manager 端点或 Systems Manager 的接口端点。

1. 选择**执行**。

1. 自动化完成后，在 Amazon EC2 控制台中，选择 **Auto Scaling**（自动扩缩），然后选择 **Launch Templates**（启动配置）。验证您是否看到了新的启动模板，并且它使用了新的 AMI。

1. 选择 **Auto Scaling**，然后选择 **Auto Scaling 组**。验证自动扩缩组使用了新的启动模板。

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

# 使用 AWS 支持 自助服务运行手册
<a name="automation-tutorial-support-runbooks"></a>

本部分介绍如何使用由 AWS 支持 团队创建的自助自动化。这些自动化可帮助您管理 AWS 的资源。

**支持自动化工作流**  
Support Workflows (SAW) 是由 AWS 支持 团队撰写并维护的自动化运行手册。这些运行手册帮助您对有关 AWS 资源的常见问题进行故障排除，主动监控和识别网络问题，收集和分析日志，等等。

SAW 运行手册使用 **`AWSSupport`** 前缀 例如 [https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-activatewindowswithamazonlicense.html](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awssupport-activatewindowswithamazonlicense.html)。

此外,具有 Business Support\$1 及更高 AWS Support 计划的客户还可以访问使用 **`AWSPremiumSupport`** 前缀的运行手册。例如 [https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awspremiumsupport-troubleshootEC2diskusage.html](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-awspremiumsupport-troubleshootEC2diskusage.html)。

如需了解关于 AWS 支持 的更多信息，请参阅 [AWS 支持 入门](https://docs.aws.amazon.com/awssupport/latest/user/getting-started.html)。

**Topics**
+ [在无法访问的实例上运行 EC2Rescue 工具](automation-ec2rescue.md)
+ [在 EC2 实例上重置密码和 SSH 密钥](automation-ec2reset.md)

# 在无法访问的实例上运行 EC2Rescue 工具
<a name="automation-ec2rescue"></a>

EC2Rescue 可以帮助您诊断有关 Linux 和 Windows Server 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例的问题并进行故障排除。您可以手动运行工具，如[使用适用于 Linux Server 的 EC2Rescue](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Linux-Server-EC2Rescue.html) 和[使用适用于 Windows Server 的 EC2Rescue](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/Windows-Server-EC2Rescue.html)。或者，您也可以使用 Systems Manager 自动化和 **`AWSSupport-ExecuteEC2Rescue`** 运行手册。Automation 是 AWS Systems Manager 中的一项工具。**`AWSSupport-ExecuteEC2Rescue`** 运行手册旨在全面执行 Systems Manager 的操作、CloudFormation 的操作和 Lambda 功能，从而将使用 EC2Rescue 通常所需的步骤自动化。

您可以使用 **`AWSSupport-ExecuteEC2Rescue`** 运行手册，对不同类型的操作系统 (OS) 问题进行故障排除和潜在修复。不支持带有加密根卷的实例。有关完整列表，请参阅以下主题：

**Windows**：请参阅*将适用于 Windows Server 的 EC2Rescue 与命令行配合使用*中的[抢救操作](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2rw-cli.html#ec2rw-rescue)。

**Linux** 和 **macOS**：一些适用于 Linux 的 EC2Rescue 模块会检测并尝试修复问题。有关更多信息，请参阅 GitHub 上各个模块的 [https://github.com/awslabs/aws-ec2rescue-linux/tree/master/docs](https://github.com/awslabs/aws-ec2rescue-linux/tree/master/docs) 文档。

## 工作原理
<a name="automation-ec2rescue-how"></a>

如下文所示，使用自动化和 **`AWSSupport-ExecuteEC2Rescue`** 运行手册对实例进行故障排除：
+ 您为无法访问的实例指定 ID 并启动运行手册。
+ 系统创建一个临时 VPC，然后运行一系列 Lambda 函数以配置该 VPC。
+ 系统在与您的原始实例相同的可用区内为您的临时 VPC 标识一个子网。
+ 系统启动一个临时的启用了 SSM 的 帮助程序实例。
+ 系统停止您的原始实例并创建备份。然后，它将原始根卷附加到帮助程序实例。
+ 系统使用 Run Command 在帮助程序实例上运行 EC2Rescue。EC2Rescue 识别并尝试修复有关已附加的原始根卷的问题。完成后，EC2Rescue 重新将根卷附加回原始实例。
+ 系统重启您的原始实例，并终止临时实例。系统也将终止临时 VPC 和在自动化开始时创建的 Lambda 函数。

## 开始前的准备工作
<a name="automation-ec2rescue-begin"></a>

运行以下自动化之前，请执行以下操作：
+ 复制无法访问的实例的实例 ID。您将在过程中指定此 ID。
+ (可选) 收集无法访问实例所在可用区中子网的 ID。EC2Rescue 实例将在此子网中创建。如果不指定子网，自动化会在您的 AWS 账户中创建新建一个临时 VPC。验证您的 AWS 账户是否至少有一个可用 VPC。默认情况下，一个区域中可以创建 5 个 VPC。如果您已在该区域中创建 5 个 VPC，自动化将会失败，但不会对您的实例进行更改。有关 Amazon VPC 配额的更多信息，请参阅 *Amazon VPC 用户指南*中的 [VPC 和子网](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-vpcs-subnets)。
+ 或者，您可以为自动化创建并指定一个 AWS Identity and Access Management (IAM) 角色。如果您不指定此角色，自动化将在运行自动化的用户的环境中运行。

### 向 `AWSSupport-EC2Rescue` 授予在您的实例上执行操作的权限
<a name="automation-ec2rescue-access"></a>

在自动化执行期间，EC2Rescue 需要权限才能在您的实例上执行一系列操作。这些操作调用 AWS Lambda、IAM 和 Amazon EC2 服务，安全地尝试修复实例的问题。如果您在 AWS 账户 和/或 VPC 中具有管理员级权限，您可能能够在不按照本部分中所述配置权限的情况下运行自动化。如果您没有管理员级权限，则您或管理员必须使用以下选项之一配置权限。
+ [使用 IAM policy 授予权限](#automation-ec2rescue-access-iam)
+ [使用 CloudFormation 模板授予权限](#automation-ec2rescue-access-cfn)

#### 使用 IAM policy 授予权限
<a name="automation-ec2rescue-access-iam"></a>

您可以将以下 IAM policy 作为内联策略附加到您的用户、组或角色；也可以创建新的 IAM 托管策略，并将其附加到您的用户、组或角色。有关将内联策略添加到您的用户、组或角色的更多信息，请参阅[使用内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html)。有关创建新的托管策略的更多信息，请参阅[使用托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html)。

**注意**  
如果创建新的 IAM 托管式策略，则还必须将 **AmazonSSMAutomationRole** 托管式策略附加到该策略，以便实例与 Systems Manager API 通信。

**适用于 AWSSupport-EC2Rescue 的 IAM policy**

将 *account ID* 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "lambda:InvokeFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunction"
            ],
            "Resource": "arn:aws:lambda:*:111122223333:function:AWSSupport-EC2Rescue-*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::awssupport-ssm.*/*.template",
                "arn:aws:s3:::awssupport-ssm.*/*.zip"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:CreateRole",
                "iam:CreateInstanceProfile",
                "iam:GetRole",
                "iam:GetInstanceProfile",
                "iam:PutRolePolicy",
                "iam:DetachRolePolicy",
                "iam:AttachRolePolicy",
                "iam:PassRole",
                "iam:AddRoleToInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:DeleteInstanceProfile"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/AWSSupport-EC2Rescue-*",
                "arn:aws:iam::111122223333:instance-profile/AWSSupport-EC2Rescue-*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "lambda:CreateFunction",
                "ec2:CreateVpc",
                "ec2:ModifyVpcAttribute",
                "ec2:DeleteVpc",
                "ec2:CreateInternetGateway",
                "ec2:AttachInternetGateway",
                "ec2:DetachInternetGateway",
                "ec2:DeleteInternetGateway",
                "ec2:CreateSubnet",
                "ec2:DeleteSubnet",
                "ec2:CreateRoute",
                "ec2:DeleteRoute",
                "ec2:CreateRouteTable",
                "ec2:AssociateRouteTable",
                "ec2:DisassociateRouteTable",
                "ec2:DeleteRouteTable",
                "ec2:CreateVpcEndpoint",
                "ec2:DeleteVpcEndpoints",
                "ec2:ModifyVpcEndpoint",
                "ec2:Describe*",
                "autoscaling:DescribeAutoScalingInstances"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

#### 使用 CloudFormation 模板授予权限
<a name="automation-ec2rescue-access-cfn"></a>

CloudFormation 使用预配置模板自动化创建 IAM 角色和策略的过程。使用 CloudFormation，通过以下过程为 EC2Rescue 自动化创建所需的 IAM 角色和策略。

**为 EC2Rescue 创建所需的 IAM 角色和策略**

1. 下载 [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWSSupport-EC2RescueRole.zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWSSupport-EC2RescueRole.zip) 文件并将 `AWSSupport-EC2RescueRole.json` 解压到本地计算机上的目录。

1. 如果您的 AWS 账户是一个特殊分区，请编辑模板以将 ARN 值更改为您的分区的值。

   例如，对于中国地区，将出现的所有 `arn:aws` 更改为 `arn:aws-cn`。

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 依次选择**创建堆栈**和**使用新资源（标准）**。

1. 在**创建堆栈**页面上，对于**先决条件 - 准备模板**，选择**模板已就绪**。

1. 对于**指定模板**，选择**上传模板文件**。

1. 选择**选择文件**，然后进行浏览并从您解压缩 `AWSSupport-EC2RescueRole.json` 文件的目录中选择此文件。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页上，对于**堆栈名称**字段，输入用于标识此堆栈的名称，然后选择**下一步**。

1. （可选）在**标签** 区域，将一个或多个标签键名称/值对应用到堆栈。

   标签是您分配给资源的可选元数据。标签可让您按各种标准（如用途、所有者或环境）对资源进行分类。例如，您可能需要对堆栈进行标记，以确定其运行的任务类型、涉及的目标或其他资源的类型以及其运行的环境。

1. 选择 **Next**（下一步）

1. 在**审核**页面上，审核堆栈详细信息，然后向下滚动并选择**我确认 CloudFormation 可能创建 IAM 资源**选项。

1. 选择**创建堆栈**。

   CloudFormation 将持续几分钟显示 **CREATE\$1IN\$1PROGRESS** 状态。创建堆栈后，状态将变为 **CREATE\$1COMPLETE**。您还可以选择刷新图标来检查创建过程的状态。

1. 在**堆栈**列表中，选择您刚刚创建的堆栈的选项按钮，然后选择**输出**选项卡。

1. 记下**值**。这是 AssumeRole 的 ARN。在下一个过程 [运行自动化](#automation-ec2rescue-executing) 中运行自动化时指定此 ARN。

## 运行自动化
<a name="automation-ec2rescue-executing"></a>

**重要**  
以下自动化将停止无法访问的实例。停止实例可能导致附加的实例存储卷（如果存在）上的数据丢失。如果未关联弹性 IP，停止实例也可能导致公有 IP 更改。

**运行 `AWSSupport-ExecuteEC2Rescue` 自动化**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**执行自动化**。

1. 在**自动化文档**部分中，从列表中选择 **Amazon 所拥有**。

1. 在运行手册列表中，选择卡片中的 `AWSSupport-ExecuteEC2Rescue`，然后选择**下一步**。

1. 在**执行自动化文档**页面上，选择**简单执行**。

1. 在**文档详细信息**部分中，验证**文档版本** 是否设置为最高默认版本。例如，**\$1DEFAULT** 或 **3 (默认值))**。

1. 在**输入参数**部分中，指定以下参数：

   1. 对于 **UnreachableInstanceId**，指定无法访问实例的 ID。

   1. （可选）对于 **EC2RescueInstanceType**，为 EC2Rescue 实例指定实例类型。默认的实例类型为 `t2.medium`。

   1. 对于 **AutomationAssumeRole**，如果您通过使用本主题前面介绍的 CloudFormation 过程为此自动化创建了角色，则选择您在 CloudFormation 控制台中创建的 AssumeRole 的 ARN。

   1. （可选）如果在排查实例故障时需要收集操作系统级别的日志，请为 **LogDestination** 指定 S3 存储桶。日志会自动上传到此指定存储桶。

   1. 对于 **SubnetId**，指定无法访问实例所在可用区中某个现有 VPC 的子网。默认情况下，Systems Manager 会新建一个 VPC，但您可以根据需要指定现有 VPC 中的某个子网。
**注意**  
如果未看到指定存储桶或子网 ID 的选项，请确认使用的是不是运行手册的最新**默认**版本。

1. （可选）在**标签**区域，应用一个或多个标签键名称/值对以帮助识别自动化，例如 `Key=Purpose,Value=EC2Rescue`。

1. 选择**执行**。

运行手册创建一个备份 AMI，作为自动化的一部分。自动化创建的所有其他资源都会自动删除，但此 AMI 将保留在您的账户中。此 AMI 遵从以下命名约定：

备份 AMI：AWSSupport-EC2Rescue:*UnreachableInstanceId*

在 Amazon EC2 控制台中，可以通过搜索自动化执行 ID 查找此 AMI。

# 在 EC2 实例上重置密码和 SSH 密钥
<a name="automation-ec2reset"></a>

您可以使用 `AWSSupport-ResetAccess` 运行手册在适用于 Windows Server 的 Amazon Elastic Compute Cloud（Amazon EC2）实例上自动重新启用本地管理员密码生成，以及在适用于 Linux 的 EC2 实例上生成新的 SSH 密钥。`AWSSupport-ResetAccess` 运行手册旨在执行 AWS Systems Manager 操作、AWS CloudFormation 操作和 AWS Lambda 函数的组合，从而将重置本地管理员密码通常所需的步骤自动化。

您可以使用 Automation（AWS Systems Manager 中的一项工具）搭配 `AWSSupport-ResetAccess` 运行手册来解决以下问题：

**Windows**

*您丢失了 EC2 密钥对*：要解决此问题，您可以使用 **AWSSupport-ResetAccess** 运行手册，从当前实例创建启用了密码的 AMI，从 AMI 启动新实例，然后选择您拥有的密钥对。

*您丢失了本地管理员密码*：要解决此问题，您可以使用 `AWSSupport-ResetAccess` 运行手册生成可以使用当前 EC2 密钥对解密的一个新密码。

**Linux**

*您丢失了 EC2 密钥对，或者配置了对实例的 SSH 访问但丢失*：要解决此问题，您可以使用 `AWSSupport-ResetAccess` 运行手册创建当前实例的新 SSH 密钥，这使您能够重新连接到该实例。

**注意**  
如果适用于 Windows Server 的 EC2 实例针对 Systems Manager 进行了配置，也可以使用 EC2Rescue 和 AWS Systems Manager Run Command 重置您的本地管理员密码。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[将 EC2Rescue for Windows Server 与 Systems Manager Run Command 结合使用](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2rw-ssm.html)。

**相关信息**  
《Amazon EC2 用户指南》**中的[使用 PuTTY 从 Windows 连接到 Linux 实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/putty.html)。

## 工作原理
<a name="automation-ec2reset-how"></a>

使用自动化和 `AWSSupport-ResetAccess` 运行手册进行故障排除的工作原理如下：
+ 您指定实例的 ID 并运行运行手册。
+ 系统创建一个临时 VPC，然后运行一系列 Lambda 函数以配置该 VPC。
+ 系统在与您的原始实例相同的可用区内为您的临时 VPC 标识一个子网。
+ 系统启动一个临时的启用了 SSM 的 帮助程序实例。
+ 系统停止您的原始实例并创建备份。然后，它将原始根卷附加到帮助程序实例。
+ 系统使用 Run Command 在帮助程序实例上运行 EC2Rescue。在 Windows 上，EC2Rescue 通过在附加的原始根卷上使用 EC2Config 或 EC2Launch 为本地管理员启用密码生成。在 Linux 上，EC2Rescue 生成并注入新的 SSH 密钥并将私有密钥加密保存到 Parameter Store 中。完成后，EC2Rescue 重新将根卷附加回原始实例。
+ 系统根据您的实例创建新 Amazon Machine Image (AMI)，现在密码生成已启用。您可以使用此 AMI 创建新 EC2 实例，并根据需要关联新密钥对。
+ 系统重启您的原始实例，并终止临时实例。系统也将终止临时 VPC 和在自动化开始时创建的 Lambda 函数。
+ **Windows**：您的实例生成一个新密码，您可以使用分配给实例的当前密钥对从 Amazon EC2 控制台对该密码进行解码。

  **Linux**：您可以使用存储在 Systems Manager Parameter Store 中的 SSH 密钥（格式为 **/ec2rl/openssh/*instance ID*/key**）通过 SSH 连接到实例。

## 开始前的准备工作
<a name="automation-ec2reset-begin"></a>

运行以下自动化之前，请执行以下操作：
+ 复制要重置管理员密码的实例的实例 ID。您将在过程中指定此 ID。
+ (可选) 收集无法访问实例所在可用区中子网的 ID。EC2Rescue 实例将在此子网中创建。如果不指定子网，自动化会在您的 AWS 账户中创建新建一个临时 VPC。验证您的 AWS 账户是否至少有一个可用 VPC。默认情况下，一个区域中可以创建 5 个 VPC。如果您已在该区域中创建 5 个 VPC，自动化将会失败，但不会对您的实例进行更改。有关 Amazon VPC 配额的更多信息，请参阅 *Amazon VPC 用户指南*中的 [VPC 和子网](https://docs.aws.amazon.com/vpc/latest/userguide/amazon-vpc-limits.html#vpc-limits-vpcs-subnets)。
+ 或者，您可以为自动化创建并指定一个 AWS Identity and Access Management (IAM) 角色。如果您不指定此角色，自动化将在运行自动化的用户的环境中运行。

### 向 AWSSupport-EC2Rescue 授予在您的实例上执行操作的权限
<a name="automation-ec2reset-access"></a>

在自动化期间，EC2Rescue 需要权限才能在您的实例上执行一系列操作。这些操作调用 AWS Lambda、IAM 和 Amazon EC2 服务，安全地尝试修复实例的问题。如果您在 AWS 账户 和/或 VPC 中具有管理员级权限，您可能能够在不按照本部分中所述配置权限的情况下运行自动化。如果您没有管理员级权限，则您或管理员必须使用以下选项之一配置权限。
+ [使用 IAM policy 授予权限](#automation-ec2reset-access-iam)
+ [使用 CloudFormation 模板授予权限](#automation-ec2reset-access-cfn)

#### 使用 IAM policy 授予权限
<a name="automation-ec2reset-access-iam"></a>

您可以将以下 IAM policy 作为内联策略附加到您的用户、组或角色；也可以创建新的 IAM 托管策略，并将其附加到您的用户、组或角色。有关将内联策略添加到您的用户、组或角色的更多信息，请参阅[使用内联策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_inline-using.html)。有关创建新的托管策略的更多信息，请参阅[使用托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_managed-using.html)。

**注意**  
如果创建新的 IAM 托管式策略，则还必须将 **AmazonSSMAutomationRole** 托管式策略附加到该策略，以便实例与 Systems Manager API 通信。

**`AWSSupport-ResetAccess` 的 IAM policy**

将 *account ID* 替换为您自己的信息。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Action": [
                "lambda:InvokeFunction",
                "lambda:DeleteFunction",
                "lambda:GetFunction"
            ],
            "Resource": "arn:aws:lambda:*:111122223333:function:AWSSupport-EC2Rescue-*",
            "Effect": "Allow"
        },
        {
            "Action": [
                "s3:GetObject",
                "s3:GetObjectVersion"
            ],
            "Resource": [
                "arn:aws:s3:::awssupport-ssm.*/*.template",
                "arn:aws:s3:::awssupport-ssm.*/*.zip"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "iam:CreateRole",
                "iam:CreateInstanceProfile",
                "iam:GetRole",
                "iam:GetInstanceProfile",
                "iam:PutRolePolicy",
                "iam:DetachRolePolicy",
                "iam:AttachRolePolicy",
                "iam:PassRole",
                "iam:AddRoleToInstanceProfile",
                "iam:RemoveRoleFromInstanceProfile",
                "iam:DeleteRole",
                "iam:DeleteRolePolicy",
                "iam:DeleteInstanceProfile"
            ],
            "Resource": [
                "arn:aws:iam::111122223333:role/AWSSupport-EC2Rescue-*",
                "arn:aws:iam::111122223333:instance-profile/AWSSupport-EC2Rescue-*"
            ],
            "Effect": "Allow"
        },
        {
            "Action": [
                "lambda:CreateFunction",
                "ec2:CreateVpc",
                "ec2:ModifyVpcAttribute",
                "ec2:DeleteVpc",
                "ec2:CreateInternetGateway",
                "ec2:AttachInternetGateway",
                "ec2:DetachInternetGateway",
                "ec2:DeleteInternetGateway",
                "ec2:CreateSubnet",
                "ec2:DeleteSubnet",
                "ec2:CreateRoute",
                "ec2:DeleteRoute",
                "ec2:CreateRouteTable",
                "ec2:AssociateRouteTable",
                "ec2:DisassociateRouteTable",
                "ec2:DeleteRouteTable",
                "ec2:CreateVpcEndpoint",
                "ec2:DeleteVpcEndpoints",
                "ec2:ModifyVpcEndpoint",
                "ec2:Describe*"
            ],
            "Resource": "*",
            "Effect": "Allow"
        }
    ]
}
```

------

#### 使用 CloudFormation 模板授予权限
<a name="automation-ec2reset-access-cfn"></a>

CloudFormation 使用预配置模板自动化创建 IAM 角色和策略的过程。使用 CloudFormation，通过以下过程为 EC2Rescue 自动化创建所需的 IAM 角色和策略。

**为 EC2Rescue 创建所需的 IAM 角色和策略**

1. 下载 [https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWSSupport-EC2RescueRole.zip](https://docs.aws.amazon.com/systems-manager/latest/userguide/samples/AWSSupport-EC2RescueRole.zip) 文件并将 `AWSSupport-EC2RescueRole.json` 解压到本地计算机上的目录。

1. 如果您的 AWS 账户是一个特殊分区，请编辑模板以将 ARN 值更改为您的分区的值。

   例如，对于中国地区，将出现的所有 `arn:aws` 更改为 `arn:aws-cn`。

1. 登录到 AWS 管理控制台 并打开 CloudFormation 控制台 [https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

1. 依次选择**创建堆栈**和**使用新资源（标准）**。

1. 在**创建堆栈**页面上，对于**先决条件 - 准备模板**，选择**模板已就绪**。

1. 对于**指定模板**，选择**上传模板文件**。

1. 选择**选择文件**，然后进行浏览并从您解压缩 `AWSSupport-EC2RescueRole.json` 文件的目录中选择此文件。

1. 选择**下一步**。

1. 在**指定堆栈详细信息**页上，对于**堆栈名称**字段，输入用于标识此堆栈的名称，然后选择**下一步**。

1. （可选）在**标签** 区域，将一个或多个标签键名称/值对应用到堆栈。

   标签是您分配给资源的可选元数据。标签可让您按各种标准（如用途、所有者或环境）对资源进行分类。例如，您可能需要对堆栈进行标记，以确定其运行的任务类型、涉及的目标或其他资源的类型以及其运行的环境。

1. 选择 **Next**（下一步）

1. 在**审核**页面上，审核堆栈详细信息，向下滚动并选择**我确认 CloudFormation 可能创建 IAM 资源**选项。

1. CloudFormation 将持续几分钟显示 **CREATE\$1IN\$1PROGRESS** 状态。创建堆栈后，状态将变为 **CREATE\$1COMPLETE**。您还可以选择刷新图标来检查创建过程的状态。

1. 在堆栈列表中，选择您刚刚创建的堆栈旁边的选项，然后选择**输出**选项卡。

1. 复制**值**。这是 AssumeRole 的 ARN。在运行自动化时，您将指定此 ARN。

## 运行自动化
<a name="automation-ec2reset-executing"></a>

以下过程介绍如何使用 AWS Systems Manager 控制台运行 `AWSSupport-ResetAccess` 运行手册。

**重要**  
以下自动化执行将停止实例。停止实例可能导致附加的实例存储卷（如果存在）上的数据丢失。如果未关联弹性 IP，停止实例也可能导致公有 IP 更改。要避免这些配置更改，请使用 Run Command 重置访问权限。有关更多信息，请参阅《Amazon EC2 用户指南》**中的[将 EC2Rescue for Windows Server 与 Systems Manager Run Command 结合使用](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2rw-ssm.html)。

**要运行 AWSSupport-ResetAccess Automation，请执行以下操作：**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **自动化**。

1. 选择**执行自动化**。

1. 在**自动化文档**部分中，从列表中选择 **Amazon 所拥有**。

1. 在运行手册列表中，选择 **AWSSupport-ResetAccess** 卡片中的按钮，然后选择**下一步**。

1. 在**执行运行手册**页面上，选择**简单执行**。

1. 在**文档详细信息**部分中，验证**文档版本** 是否设置为最高默认版本。例如，**\$1DEFAULT** 或 **3 (默认值))**。

1. 在**输入参数**部分中，指定以下参数：

   1. 对于 **InstanceID**，指定无法访问实例的 ID。

   1. 对于 **SubnetId**，指定您指定的实例所在可用区中某个现有 VPC 的子网。默认情况下，Systems Manager 会新建一个 VPC，但您可以根据需要指定现有 VPC 中的某个子网。
**注意**  
如果未看到指定子网 ID 的选项，请确认使用的是不是运行手册的最新**默认**版本。

   1. 对于 **EC2RescueInstanceType**，为 EC2Rescue 实例指定实例类型。默认的实例类型为 `t2.medium`。

   1. 对于 **AssumeRole**，如果是使用本主题前面介绍的 CloudFormation 过程为此自动化创建的角色，则指定您在 CloudFormation 控制台记下的 AssumeRole ARN。

1. （可选）在**标签**区域，应用一个或多个标签键名称/值对以帮助识别自动化，例如 `Key=Purpose,Value=ResetAccess`。

1. 选择**执行**。

1. 要监控自动化过程，请选择正在运行的自动化，然后选择**步骤**选项卡。完成自动化后，选择**描述**选项卡，然后选择**查看输出**以查看结果。要查看单个步骤的输出，请选择**步骤**选项卡，然后选择步骤旁的**查看输出**。

运行手册创建一个备份 AMI 和已启用密码的 AMI 作为自动化的一部分。自动化创建的所有其他资源都会自动删除，但这些 AMIs 将保留在您的账户中。这些 AMIs 遵从以下命名约定：
+ 备份 AMI：`AWSSupport-EC2Rescue:InstanceID`
+ 启用了密码的 AMI：AWSSupport-EC2Rescue: Password-enabled AMI from *Instance ID*

可以通过搜索自动化执行 ID 查找这些 AMIs。

对于 Linux，您的实例的新 SSH 私有密钥加密保存到 Parameter Store 中。参数名称为 **/ec2rl/openssh/*instance ID*/key**。

# 使用输入变压器将数据传递到 Automation
<a name="automation-tutorial-eventbridge-input-transformers"></a>

此 AWS Systems Manager Automation 教程展示了如何使用 Amazon EventBridge 的输入转换器功能，从实例状态更改事件中提取 Amazon Elastic Compute Cloud (Amazon EC2) 实例的 `instance-id`。Automation 是 AWS Systems Manager 中的一项工具。我们使用输入转换器将该数据作为 `InstanceId` 输入参数传递给 `AWS-CreateImage` 运行手册目标。当任何实例更改为 `stopped` 状态时，均将触发该规则。

有关使用输入转换器的更多信息，请参阅 *Amazon EventBridge 用户指南*中的[教程：使用输入转换器自定义要传递给事件目标的内容](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-input-transformer-tutorial.html)。

**开始前的准备工作**  
验证是否已向 Systems Manager 自动化服务角色添加了 EventBridge 所需的权限和信任策略。有关更多信息，请参阅 *Amazon EventBridge 用户指南*中的[管理 EventBridge 资源访问权限概述](https://docs.aws.amazon.com/eventbridge/latest/userguide/iam-access-control-identity-based-eventbridge.html)。

**将输入转换器与自动化结合使用**

1. 打开位于 [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/) 的 Amazon EventBridge 控制台。

1. 在导航窗格中，选择**规则**。

1. 选择**创建规则**。

1. 为规则输入名称和描述。

   规则不能与同一区域中的另一个规则和同一事件总线上的名称相同。

1. 对于**事件总线**，请选择要与此规则关联的事件总线。如果您希望此规则响应来自您自己的 AWS 账户的匹配事件，请选择 **defaul**（默认）。当您账户中的某个 AWS 服务发出一个事件时，它始终会发送到您账户的默认事件总线。

1. 对于**规则类型**，选择**具有事件模式的规则**。

1. 选择**下一步**。

1. 对于**事件源**，选择**AWS 事件或 EventBridge 合作伙伴事件**。

1. 在**事件模式**部分，选择**使用模式表单**。

1. 对于 **Event source**（事件源），选择 **AWS services**（服务）。

1. 在 **AWS service**（服务）中，选择 **EC2**。

1. 对于**事件类型**，请选择 **EC2 实例状态更改通知**。

1. 对于**事件类型规范 1**，选择**特定状态**，然后选择**已停止**。

1. 对于**事件类型规范 2**，选择**任何实例**，或选择**特定实例 ID** 并输入要监控的实例的 ID。

1. 选择**下一步**。

1. 对于**目标类型**，选择**AWS 服务**。

1. 对于 **Target**（目标），选择 **Systems Manager Automation**。

1. 对于 **Document**（文档），选择 **AWS-CreateImage**。

1. 在 **Configure automation parameter(s)**（配置自动化参数）部分中，选择 **Input Transformer**（输入转换器）。

1. 对于 **Input path**（输入路径），输入 **\$1"instance":"\$1.detail.instance-id"\$1**。

1. 对于 **Template**（模板），输入 **\$1"InstanceId":[<instance>]\$1**。

1. 对于 **Execution role**（执行角色），选择 **Use existing role**（使用现有角色），然后选择您的自动化服务角色。

1. 选择 **Next（下一步）**。

1. （可选）为规则输入一个或多个标签。有关更多信息，请参阅 *Amazon EventBridge 用户指南*中的[标记 Amazon EventBridge 资源](https://docs.aws.amazon.com/eventbridge/latest/userguide/eventbridge-tagging.html)。

1. 选择 **Next（下一步）**。

1. 查看规则详细信息并选择**创建规则**。

# 了解 Systems Manager Automation 返回的状态
<a name="automation-statuses"></a>

AWS Systems Manager自动化报告有关运行自动化时自动化操作或步骤所经历的各种状态的详细状态信息，以及整体自动化的同类信息。Automation 是 AWS Systems Manager 中的一项工具。您可以使用以下方法监视自动化状态。
+ 在 Systems Manager 自动化控制台中监控**执行状态**。
+ 使用您的首选命令行工具。对于 AWS Command Line Interface(AWS CLI），您可以使用 [describe-automation-step-executions](https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-automation-step-executions.html) 或 [get-automation-execution](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-automation-execution.html)。对于 AWS Tools for Windows PowerShell，您可以使用 [Get-SSMAutomationStepExecution](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMAutomationStepExecution.html) 或 [Get-SSMAutomationExecution](https://docs.aws.amazon.com/powershell/latest/reference/items/Get-SSMAutomationExecution.html)。
+ 配置 Amazon EventBridge 以响应操作或自动化状态更改。

有关处理自动化中超时的更多信息，请参阅[处理运行手册中的超时](automation-handling-timeouts.md)。

## 关于自动化状态
<a name="automation-statuses-about"></a>

除了整体自动化之外，自动化还会报告单个自动化操作的状态详细信息。

整体自动化状态可能不同于单个操作或步骤报告的状态，如下表所述。


**操作的详细状态**  

| Status | Details | 
| --- | --- | 
| 待处理 | 该步骤尚未开始运行。如果自动化使用条件操作，则在自动化完成后，如果运行步骤的条件未满足，步骤将保持此状态。如果在步骤运行之前取消了自动化，则步骤也会保持此状态。 | 
| InProgress | 步骤正在运行。 | 
| IN LIST | 步骤正在等待输入。 | 
| 成功 | 步骤成功完成。这是最终状态。 | 
| 超时 | 步骤或批准未在指定的超时期限之前完成。这是最终状态。 | 
| 正在取消 | 请求者取消步骤后，该步骤正在停止。 | 
| 已取消 | 该步骤在完成之前已由请求者停止。这是最终状态。 | 
| 已失败 |  该步骤未成功完成。这是最终状态。  | 
| Exited |  仅通过 `aws:loop` 操作返回。循环未完全完成。使用 `nextStep`、`onCancel` 或 `onFailure` 属性将循环内的步骤移至外部步骤。  | 


**自动化的详细状态**  

| Status | Details | 
| --- | --- | 
| 待处理 | 自动化尚未开始运行。 | 
| InProgress | 自动化正在运行。 | 
| IN LIST | 自动化正在等待输入。 | 
| 成功 | 已成功完成操作。这是最终状态。 | 
| 超时 | 步骤或批准未在指定的超时期限之前完成。这是最终状态。 | 
| 正在取消 | 请求者取消后，自动化正在停止。 | 
| 已取消 | 自动化在完成之前被请求者停止。这是最终状态。 | 
| 已失败 |  自动化未成功完成。这是最终状态。  | 

# Systems Manager 自动化故障排除
<a name="automation-troubleshooting"></a>

利用以下信息，帮助排查 AWS Systems Manager Automation（AWS Systems Manager 中的一项工具）出现的问题。本主题介绍了依据自动化错误消息解决问题的特定任务。

**Topics**
+ [常见自动化错误](#automation-trbl-common)
+ [自动化执行无法启动](#automation-trbl-access)
+ [执行已启动，但是状态为“失败”](#automation-trbl-exstrt)
+ [执行已启动，但超时](#automation-trbl-to)

## 常见自动化错误
<a name="automation-trbl-common"></a>

此部分提供有关常见自动化错误的信息。

### VPC not defined 400
<a name="automation-trbl-common-vpc"></a>

默认情况下，当自动化运行 `AWS-UpdateLinuxAmi` 运行手册或 `AWS-UpdateWindowsAmi` 运行手册时，系统会在默认 VPC (172.30.0.0/16) 中创建一个临时实例。如果您删除了默认 VPC，会收到以下错误：

`VPC not defined 400`

要解决此问题，您必须为 `SubnetId` 输入参数指定值。

## 自动化执行无法启动
<a name="automation-trbl-access"></a>

如果您没有为自动化正确配置 AWS Identity and Access Management（IAM）角色和策略，自动化可能因拒绝访问错误或担任角色无效错误而失败。

### 拒绝访问
<a name="automation-trbl-access-denied"></a>

以下示例描述了自动化执行因拒绝访问错误无法启动的情况。

**对 Systems Manager API 的访问被拒绝**  
**错误消息**：`User: user arn isn't authorized to perform: ssm:StartAutomationExecution on resource: document arn (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`
+ 可能的原因 1：尝试启动自动化的用户没有调用 `StartAutomationExecution` API 的权限。要解决此问题，请将所需的 IAM policy 附加到用于启动自动化的用户。
+ 可能的原因 2：尝试启动自动化的用户拥有调用 `StartAutomationExecution` API 的权限，但是无权使用特定运行手册来调用该 API。要解决此问题，请将所需的 IAM policy 附加到用于启动自动化的用户。

**由于缺少 PassRole 权限而导致访问被拒**  
**错误消息**：`User: user arn isn't authorized to perform: iam:PassRole on resource: automation assume role arn (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`

尝试启动自动化的 IAM 用户没有担任角色所需的 PassRole 权限。要解决此问题，请将 iam:PassRole 策略附加到尝试启动自动化的用户的角色。有关更多信息，请参阅 [任务 2：将 iam:PassRole 策略附加到您的自动化角色](automation-setup-iam.md#attach-passrole-policy)。

### 担任角色无效
<a name="automation-trbl-ar"></a>

运行自动化时，要么在运行手册中提供担任角色，要么将担任角色作为运行手册的一个参数值传递。如果未指定或未正确配置担任角色，可出现不同类型的错误。

**担任角色格式错误**  
**错误消息**：`The format of the supplied assume role ARN isn't valid.`担任角色格式不正确。要解决该问题，请验证运行手册中是否指定了有效的担任角色，或者在启动自动化时指定为运行时的参数。

**无法担任担任角色**  
**错误消息**：`The defined assume role is unable to be assumed. (Service: AWSSimpleSystemsManagement; Status Code: 400; Error Code: InvalidAutomationExecutionParametersException; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)`
+ 可能的原因 1：担任角色不存在。要解决该问题，请创建角色。有关更多信息，请参阅 [设置自动化](automation-setup.md)。创建此角色的特定详细信息在以下主题中介绍 [任务 1：为自动化创建服务角色](automation-setup-iam.md#create-service-role)。
+ 可能的原因 2：担任角色没有与 Systems Manager 服务的信任关系。要解决该问题，请创建信任关系。有关更多信息，请参阅 *《IAM 用户指南》*中的[我无法担任角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_roles.html#troubleshoot_roles_cant-assume-role)。

## 执行已启动，但是状态为“失败”
<a name="automation-trbl-exstrt"></a>

### 操作特定的失败
<a name="automation-trbl-actspec"></a>

运行手册包含步骤，并且步骤按顺序运行。每个步骤会调用一项或多项 AWS 服务 API。API 可确定本步的输入、行为和输出。在多个位置错误可能导致步骤失败。失败消息指示出现错误的时间和位置。

要查看 Amazon Elastic Compute Cloud (Amazon EC2) 控制台中的失败消息，请选择失败步骤的**查看输出**链接。要查看 AWS CLI 中的失败消息，请调用 `get-automation-execution` 并查找失败的 `StepExecution` 中的 `FailureMessage` 属性。

在以下示例中，与 `aws:runInstance` 操作相关联的步骤失败。每个示例探讨了不同类型的错误。

**缺少映像**  
**错误消息**：`Automation Step Execution fails when it's launching the instance(s). Get Exception from RunInstances API of ec2 Service. Exception Message from RunInstances API: [The image id '[ami id]' doesn't exist (Service: AmazonEC2; Status Code: 400; Error Code: InvalidAMIID.NotFound; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)]. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.`

`aws:runInstances` 操作收到的 `ImageId` 输入不存在。要解决该问题，请用正确的 AMI ID 更新运行手册或参数值。

**担任角色策略缺少足够的权限**  
**错误消息**：`Automation Step Execution fails when it's launching the instance(s). Get Exception from RunInstances API of ec2 Service. Exception Message from RunInstances API: [You aren't authorized to perform this operation. Encoded authorization failure message: xxxxxxx (Service: AmazonEC2; Status Code: 403; Error Code: UnauthorizedOperation; Request ID: xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx)]. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.`

担任角色的权限不足，无法在 EC2 实例上调用 `RunInstances` API。要解决此问题，请将 IAM policy 附加到有权调用 `RunInstances` API 的担任角色。有关更多信息，请参阅[使用控制台为 Automation 创建服务角色](automation-setup-iam.md)。

**意外状态**  
**错误消息**：`Step fails when it's verifying launched instance(s) are ready to be used. Instance i-xxxxxxxxx entered unexpected state: shutting-down. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.`
+ 可能的原因 1：实例或 Amazon EC2 服务有问题。要解决此问题，请登录到实例或查阅实例系统日志以了解实例启动关闭的原因。
+ 可能的原因 2：为 `aws:runInstances` 操作指定的用户数据脚本有问题或语法错误。验证用户数据脚本的语法。另外，请验证用户数据脚本是否未关闭实例，或者调用了关闭该实例的其他脚本。

**操作特定失败参考**  
如果步骤失败，失败消息可能指示失败时正在调用哪个服务。下表列出每个操作调用的服务。该表还提供指向有关每个服务的信息的链接。


****  

| Action | 此操作调用的 AWS 服务 | 有关此服务的信息 | 排查内容问题 | 
| --- | --- | --- | --- | 
|  `aws:runInstances`  |  Amazon EC2  |  [Amazon EC2 用户指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/)  |  [EC2 实例故障排除](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-troubleshoot.html)  | 
|  `aws:changeInstanceState`  |  Amazon EC2  |  [Amazon EC2 用户指南](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/)  |  [EC2 实例故障排除](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-instance-troubleshoot.html)  | 
|  `aws:runCommand`  |  Systems Manager  |   [AWS Systems Manager Run Command](run-command.md)  |   [对 Systems Manager Run Command 进行故障排除](troubleshooting-remote-commands.md)  | 
|  `aws:createImage`  |  Amazon EC2  |  [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)  |  | 
|  `aws:createStack`  |  CloudFormation  |  [《AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)  |  [CloudFormation 问题排查](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html)  | 
|  `aws:deleteStack`  |  CloudFormation  |  [《AWS CloudFormation 用户指南》](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)  |  [CloudFormation 问题排查](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html)  | 
|  `aws:deleteImage`  |  Amazon EC2  |  [亚马逊机器映像](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)  |  | 
|  `aws:copyImage`  |  Amazon EC2  |  [https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/AMIs.html)  |  | 
|  `aws:createTag`  |  Amazon EC2，Systems Manager  |  [EC2 资源和标签](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_Resources.html)  |  | 
|  `aws:invokeLambdaFunction`  |  AWS Lambda  |  [AWS Lambda 开发人员指南](https://docs.aws.amazon.com/lambda/latest/dg/)  |  [Lambda 故障排除](https://docs.aws.amazon.com/lambda/latest/dg/monitoring-functions.html)  | 

### 自动化服务内部错误
<a name="automation-trbl-err"></a>

**错误消息**：`Internal Server Error. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.`

自动化 服务中的一个问题导致指定运行手册无法正确运行。要解决此问题，请联系 AWS 支持。请提供执行 ID 和客户 ID (如果有)。

## 执行已启动，但超时
<a name="automation-trbl-to"></a>

**错误消息**：`Step timed out while step is verifying launched instance(s) are ready to be used. Please refer to Automation Service Troubleshooting Guide for more diagnosis details.`

`aws:runInstances` 操作中的步骤超时。如果运行本步骤操作所花的时间超出此步骤中为 `timeoutSeconds` 指定的值，就会发生这种情况。要解决此问题，请为 `aws:runInstances` 操作中的 `timeoutSeconds` 参数指定更长的值。如果不能解决问题，请调查步骤运行时间超出预期的原因

# AWS Systems Manager Change Calendar
<a name="systems-manager-change-calendar"></a>

Change Calendar（AWS Systems Manager 中的一项工具）让您能够设置可以或不可以在 AWS 账户中执行指定操作（例如在 [Systems Manager Automation](systems-manager-automation.md) 运行手册中）的日期和时间范围。在 Change Calendar 中，这些范围称为*事件*。在您创建 Change Calendar 条目时，您将创建类型 `ChangeCalendar` 的 [Systems Manager 文档](documents.md) 在 Change Calendar 中，文档以纯文本格式存储 [iCalendar 2.0](https://icalendar.org/) 数据。您添加到 Change Calendar 条目的事件将成为该文档的一部分。要开始使用 Change Calendar，请打开 [Systems Manager 控制台](https://console.aws.amazon.com//systems-manager/change-calendar)。在导航窗格中，请选择 **Change Calendar**。

您可以在 Systems Manager 控制台中创建日历及其事件。您还可以导入从受支持的第三方日历提供程序导出的 iCalendar (`.ics`) 文件，以将其事件添加到您的日历。受支持的提供程序包括 Google 日历、Microsoft Outlook 和 iCloud 日历。

Change Calendar 条目可以是以下两种类型之一：

**`DEFAULT_OPEN`**，即 Open by default (预设情况下打开)  
默认情况下，除日历事件期间外，所有操作都可以运行。在事件期间，`DEFAULT_OPEN` 日历的状态为 `CLOSED`，且事件被阻止运行。

**`DEFAULT_CLOSED`**，即 Closed by default (预设情况下关闭)  
默认情况下，除日历事件期间外，所有操作都被阻止运行。在事件期间，`DEFAULT_CLOSED` 日历的状态为 `OPEN`，且操作被允许运行。

您可以选择将所有计划的自动化工作流程、维护时段和 State Manager 关联自动添加到日历中。您也可以从日历显示中删除其中任何一种单独类型。

## 谁应该使用 Change Calendar？
<a name="systems-manager-change-calendar-who"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。
+ 执行以下操作类型的 AWS 客户：
  + 创建或运行自动化运行手册。
  + 在 Change Manager 中创建更改请求。
  + 运行维护时段。
  + 在 State Manager 中创建关联。

  Automation、Change Manager、Maintenance Windows、和State Manager都是 AWS Systems Manager 中的工具。通过将这些工具与 Change Calendar 集成在一起，您可以根据与每个操作类型关联的更改日历的当前状态，来允许或阻止这些操作类型。
+ 负责维护 Systems Manager 托管式节点配置的一致性、稳定性和功能性的管理员。

## 的优势Change Calendar
<a name="systems-manager-change-calendar-benefits"></a>

以下是 Change Calendar 的一些优势。
+ **在应用更改之前进行审核**

  Change Calendar 条目可以帮助确保在应用对环境可能会造成破坏的更改之前对其进行审核。
+ **仅在合适时间应用更改**

  Change Calendar 条目有助于在事件期间保持环境稳定。例如，在您预期会有大量资源需求（例如在会议或公共营销促销期间）时，可以创建一个 Change Calendar 条目来阻止更改。当您预计管理员只能提供有限的支持（例如在度假或假期）时，日历条目也可以阻止更改。在管理员提供的支持有限，无法对失败的操作或部署进行故障排除时，您可以使用日历条目允许在一天或一周中的特定时间以外进行更改。
+ **获取日历当前或之后的状态**

  您可以运行 Systems Manager `GetCalendarState` API 操作，显示日历的当前状态、在指定时间的状态或下次计划日历状态更改的时间。
**注意**  
`GetCalendarState` API 的配额为每秒 10 个请求。有关 Systems Manager 配额的更多信息，请参阅*《Amazon Web Services 一般参考》*中的 [Systems Manager 服务配额](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。
+ 

**EventBridge 支持**  
支持此 Systems Manager 工具作为 Amazon EventBridge 规则中的一个*事件*类型。有关更多信息，请参阅 [使用 Amazon EventBridge 监控 Systems Manager 事件](monitoring-eventbridge-events.md) 和 [引用：Amazon EventBridge 事件模式和 Systems Manager 类型](reference-eventbridge-events.md)。

**Topics**
+ [谁应该使用 Change Calendar？](#systems-manager-change-calendar-who)
+ [的优势Change Calendar](#systems-manager-change-calendar-benefits)
+ [设置 Change Calendar](systems-manager-change-calendar-prereqs.md)
+ [使用 Change Calendar](systems-manager-change-calendar-working.md)
+ [向自动化运行手册添加 Change Calendar 依赖关系](systems-manager-change-calendar-automations.md)
+ [排除 Change Calendar 问题](change-calendar-troubleshooting.md)

# 设置 Change Calendar
<a name="systems-manager-change-calendar-prereqs"></a>

使用 Change Calendar（AWS Systems Manager 中的一项工具）前请完成以下操作。

## 安装最新的命令行工具
<a name="change-calendar-prereqs-tools"></a>

安装最新的命令行工具，以获取有关日历状态的信息。


| 要求 | 说明 | 
| --- | --- | 
|  AWS CLI  |  （可选）要使用 AWS Command Line Interface (AWS CLI) 获取有关日历状态的信息，请在本地计算机上安装 AWS CLI 的最新版本。 有关如何安装或升级 CLI 的更多信息，请参阅 *AWS Command Line Interface 用户指南*中的[安装、更新和卸载 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html)。  | 
|  AWS Tools for PowerShell  |  （可选）要使用 Tools for PowerShell 获取有关日历状态的信息，请在本地计算机上安装 Tools for PowerShell 的最新版本。 有关如何安装或升级 Tools for PowerShell 的更多信息，请参阅 *AWS Tools for PowerShell 用户指南*中的[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。  | 

## 设置权限
<a name="change-calendar-prereqs-permissions"></a>

如果已为您的用户、组或角色分配了管理员权限，则您对 Change Calendar 有完全访问权。如果您没有管理员权限，则管理员必须通过向您的用户、组或角色分配 `AmazonSSMFullAccess` 托管策略或分配提供必要权限的策略，来向您授予权限。

使用 Change Calendar 需要以下权限。

**Change Calendar 条目**  
要创建、更新或删除 Change Calendar 条目（包括在条目中添加和删除事件），附加到用户、组或角色的策略必须允许执行以下操作：  
+ `ssm:CreateDocument`
+ `ssm:DeleteDocument`
+ `ssm:DescribeDocument`
+ `ssm:DescribeDocumentPermission`
+ `ssm:GetCalendar`
+ `ssm:ListDocuments`
+ `ssm:ModifyDocumentPermission`
+ `ssm:PutCalendar`
+ `ssm:UpdateDocument`
+ `ssm:UpdateDocumentDefaultVersion`

**日历状态**  
要获取有关日历当前或之后状态的信息，附加到用户、组或角色的策略必须允许执行以下操作：  
+ `ssm:GetCalendarState`

**操作事件**  
要查看操作事件，例如维护时段、关联和计划的自动化，附加到用户、组或角色的策略必须允许执行以下操作：  
+ `ssm:DescribeMaintenanceWindows`
+ `ssm:DescribeMaintenanceWindowExecution`
+ `ssm:DescribeAutomationExecutions`
+ `ssm:ListAssociations`

**注意**  
由您的账户以外的账户拥有（即该账户创建）的 Change Calendar 条目为只读，即使它们与您的账户共享也是如此。维护时段、State Manager 关联和自动化不会共享。

# 使用 Change Calendar
<a name="systems-manager-change-calendar-working"></a>

您可以使用 AWS Systems Manager 控制台添加、管理或删除 Change Calendar（AWS Systems Manager 中的一项工具）条目。您还可以从受支持的第三方日历提供程序导入事件，方法是导入从源日历导出的 iCalendar (`.ics`) 文件。而且，您也可以使用 `GetCalendarState` API 操作或 `get-calendar-state` AWS Command Line Interface (AWS CLI) 命令在特定时间获取有关 Change Calendar 状态的信息。

**Topics**
+ [创建更改日历](change-calendar-create.md)
+ [在 Change Calendar 中创建和管理事件](change-calendar-events.md)
+ [导入和管理来自第三方日历的事件](third-party-events.md)
+ [更新更改日历](change-calendar-update.md)
+ [共享更改日历](change-calendar-share.md)
+ [删除更改日历](change-calendar-delete.md)
+ [获取更改日历的状态](change-calendar-getstate.md)

# 创建更改日历
<a name="change-calendar-create"></a>

在 Change Calendar（AWS Systems Manager 中的一项工具）中创建条目时，您要用到使用 `text` 格式的 Systems Manager 文档（SSM 文档）。

**创建更改日历**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 选择 **Create calendar（创建日历）**。

   –或者–

   如果 **Change Calendar** 主页首先打开，则选择 **Create change calendar**（创建更改日历）。

1. 在 **Create calendar (创建日历)** 页面上的 **Calendar details (日历详细信息)** 中，输入日历条目的名称。日历条目名称可以包含字母、数字、句点、短划线和下划线。名称应该足够具体，以便一目了然地确定日历条目的用途。例如，**support-off-hours**。创建日历条目后，您将无法更新此名称。

1. （可选）对于 **Description**（描述），输入日历条目的描述。

1. （可选）在 **Import calendar (导入日历)** 区域中，选择 **Choose file (选择文件)**，以选择您从第三方日历提供程序导出的 iCalendar (`.ics`) 文件。导入该文件会将其事件添加到您的日历中。

   受支持的提供程序包括 Google 日历、Microsoft Outlook 和 iCloud 日历。

   有关更多信息，请参阅 [从第三方日历提供程序导入事件](change-calendar-import.md)。

1. 在 **Calendar type (日历类型)** 中，选择以下选项之一。
   + **Open by default (预设情况下打开)** - 日历处于打开状态（自动化操作可以运行，直到事件开始），然后在关联事件的持续时间内关闭。
   + **Closed by default (预设情况下关闭)** - 日历处于关闭状态（自动化操作无法运行，直到事件开始），但在关联事件的持续时间内打开。

1. （可选）在**变更管理事件**中，选择**向日历添加变更管理事件**。此选项会在您的月度日历显示中显示所有的计划维护时段、State Manager 关联、自动化工作流程和 Change Manager 变更请求。
**提示**  
如果稍后要从日历显示中永久移除这些事件类型，请编辑日历，清除此复选框，然后选择**保存**。

1. 选择 **Create calendar（创建日历）**。

   创建日历条目后，Systems Manager 将在 **Change Calendar** 列表中显示您的日历条目。列显示日历版本和日历拥有者的 AWS 账户 编号。在创建或导入至少一个事件之前，您的日历条目无法阻止或允许任何操作。有关创建事件的信息，请参阅 [创建Change Calendar 事件](change-calendar-create-event.md)。有关导入事件的信息，请参阅 [从第三方日历提供程序导入事件](change-calendar-import.md)。

# 在 Change Calendar 中创建和管理事件
<a name="change-calendar-events"></a>

在 AWS Systems Manager Change Calendar 中创建日历后，可以创建、更新和删除打开或关闭的日历中包含的事件。Change Calendar 是 AWS Systems Manager 中的一项工具。

**提示**  
作为直接在 Systems Manager 控制台中创建事件的替代方法，您可以从受支持的第三方日历应用程序导入 iCalendar (`.ics`) 文件。有关信息，请参阅[导入和管理来自第三方日历的事件](third-party-events.md)。

**Topics**
+ [创建Change Calendar 事件](change-calendar-create-event.md)
+ [更新 Change Calendar 事件](change-calendar-update-event.md)
+ [删除 Change Calendar 事件](change-calendar-delete-event.md)

# 创建Change Calendar 事件
<a name="change-calendar-create-event"></a>

在向 Change Calendar（AWS Systems Manager 中的一项工具）中的条目添加事件时，您要指定暂停日历条目默认操作的时间段。例如，如果日历条目类型为预设情况下关闭，则日历在事件期间可以更改。（或者，您可以创建一个咨询活动，该活动仅在日历上发挥信息作用。）

目前，您只能使用控制台创建 Change Calendar 事件。事件将添加到您在创建 Change Calendar 条目时创建的 Change Calendar 文档中。

**创建 Change Calendar 事件**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要向其添加事件的日历条目的名称。

1. 在日历条目的详细信息页面上，选择 **Create event (创建事件)**。

1. 在 **Create scheduled event (创建计划事件)** 页面的 **Event details (事件详细信息)** 中，输入事件的显示名称。事件名称可以包含字母、数字、句点、短划线和下划线。名称应该足够具体，以便确定事件的用途。例如，**nighttime-hours**。

1. 对于 **Description**（描述），输入事件的描述。例如，**The support team isn't available during these hours**。

1. （可选）如果您希望此事件仅作为视觉通知或提醒，请选择 **Advisory**（咨询）复选框。咨询事件在您的日历上不起任何功能作用。它们仅为查看日历的用户提供信息。

1. 对于 **Event start date**（事件开始日期），以 `MM/DD/YYYY` 格式输入或选择开始事件的日期，并以 `hh:mm:ss` 格式（小时、分钟和秒）输入在指定日期开始事件的时间。

1. 对于 **Event end date**（事件结束日期），以 `MM/DD/YYYY` 格式输入或选择结束事件的日期，并以 `hh:mm:ss` 格式（小时、分钟和秒）输入在指定日期结束事件的时间。

1. 在 **Schedule time zone**（计划时区）中，选择应用于事件开始和结束时间的时区。您可以输入城市名称或不同于格林威治标准时间 (GMT) 的时区的一部分，以便更快地查找时区。默认值为协调世界时 (UTC)。

1. （可选）要创建每天、每周或每月重复的事件，请启用 **Recurrence**（重复），然后指定重复的频率和可选的结束日期。

1. 选择 **Create scheduled event (创建计划事件)**。新事件将添加到您的日历条目中，并显示在日历条目详细信息页面的 **Events (事件)** 选项卡上。

# 更新 Change Calendar 事件
<a name="change-calendar-update-event"></a>

按照以下过程在 AWS Systems Manager 控制台中更新 Change Calendar 事件。Change Calendar 是 AWS Systems Manager 中的一项工具。

**更新 Change Calendar 事件**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要编辑其事件的日历条目的名称。

1. 在日历条目的详细信息页面上，选择 **Events (事件)**。

1. 在日历页面中，选择要编辑的事件。
**提示**  
使用左上角的按钮可向后或向前移动一年，或者向后或向前移动一个月。如果需要，请通过从右上角的列表中选择正确的时区来更改时区。

1. 在 **Event details**（事件详细信息）中，请选择 **Edit**（编辑）。

   要更改事件名称和描述，请添加或替换当前文本值。

1. 要更改 **Event start date**（事件开始日期）值，请选择当前的开始日期，然后从日历中选择一个新日期。要更改开始时间，请选择当前开始时间，然后从列表中选择一个新时间。

1. 要更改 **Event end date**（事件结束日期）值，请选择当前日期，然后从日历中选择一个新的结束日期。要更改结束时间，请选择当前结束时间，然后从列表中选择一个新时间。

1. 要更改 **Schedule time zone**（计划时区）值，请选择应用于事件开始和结束时间的时区。您可以输入城市名称或不同于格林威治标准时间 (GMT) 的时区的一部分，以便更快地查找时区。默认值为协调世界时 (UTC)。

1. （可选）如果您希望此事件仅作为视觉通知或提醒，请选择 **Advisory**（咨询）复选框。咨询事件在您的日历上不起任何功能作用。它们仅为查看日历的用户提供信息。

1. 选择**保存**。您的更改将显示在日历条目详细信息页面的 **Events (事件)** 选项卡上。选择您更新的事件以查看更改。

# 删除 Change Calendar 事件
<a name="change-calendar-delete-event"></a>

您可以使用 AWS 管理控制台，在 Change Calendar（AWS Systems Manager 中的一项工具）中逐个删除事件。

**提示**  
如果您在创建日历时选择了**向日历添加变更管理事件**，则可以执行以下操作：  
要在日历显示中*暂时*隐藏变更管理事件类型，请为每月预览顶部的类型选择 **X**。
要从日历显示中*永久*移除这些类型，请编辑日历，清除**向日历添加变更管理事件**复选框，然后选择**保存**。从日历显示中移除类型并不会将其从您的账户中删除。

**删除 Change Calendar 事件**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要删除其事件的日历条目的名称。

1. 在日历条目的详细信息页面上，选择 **Events (事件)**。

1. 在日历页面中，选择要删除的事件。
**提示**  
使用左上角的按钮可将日历向后或向前移动一年，或者向后或向前移动一个月。如果需要，请通过从右上角的列表中选择正确的时区来更改时区。

1. 在 **Event details (事件详细信息)** 页面上，选择 **Delete (删除)**。当系统提示您确认是否要删除该事件时，请选择 **Confirm**（确认）。

# 导入和管理来自第三方日历的事件
<a name="third-party-events"></a>

作为直接在 AWS Systems Manager 控制台中，创建事件的替代方法，您可以从受支持的第三方日历应用程序导入 iCalendar (`.ics`) 文件。日历可以同时包含导入的事件和您在 Change Calendar（AWS Systems Manager 中的一项工具）中创建的事件。

**开始前的准备工作**  
在尝试导入日历文件之前，请查看以下要求和约束：

日历文件格式  
只支持有效的 iCalendar 文件 (`.ics`)。

受支持的日历提供程序  
仅支持从以下第三方日历提供程序导出的 `.ics` 文件：  
+ Google 日历（[导出说明](https://support.google.com/calendar/answer/37111)）
+ Microsoft Outlook（[导出说明](https://support.microsoft.com/en-us/office/export-an-outlook-calendar-to-google-calendar-662fa3bb-0794-4b18-add8-9968b665f4e6)）
+ iCloud 日历（[导出指令](https://support.apple.com/guide/calendar/import-or-export-calendars-icl1023/mac)）

文件大小  
您可以导入任意数量的有效 `.ics` 文件。但是，每个日历的所有导入文件的总大小不能超过 64KB。  
要最小化 `.ics` 文件的大小，请确保只导出有关日历条目的基本详细信息。如有必要，请减少用于导出的时间段的长度。

时区  
除了日历名称、日历提供程序和至少一个事件之外，导出的 `.ics` 文件还应指明日历的时区。如果没有，或者在确定时区时出现问题，系统将在您导入文件后提示您指定一个时区。

重复性事件限制  
您导出的 `.ics` 文件可以包含重复性事件。但是，如果曾在源日历中删除过某一重复性事件的一次或多次发生，则导入将失败。

**Topics**
+ [从第三方日历提供程序导入事件](change-calendar-import.md)
+ [更新来自第三方日历提供程序的所有事件](change-calendar-import-add-remove.md)
+ [删除从第三方日历导入的所有事件](change-calendar-delete-ics.md)

# 从第三方日历提供程序导入事件
<a name="change-calendar-import"></a>

可以使用以下过程从受支持的第三方日历应用程序导入 iCalendar (`.ics`) 文件。该文件中包含的事件将合并到您打开或关闭的日历的规则中。您可以将文件导入自己使用 Change Calendar（AWS Systems Manager 中的一项工具）创建的新日历或现有日历。

导入 `.ics` 文件后，可以使用 Change Calendar 界面从该文件中删除单个事件。有关信息，请参阅[删除 Change Calendar 事件](change-calendar-delete-event.md)。您还可以通过删除 `.ics` 文件，来删除源日历中的所有事件。有关信息，请参阅[删除从第三方日历导入的所有事件](change-calendar-delete-ics.md)。

**从第三方日历提供程序导入事件**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Calendar**。

1. 要从新日历开始，请选择 **Create calendar (创建日历)**。在 **Import calendar (导入日历)** 区域中，选择 **Choose file (选择文件)**。有关创建新日历的其他步骤的信息，请参阅 [创建更改日历](change-calendar-create.md)。

   –或者–

   要将第三方事件导入到现有日历中，请选择现有日历的名称，以将其打开。

1. 请选择 **Actions, Edit**（操作、编辑），然后在 **Import calendar**（导入日历）区域中，请选择 **Choose file**（选择文件）。

1. 在您的本地计算机上，导航到已导出的 `.ics` 文件，并选择该文件。

1. 如果出现提示，对于 **Select a time zone (选择时区)**，请选择哪一个时区适用于该日历。

1. 选择**保存**。

# 更新来自第三方日历提供程序的所有事件
<a name="change-calendar-import-add-remove"></a>

如果在导入源日历的 iCalendar `.ics` 文件后，向源日历中添加了多个事件，或从其中删除了多个事件，则可以将这些更改反映在 Change Calendar 中。首先，重新导出源日历，再将新文件导入 Change Calendar（AWS Systems Manager 中的一项工具）。更改日历中的事件将被更新，以反映较新文件的内容。

**更新来自第三方日历提供程序的所有事件**

1. 在您的第三方日历中，只要您希望将某些事件反映在 Change Calendar 中，即可添加或删除这些事件，然后将该日历重新导出到新 `.ics` 文件。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Calendar**。

1. 从日历列表中，选择日历名称。

1. 选择**选择文件**，然后导航到替换 `.ics` 文件，并选择该文件。

1. 为了响应有关覆盖现有文件的通知，请选择 **Confirm (确认)**。

# 删除从第三方日历导入的所有事件
<a name="change-calendar-delete-ics"></a>

如果您不再希望将从第三方提供程序导入的任何事件包含在日历中，则可删除已导入的 iCalendar `.ics` 文件。

**删除从第三方日历导入的所有事件**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Calendar**。

1. 从日历列表中，选择日历名称。

1. 在 **Import calendar (导入日历)** 区域中的 **My imported calendars (我导入的日历)** 下，找到导入日历的名称，然后选择其卡片中的 **X**。

1. 选择**保存**。

# 更新更改日历
<a name="change-calendar-update"></a>

您可以更新更改日历的描述，但不能更新其名称。尽管您可以更改日历的默认状态，但请注意，这会反转更改操作在与该日历关联的事件期间的行为。例如，如果您将日历的状态从 **Open by default (预设情况下打开)** 更改为 **Closed by default (预设情况下关闭)**，则当创建了关联事件的用户不希望进行更改时，可能会在事件期间发生不希望的更改。

在更新更改日历时，您要编辑在创建该条目时创建的 Change Calendar 文档。Change Calendar 是 AWS Systems Manager 中的一项工具。

**更新更改日历**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要更新的日历的名称。

1. 在日历的详细信息页面上，请选择 **Actions, Edit**（操作、编辑）。

1. 在 **Description (描述)** 中，您可以更改描述文本。您不能编辑更改日历的名称。

1. 要更改日历状态，请在 **Calendar type (日历类型)** 中选择其他值。请注意，这会反转更改操作在与该日历关联的事件期间的行为。在更改日历类型之前，您应与其他 Change Calendar 用户验证并确保更改日历类型不会在其已创建的事件期间导致不希望的更改。
   + **Open by default (预设情况下打开)** - 日历处于打开状态（自动化操作可以运行，直到事件开始），然后在关联事件的持续时间内关闭。
   + **Closed by default (预设情况下关闭)** - 日历处于关闭状态（自动化操作无法运行，直到事件启动），但在关联事件的持续时间内打开。

1. 选择**保存**。

   在至少添加一个事件之前，您的日历无法阻止或允许任何操作。有关如何添加事件的信息，请参阅 [创建Change Calendar 事件](change-calendar-create-event.md)。

# 共享更改日历
<a name="change-calendar-share"></a>

您可以使用 AWS Systems Manager 控制台，在 Change Calendar（AWS Systems Manager 中的一项工具）中与其他 AWS 账户共享日历。共享日历时，日历对于共享账户中的用户为只读。维护时段、State Manager 关联和自动化不会共享。

**共享更改日历**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要共享的日历的名称。

1. 在日历的详细信息页面上，请选择 **Sharing**（共享）选项卡。

1. 依次选择 **Actions, Share**（操作、共享）。

1. 在 **Share calendar (共享日历)** 中，对于 **Account ID (账户 ID)**，输入有效 AWS 账户 的 ID 号，然后选择 **Share (共享)**。

   共享账户的用户可以读取更改日历，但他们不能进行更改。

# 删除更改日历
<a name="change-calendar-delete"></a>

您可以使用 Systems Manager 控制台或 AWS Command Line Interface（AWS CLI），在 Change Calendar（AWS Systems Manager 中的一项工具）中删除日历。删除更改日历会删除所有关联的事件。

**删除更改日历**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Change Calendar**。

1. 在日历的列表中，请选择要删除的日历的名称。

1. 在日历的详细信息页面上，请选择 **Actions, Delete**（操作、删除）。当系统提示您确认是否要删除日历时，选择 **Delete (删除)**。

# 获取更改日历的状态
<a name="change-calendar-getstate"></a>

您可以在 Change Calendar（AWS Systems Manager 中的一项工具）中获取日历的整体状态或者日历在特定时间的状态。您还可以显示日历状态下次从 `OPEN` 更改为 `CLOSED`（或反之）的时间。

**注意**  
有关将 Change Calendar 与 Amazon EventBridge 集成以自动监控日历状态变化的信息，请参阅[Change Calendar 与 Amazon EventBridge 集成](monitoring-systems-manager-event-examples.md#change-calendar-eventbridge-integration)。EventBridge 集成在日历状态转换时提供事件驱动的通知，补充基于轮询的 `GetCalendarState` API 操作方法。

您只能使用 `GetCalendarState` API 操作完成此任务。本节中的过程使用 AWS Command Line Interface (AWS CLI)。

**获取更改日历的状态**
+ 运行以下命令，以显示一个或多个日历在特定时间的状态。`--calendar-names` 参数是必需项，但 `--at-time` 是可选项。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

  ```
  aws ssm get-calendar-state \
      --calendar-names "Calendar_name_or_document_ARN_1" "Calendar_name_or_document_ARN_2" \
      --at-time "ISO_8601_time_format"
  ```

  示例如下：

  ```
  aws ssm get-calendar-state \
      --calendar-names "arn:aws:ssm:us-east-2:123456789012:document/MyChangeCalendarDocument" "arn:aws:ssm:us-east-2:123456789012:document/SupportOffHours" \
      --at-time "2020-07-30T11:05:14-0700"
  ```

------
#### [ Windows ]

  ```
  aws ssm get-calendar-state ^
      --calendar-names "Calendar_name_or_document_ARN_1" "Calendar_name_or_document_ARN_2" ^
      --at-time "ISO_8601_time_format"
  ```

  示例如下：

  ```
  aws ssm get-calendar-state ^
      --calendar-names "arn:aws:ssm:us-east-2:123456789012:document/MyChangeCalendarDocument" "arn:aws:ssm:us-east-2:123456789012:document/SupportOffHours" ^
      --at-time "2020-07-30T11:05:14-0700"
  ```

------

  此命令会返回如下信息。

  ```
  {
      "State": "OPEN",
      "AtTime": "2020-07-30T16:18:18Z",
      "NextTransitionTime": "2020-07-31T00:00:00Z"
  }
  ```

  结果显示指定日历条目（由您的账户拥有或与您的账户共享）在 `--at-time` 的值所指定时间的日历状态（无论日历的类型为 `DEFAULT_OPEN` 还是 `DEFAULT_CLOSED`），以及下一次转换的时间。如果您不添加 `--at-time` 参数，则使用当前时间。
**注意**  
如果在一个请求中指定了多个日历，则仅当该请求中的所有日历都处于打开状态时，该命令才会返回 `OPEN` 的状态。如果该请求中的一个或多个日历处于关闭状态，则返回的状态为 `CLOSED`。

# 向自动化运行手册添加 Change Calendar 依赖关系
<a name="systems-manager-change-calendar-automations"></a>

要让 Automation 操作遵循 Change Calendar（AWS Systems Manager 中的一项工具），请在使用 [`aws:assertAwsResourceProperty`](automation-action-assertAwsResourceProperty.md) 操作的 Automation 运行手册中添加一个步骤。将该操作配置为运行 `GetCalendarState` 以验证指定的日历条目是否处于所需状态（`OPEN` 或 `CLOSED`）。只有在日历状态为 `OPEN` 时才允许自动化运行手册继续执行下一步。以下是基于 YAML 的示例，摘录了只有当日历状态与在 `DesiredValues` 中指定的状态 `OPEN` 匹配时，才能继续到下一步 `LaunchInstance` 的自动化运行手册。

示例如下：

```
mainSteps:
  - name: MyCheckCalendarStateStep
    action: 'aws:assertAwsResourceProperty'
    inputs:
      Service: ssm
      Api: GetCalendarState
      CalendarNames: ["arn:aws:ssm:us-east-2:123456789012:document/SaleDays"]
      PropertySelector: '$.State'
      DesiredValues:
      - OPEN
    description: "Use GetCalendarState to determine whether a calendar is open or closed."
    nextStep: LaunchInstance
  - name: LaunchInstance
    action: 'aws:executeScript'
    inputs:
      Runtime: python3.11 
...
```

# 排除 Change Calendar 问题
<a name="change-calendar-troubleshooting"></a>

利用以下信息，帮助排查Change Calendar（AWS Systems Manager 中的一项工具）出现的问题。

**Topics**
+ [“Calendar import failed (日历导入失败)”错误](#change-manager-troubleshooting-1)

## “Calendar import failed (日历导入失败)”错误
<a name="change-manager-troubleshooting-1"></a>

**问题**：在导入 iCalendar (`.ics`) 文件时，系统报告日历导入失败。
+ **解决方案 1** – 确保您导入的是从受支持的第三方日历提供程序导出的文件，受支持的第三方日历提供程序包括以下几个：
  + Google 日历（[导出说明](https://support.google.com/calendar/answer/37111)）
  + Microsoft Outlook（[导出说明](https://support.microsoft.com/en-us/office/export-an-outlook-calendar-to-google-calendar-662fa3bb-0794-4b18-add8-9968b665f4e6)）
  + iCloud 日历（[导出指令](https://support.apple.com/guide/calendar/import-or-export-calendars-icl1023/mac)）
+ **解决方案 2** – 如果源日历包含任何重复性事件，请确保没有取消或删除该事件的任何一次发生。目前，Change Calendar 不支持导入发生单次取消的重复性事件。要解决该问题，请从源日历中删除重复性事件，重新导出日历，再将该日历重新导入到 Change Calendar 中，然后使用 Change Calendar 界面添加该重复性事件。有关信息，请参阅[创建Change Calendar 事件](change-calendar-create-event.md)。
+ **解决方案 3** – 确保源日历至少包含一个事件。上载 `.ics` 不包含事件的文件不会成功。
+ **解决方案 4** – 如果系统报告导入因 `.ics` 过大而失败，请确保只导出有关日历条目的基本详细信息。如有必要，请减少用于导出的时间段的长度。
+ **解决方案 5** – 如果 Change Calendar 无法确定您导出的日历的时区，则当您尝试从 **Events (事件)** 选项卡中导入该日历时，您可能会收到以下消息：“Calendar import failed. Change Calendar couldn't locate a valid time zone.（日历导入失败，找不到有效时区。） 您可以从 Edit (编辑) 菜单中导入该日历。在本例中，请选择 **Actions (操作)、Edit (编辑)**，然后尝试从 **Edit calendar (编辑日历)** 页面导入该文件。
+ **解决方案 6** – 请勿编辑 `.ics` 文件，然后再导入。尝试修改文件的内容可能会损坏日历数据。如果您在尝试导入之前修改了文件，则请再次从源日历导出日历，然后重新尝试上载。

# AWS Systems Manager Change Manager
<a name="change-manager"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

Change Manager（AWS Systems Manager 中的一项工具）是一个企业变更管理框架，用于请求、批准、实施和报告应用程序配置及基础设施的操作变更。如果您使用 AWS Organizations，可从单个*委托管理员账户*管理多个 AWS 账户 和整个 AWS 区域中的更改。或者，也可使用*本地账户*管理单个 AWS 账户 的更改。使用 Change Manager 可管理对 AWS 资源和本地部署资源的变更。要开始使用 Change Manager，请打开 [Systems Manager 控制台](https://console.aws.amazon.com//systems-manager/change-manager)。在导航窗格中，请选择 **Change Manager**。

借助 Change Manager，您可以使用预先批准的*更改模板*，帮助自动完成对资源的更改过程，并帮助避免在进行操作更改时出现意外结果。每个更改模板指定以下内容：
+ 在创建更改请求时，有一个或多个自动化运行手册可供用户选择。对您的资源进行的更改将在自动化 Runbook 中定义。您可以将自定义运行手册或 [AWS 托管运行手册](automation-documents-reference.md)包含在您创建的更改模板中。当用户创建更改请求时，他们可以选择要在该请求中包含哪一个可用的运行手册。此外，您还可以创建更改模板，让提出请求的用户在更改请求中指定任何运行手册。
+ 账户中的用户，必须审核使用该更改模板提出的更改请求。
+ Amazon Simple Notification Service (Amazon SNS) 主题，用于通知指定审批人员，更改请求已准备好进行审核。
+ Amazon CloudWatch 告警，用于监控运行手册工作流。
+ Amazon SNS 主题，用于针对使用更改模板创建的更改请求，发送有关状态变化的通知。
+ 要应用于更改模板的标签，用于对更改模板进行分类和筛选。
+ 是否可以在没有批准步骤的情况下运行从更改模板创建的更改请求（自动批准的请求）。

通过与 Systems Manager 中的另一项工具 Change Calendar 集成，Change Manager 还可以帮助您安全地实施更改，同时避免计划与重要业务事件发生冲突。Change Manager 与 AWS Organizations 和 AWS IAM Identity Center 集成，可帮助您使用现有的身份管理系统从单个账户管理整个组织中的更改。您可以从 Change Manager 监控更改进度，并审核整个组织中的操作更改，从而提高可见性、改善问责制。

Change Manager 为您的[持续集成](https://aws.amazon.com/devops/continuous-integration) (CI) 实践和[持续交付](https://aws.amazon.com/devops/continuous-delivery) (CD) 方法补充了安全控制措施。Change Manager 不适用于作为自动发布流程（例如 CI/CD 管道）的组成部分进行的更改，除非存在例外情况，或者需要批准。

## Change Manager 的工作原理
<a name="how-change-manager-works"></a>

在确定需要标准或紧急操作更改时，组织中的某个人员会根据为在您的组织或账户中使用而创建的更改模板之一创建更改请求。

如果请求的更改需要手动批准，Change Manager 将通过 Amazon SNS 通知来通知指定的审批人员，更改请求已准备好供其审核。您可以在更改模板中为更改请求指定审批者，也可以让用户在更改请求本身中指定审批者。您可以将不同的审核人员分配给不同的模板。例如，分配一个用户、用户组或 AWS Identity and Access Management (IAM) 角色，他们必须批准对托管式节点的更改请求；而对数据库更改，则分配另一个用户、组或 IAM 角色。如果更改模板允许自动审批，并且请求者的用户策略不禁止它，则用户还可以选择为其请求运行自动化运行手册，而无需审核步骤（更改冻结事件除外）。

对于每个更改模板，您可以添加最多五个级别的审批人员。例如，您可能要求技术审核人员先批准根据更改模板创建的更改请求，然后需要一个或多个经理的第二级批准。

Change Manager 已与 [AWS Systems Manager Change Calendar](systems-manager-change-calendar.md) 集成。当请求的更改获得批准后，系统将首先确定该请求是否与其他已计划的业务活动冲突。如果检测到冲突，Change Manager 可以阻止更改，或在启动运行手册工作流之前要求进行额外批准。例如，您可能只允许在工作时间进行更改，以确保团队可以管理任何意外问题。对于请求在上述时间以外运行的任何更改，您可以要求更高级别的管理人员以*更改冻结审批人员*的形式批准。对于紧急更改，Change Manager 可以跳过检查 Change Calendar 是否存在冲突或在批准更改请求后阻止事件的步骤。

当需要实施已批准的更改时，Change Manager 将运行在关联的更改请求中指定的自动化运行手册。在运行手册工作流运行时，只允许在已批准的更改请求中定义的操作。这种方法有助于您避免在实施更改时出现意外结果。

除了限制在运行手册工作流运行时可以进行的更改之外，Change Manager 还可以帮助您控制并发和错误阈值。您可以选择运行手册工作流一次可在多少个资源上运行，更改一次可在多少个账户中运行，以及在停止流程和（如果运行手册包含回滚脚本）回滚之前允许多少次故障。您还可以使用 CloudWatch 告警监控正在进行的更改的进度。

运行手册工作流完成后，您可以查看有关所做更改的详细信息。这些详细信息包括更改请求的原因、使用的更改模板、请求和批准更改的人员，以及更改的实施方式。

**更多信息**  
在 *AWS 新闻博客*上[介绍 AWS Systems ManagerChange Manager](https://aws.amazon.com/blogs/aws/introducing-systems-manager-change-manager/)

## 我的操作如何从 Change Manager 获益？
<a name="change-manager-benefits"></a>

Change Manager 具有以下优势：
+ **降低服务中断和停机风险**

  Change Manager 可以确保在运行手册工作流运行时，仅实施已批准的更改，从而使操作更改更安全。您可以阻止计划外和未经审核的更改。Change Manager 可以帮助您避免由于人为错误导致的多种类型的意外结果，这些结果需要花费宝贵时间进行研究和回溯。
+ **获取更改历史记录的详细审核和报告**

  Change Manager 提供了一种一致的问责制方法，用于报告和审核在整个组织中所做的更改、更改的目的，以及与批准和实施这些更改的人员有关的详细信息。
+ **避免计划冲突或违规**

  Change Manager 可以根据您的组织的活动更改日历来检测计划冲突，例如假日事件或新产品上市。您可以允许运行手册工作流仅在工作时间运行，也可以仅在获得额外批准的情况下才允许它们运行。
+ **使更改要求适应不断变化的业务**

  在不同的业务期间，您可以实施不同的更改管理要求。例如，在月末报告、纳税季节或其他关键业务期间，您可以阻止更改，或对可能带来不必要的运营风险的更改要求董事级批准。
+ **集中管理多个账户的更改**

  通过与 Organizations 集成，Change Manager 使您可以通过单个委托管理员账户管理所有组织单位 (OU) 中的更改。您可以启用 Change Manager，与您的整个组织一起使用，也可以仅与您的部分 OU 一起使用。

## 谁应该使用 Change Manager？
<a name="change-manager-who"></a>

Change Manager 适用于以下 AWS 客户和组织：
+ 任何希望改善对其云环境或本地环境所做操作更改的安全性和治理性的 AWS 客户。
+ 希望提高多个团队间的协作和可见性，通过避免停机提高应用程序可用性，以及降低与手动和重复性任务相关的风险的组织。
+ 必须遵循更改管理的最佳做法的组织。
+ 对于其应用程序配置和基础设施所做的更改，需要完全可审核的历史记录的客户。

## Change Manager 的主要功能是什么？
<a name="change-manager-features"></a>

Change Manager 包含以下主要功能：
+ **对更改管理最佳做法的综合支持**

  借助 Change Manager，您可以将所选择的更改管理最佳做法应用于您的操作。您可以选择启用选项：
  + 检查 Change Calendar，以查看事件当前是否受到限制，以便仅在已打开日历期间进行更改。
  + 在获得更改冻结审批人员额外批准的情况下，允许在受限事件期间进行更改。
  + 要求为所有更改模板指定 CloudWatch 告警。
  + 要求在您的账户中创建的所有更改模板经过审核和批准，然后才能使用它们创建更改请求。
+ **针对已关闭日历期间和紧急更改请求的不同批准路径**

  您可以允许一个选项来检查受限事件的 Change Calendar，并阻止已批准的更改请求，直到事件完成为止。但是，您也可以指定第二组审批人员，即更改冻结审批人员，即使日历已关闭，他们也可以允许进行更改。您还可以创建紧急更改模板。从紧急更改模板创建的更改请求仍然需要常规批准，但不受日历限制的约束，也不需要更改冻结批准。
+ **控制如何以及何时开始运行手册工作流**

  运行手册工作流可以根据计划开始，也可以在批准完成后立即开始（受日历限制规则约束）。
+ **内置通知支持**

  指定您的组织中应该审核和批准更改模板及更改请求的人员。将 Amazon SNS 主题分配给更改模板，以便向该主题的订阅者发送与使用该更改模板创建的更改请求的状态变化有关的通知。
+ **与 AWS Systems Manager Change Calendar 集成**

  Change Manager 允许管理员限制在指定时间段内的计划更改。例如，您可以创建一个策略，该策略仅允许在工作时间进行更改，以确保团队有时间处理任何问题。您还可以在重要业务活动期间限制更改。例如，零售业务可在大型销售活动期间限制更改。您还可以在受限时段期间内要求获得额外批准。
+ **与 AWS IAM Identity Center 和 Active Directory 支持集成**

  借助 IAM Identity Center 集成，您的组织成员可以访问 AWS 账户，并使用 Systems Manager 基于通用用户身份管理其资源。使用 IAM Identity Center，您可以分配对整个 AWS 中账户的用户访问权限。

  通过与 Active Directory 集成，可以指定 Active Directory 账户中的用户担任为 Change Manager 操作创建的更改模板的审批人员。
+ **与 Amazon CloudWatch 告警集成**

  Change Manager 与 CloudWatch 告警集成。Change Manager 可在运行手册工作流期间侦听 CloudWatch 告警，并执行为相应告警定义的任何操作，包括发送通知。
+ **与 AWS CloudTrail Lake 集成**

  通过在 AWS CloudTrail Lake 中创建事件数据存储，您可以查看有关您的账户或组织中运行的变更请求所做更改的可审批信息。存储的事件信息包括以下详细信息：
  + 运行的 API 操作
  + 这些操作所包含的请求参数
  + 运行该操作的用户
  + 在此过程中更新的资源
+ **与 AWS Organizations 集成**

  使用 Organizations 提供的跨账户功能，您可以使用委托管理员账户来管理您的组织内 OU 中的 Change Manager 操作。在您的 Organizations 管理账户中，可以指定哪个账户作为委托管理员账户。您还能够控制可在您的哪些 OU 中使用 Change Manager。

## 使用 Change Manager 是否需要收取费用？
<a name="change-manager-cost"></a>

是的。Change Manager 是按使用量付费的。您仅需按实际用量付费。有关更多信息，请参阅 [AWS Systems Manager 定价](https://aws.amazon.com/systems-manager/pricing/)。

## Change Manager 的主要组件是什么？
<a name="change-manager-primary-components"></a>

用于管理组织或账户中的更改过程的 Change Manager 组件包括以下内容：

### 委托管理员账户
<a name="change-manager-what-is-delegated-account"></a>

如果您在整个组织中使用 Change Manager，则将使用委托管理员账户。此 AWS 账户被指定为管理包括 Change Manager 在内的整个 Systems Manager 中的操作活动的账户。委托管理员账户可以管理整个组织中的更改活动。在将组织设置为使用 Change Manager 时，可以指定您的哪些账户以此角色提供服务。委托管理员账户必须是其分配到的组织单位 (OU) 的唯一成员。如果您仅将 Change Manager 用于单个AWS 账户，则不需要委托管理员账户。

**重要**  
如果您在整个组织中使用 Change Manager，我们建议始终从委托管理员账户进行更改。虽然您可以从组织中的其他账户进行更改，但这些更改不会在委派管理员账户中报告，也无法从该账户查看。

### 更改模板
<a name="change-manager-what-is-change-template"></a>

更改模板是 Change Manager 中的一个配置设置集合，它定义了所需的批准、可用的运行手册和更改请求的通知选项等内容。

您可以要求您的组织或账户中的用户创建的更改模板经过批准流程，然后才能使用这些模板。

Change Manager 支持两种类型的更改模板。对于基于*紧急更改模板*，请求的更改可以进行，即使在 Change Calendar。对于基于*标准更改模板*，则无法进行请求的更改，如果 Change Calendar 除非收到指定的额外批准*更改冻结事件*审批。

### 更改请求
<a name="change-manager-what-is-change-request"></a>

更改请求是 Change Manager 中的一个请求，旨在运行更新您的 AWS 或本地环境中一个或多个资源的自动化运行手册。更改请求是使用更改模板创建的。

在创建更改请求时，您的组织或账户中的一个或多个审批人员必须审核和批准该请求。如果没有获得所需的批准，则不允许运行应用您请求的更改的运行手册工作流。

在系统中，更改请求是 AWS Systems Manager OpsCenter 中一种类型的 OpsItem。不过，`/aws/changerequest` 类型的 OpsItems 不会显示在 OpsCenter 中。作为 OpsItems，更改请求与其他类型的 OpsItems 一样，也受相同强制配额的约束。

此外，要以编程方式创建更改请求，不能调用 `CreateOpsItem` API 操作，而应使用 `[https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html)` API 操作。但必须先批准更改请求，而不能立即运行，并且 Change Calendar 中不能有任何阻止性事件阻碍工作流运行。当收到批准并且日历未被阻止（或者已经获得绕过阻止性日历事件的权限）时，`StartChangeRequestExecution` 操作才能完成。

### 运行手册工作流
<a name="change-manager-what-is-runbook-workflow"></a>

运行手册工作流是对您的云环境或本地环境中的目标资源进行所请求的更改的过程。每个更改请求都将指定一个自动化运行手册，用于进行所请求的更改。在获得所有所需的批准后，并且 Change Calendar 中不存在阻止性事件的情况下，运行手册工作流才能发生。如果已为特定日期和时间安排更改，即便已经获得所有批准并且日历未被阻止，运行手册工作流也将在到达计划时间后才会开始。

**Topics**
+ [Change Manager 的工作原理](#how-change-manager-works)
+ [我的操作如何从 Change Manager 获益？](#change-manager-benefits)
+ [谁应该使用 Change Manager？](#change-manager-who)
+ [Change Manager 的主要功能是什么？](#change-manager-features)
+ [使用 Change Manager 是否需要收取费用？](#change-manager-cost)
+ [Change Manager 的主要组件是什么？](#change-manager-primary-components)
+ [设置 Change Manager](change-manager-setting-up.md)
+ [使用 Change Manager](working-with-change-manager.md)
+ [审计和记录 Change Manager 活动](change-manager-auditing.md)
+ [排除 Change Manager 问题](change-manager-troubleshooting.md)

# 设置 Change Manager
<a name="change-manager-setting-up"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以使用 Change Manager（AWS Systems Manager 中的一项工具）来管理对整个组织的更改（按照 AWS Organizations 中的配置）或对单个 AWS 账户的更改。

如果您将 Change Manager 用于组织，请从主题 [为组织设置 Change Manager（管理账户）](change-manager-organization-setup.md) 开始，然后继续阅读 [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)。

如果您将 Change Manager 用于单个账户，则请直接阅读 [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)。

**注意**  
如果您首先将 Change Manager 用于某一单个账户，而后来又将该账户添加到允许 Change Manager 的组织单位，则您的单个账户设置将被忽略。

**Topics**
+ [为组织设置 Change Manager（管理账户）](change-manager-organization-setup.md)
+ [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)
+ [为 Change Manager 配置角色和权限](change-manager-permissions.md)
+ [控制对自动批准运行手册工作流的访问](change-manager-auto-approval-access.md)

# 为组织设置 Change Manager（管理账户）
<a name="change-manager-organization-setup"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

如果要将 Change Manager（AWS Systems Manager 中的一项工具）用于在 AWS Organizations 中设置的组织，则本主题中的任务适用。如果您仅要将 Change Manager 用于单个 AWS 账户，则请跳至主题 [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)。

在充当 Organizations 内*管理账户*的 AWS 账户 中执行本节中的任务。有关管理账户和其他 Organizations 概念的信息，请参阅 [AWS Organizations 术语和概念](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html)。

如果您需要打开 Organizations 并在继续操作之前将您的账户指定为管理账户，请参阅 *AWS Organizations 用户指南*中的[创建和管理组织](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_manage_org.html)。

**注意**  
此设置过程无法在以下 AWS 区域中执行：  
欧洲（米兰）(eu-south-1)
中东（巴林）(me-south-1)
非洲（开普敦）(af-south-1)
亚太地区（香港）(ap-east-1)
对于此过程，请确保您在管理账户中的其他区域工作。

在设置过程中，您要在Quick Setup（AWS Systems Manager 中的一项工具）中执行以下主要任务。
+ **任务 1：为您的组织注册委托管理员账户**

  使用 Change Manager 执行的、与更改相关的任务，在您的某一成员账户中进行管理，您将该账户指定为*委托管理员账户*。您为 Change Manager 注册的委托管理员账户，将成为您的所有 Systems Manager 操作的委托管理员账户。（您可以有多个用于其他 AWS 服务 的委托管理员账户。） 您的 Change Manager 委托管理员账户（与管理账户不同）可以管理整个组织的更改活动，包括更改模板、更改请求，以及对每个更改模板和更改请求的批准。在委托管理员账户中，您还可以为 Change Manager 操作指定其他配置选项。
**重要**  
委托管理员账户必须是其在 Organizations 中分配到的组织单位 (OU) 的唯一成员。
+ **任务 2：为您要用于 Change Manager 操作的更改请求者角色或自定义工作职能定义和指定运行手册访问策略**

  为在 Change Manager 中创建更改请求，则必须向您的成员账户中的用户授予 AWS Identity and Access Management (IAM) 权限，这些权限允许他们仅访问自动化运行手册，以及更改您选择提供给他们的模板。
**注意**  
当用户创建更改请求时，他们首先需要选择更改模板。此更改模板可能会提供多个运行手册，但用户只能为每个更改请求选择一个运行手册。还可以将更改模板配置为允许用户在其请求中包含任何可用的运行手册。

  要授予所需权限，Change Manager 使用了*工作职能*的概念，IAM 也使用了此概念。但是，与 IAM 中的 [AWS 工作职能托管策略](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_job-functions.html)不同，您既可以指定 Change Manager 工作职能的名称，也可以为这些工作职能指定 IAM 权限。

  在配置工作职能时，我们建议创建自定义策略，并仅提供执行更改管理任务所需的权限。例如，您可以根据定义的*工作职能*指定权限，以限制用户访问特定的运行手册集。

  例如，您可以创建名为 `DBAdmin` 的工作职能。对于此工作职能，您可以仅授予与 Amazon DynamoDB 数据库相关的运行手册所需的权限，例如 `AWS-CreateDynamoDbBackup` 和 `AWSConfigRemediation-DeleteDynamoDbTable`。

  作为另一个示例，您可能希望仅授予某些用户使用与 Amazon Simple Storage Service (Amazon S3) 存储桶相关的运行手册所需的权限，例如 `AWS-ConfigureS3BucketLogging` 和 `AWSConfigRemediation-ConfigureS3BucketPublicAccessBlock`。

  Change Manager 的 Quick Setup 中的配置过程还会为您提供一组完整 Systems Manager 管理权限，以应用于您创建的管理角色。

  您部署的每一项 Change Manager Quick Setup 配置，都会在您的委托管理员账户中创建一项工作职能，这些工作职能拥有在您选择的组织单位中运行 Change Manager 模板和自动化运行手册的权限。您最多可以为 Change Manager 创建 15 项 Quick Setup 配置。
+ **任务 3：选择您的组织中哪些成员账户能够使用 Change Manager**

  您可以将 Change Manager 用于在 Organizations 中设置的所有组织单位内的所有成员账户，以及所有 AWS 区域（成员账户在其中进行操作）内的所有成员账户。如果愿意，您可以改为仅将 Change Manager 用于您的某些组织单位。

**重要**  
在开始此过程之前，我们强烈建议您认真阅读其步骤，以了解您所做的配置选择和所授予的权限。特别是应规划您要创建的自定义工作职能，以及您分配给各项工作职能的权限。这可确保稍后将您创建的工作职能策略附加到各个用户、用户组或 IAM 角色时，仅会向他们授予您希望他们拥有的权限。  
作为最佳时间，首先使用 AWS 账户 管理员登录来设置委托管理员账户。然后，在创建更改模板并确定每个更改模板使用的运行手册之后，配置工作职能及其权限。

要设置 Change Manager 以便用于组织，请在 Systems Manager 控制台的 Quick Setup 区域中执行以下任务。

对于要为您的组织创建的每个工作职能，均应重复此任务。您创建的每项工作职能均可拥有针对一组不同组织单位的权限。

**在 Organizations 管理账户中为 Change Manager 设置组织**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在 **Change Manager** 选项卡上，选择 **Create**（创建）。

1. 对于 **Delegated administrator account (委托管理员账户)**，输入要用于在 Change Manager 中管理更改模板、更改请求和运行手册工作流的 AWS 账户 的 ID。

   如果您之前已为 Systems Manager 指定了委托管理员账户，则此字段中已报告其 ID。
**重要**  
委托管理员账户必须是其在 Organizations 中分配到的组织单位 (OU) 的唯一成员。  
如果您注册的委托管理员账户后来从该角色注销，则系统会同时删除其管理 Systems Manager 操作的权限。请注意，您必须返回 Quick Setup，指定不同的委托管理员账户，然后再次指定所有工作职能和权限。  
如果您在整个组织中使用 Change Manager，我们建议始终从委托管理员账户进行更改。虽然您可以从组织中的其他账户进行更改，但这些更改不会在委派管理员账户中报告，也无法从该账户查看。

1. 在 **Permissions to request and make changes (请求和进行更改的权限)** 部分中，执行以下操作。
**注意**  
您创建的每一项部署配置仅会为一项工作功能提供权限策略。您可以在以后返回到 Quick Setup，在创建要在操作中使用的更改模板时创建更多工作职能。

   **创建管理角色** – 对于拥有所有 AWS 操作的 IAM 权限的管理员工作职能，请执行以下操作。
**重要**  
授予用户完整管理权限应该谨慎行事，并且仅当用户的角色需要完整的 Systems Manager 访问权限时才能执行。有关 Systems Manager 访问权限的安全注意事项的重要信息，请参阅 [对 AWS Systems Manager 进行身份和访问管理](security-iam.md) 和 [Systems Manager 的安全最佳实践](security-best-practices.md)。

   1. 对于 **Job function (工作职能)**，请输入用于标识此角色及其权限的名称，例如 **MyAWSAdmin**。

   1. 对于 **Role and permissions option (角色和权限选项)**，请选择 **Administrator permissions (管理员权限)**。

   **创建其他工作职能** – 要创建非管理角色，请执行以下操作：

   1. 对于 **Job function (工作职能)**，输入用于标识此角色的名称，并建议其权限。您选择的名称应能表示您将为其提供权限的运行手册的范围，例如 `DBAdmin` 或 `S3Admin`。

   1. 对于 **Role and permissions option (角色和权限选项)**，请选择 **Custom permissions (自定义权限)**。

   1. 在 **Permissions policy editor (权限策略编辑器)** 中，以 JSON 格式输入 IAM 权限，以向此工作职能授予这些权限。
**提示**  
我们建议您使用 IAM policy 编辑器构建策略，然后将策略 JSON 粘贴到 **Permissions policy**（权限策略）字段中。

**示例策略：DynamoDB 数据库管理**  
例如，您可以从策略内容开始，该内容为使用工作职能需要访问的 Systems Manager 文档（SSM 文档）提供权限。下面是一段示例策略内容，该内容将授予对与 DynamoDB 数据库相关的所有 AWS 托管式自动化运行手册和在位于美国东部（俄亥俄）区域 (`us-east-2`) 的示例 AWS 账户 `123456789012` 中创建的两个更改模板的访问权限。

   该策略还包括对 [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html) 操作的权限，在 Change Calendar 中创建更改请求时需要该权限。
**注意**  
此示例并不全面。可能需要额外的权限才能使用其他 AWS 资源，例如数据库和节点。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:CreateDocument",
                   "ssm:DescribeDocument",
                   "ssm:DescribeDocumentParameters",
                   "ssm:DescribeDocumentPermission",
                   "ssm:GetDocument",
                   "ssm:ListDocumentVersions",
                   "ssm:ModifyDocumentPermission",
                   "ssm:UpdateDocument",
                   "ssm:UpdateDocumentDefaultVersion"
               ],
               "Resource": [
                   "arn:aws:ssm:us-east-1:*:document/AWS-CreateDynamoDbBackup",
                   "arn:aws:ssm:us-east-1:*:document/AWS-AWS-DeleteDynamoDbBackup",
                   "arn:aws:ssm:us-east-1:*:document/AWS-DeleteDynamoDbTableBackups",
                   "arn:aws:ssm:us-east-1:*:document/AWSConfigRemediation-DeleteDynamoDbTable",
                   "arn:aws:ssm:us-east-1:*:document/AWSConfigRemediation-EnableEncryptionOnDynamoDbTable",
                   "arn:aws:ssm:us-east-1:*:document/AWSConfigRemediation-EnablePITRForDynamoDbTable",
                   "arn:aws:ssm:us-east-1:111122223333:document/MyFirstDBChangeTemplate",
                   "arn:aws:ssm:us-east-1:111122223333:document/MySecondDBChangeTemplate"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "ssm:ListDocuments",
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": "ssm:StartChangeRequestExecution",
               "Resource": [
                   "arn:aws:ssm:us-east-1:111122223333:document/*",
                   "arn:aws:ssm:us-east-1:111122223333:automation-execution/*"
               ]
           }
       ]
   }
   ```

------

   有关 IAM policy 的更多信息，请参阅《IAM 用户指南》中的 [AWS 资源的访问权限管理](https://docs.aws.amazon.com/IAM/latest/UserGuide/access.html)和[创建 IAM policy](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_create.html)。

1. 在 **Targets (目标)** 部分中，请选择是将对您创建的工作职能的权限授予整个组织，还是仅授予部分组织单位。

   如果选择 **Entire organization (整个组织)**，请继续执行步骤 9。

   如果选择 **Custom (自定义)**，则请继续执行步骤 8。

1. 在 **Target OUs (目标 OU)** 部分中，选中要使用 Change Manager 的组织单位的复选框。

1. 选择 **Create（创建）**。

当系统为您的组织完成 Change Manager 设置后，它将显示您的部署摘要。此摘要信息包含为您配置的工作职能创建的角色的名称。例如 `AWS-QuickSetup-SSMChangeMgr-DBAdminInvocationRole`。

**注意**  
Quick Setup 将使用 AWS CloudFormation StackSets 来部署您的配置。您还可以查看有关 CloudFormation 控制台中已完成的部署配置的信息。有关 StackSets 的信息，请参阅 *AWS CloudFormation 用户指南*中的[使用 AWS CloudFormation StackSets](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/what-is-cfnstacksets.html)。

下一步是配置其他 Change Manager 选项。您可以在您的委托管理员账户或您允许使用 Change Manager 的组织单位内的任何账户中完成此任务。您可以配置多个选项，例如选择用户身份管理选项、指定哪些用户可以审核及批准或拒绝更改模板和更改请求，以及选择允许组织使用哪些最佳实践选项。有关信息，请参阅[配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)。

# 配置 Change Manager 选项和最佳实践
<a name="change-manager-account-setup"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

无论是在整个组织中还是在单个 AWS 账户中使用 Change Manager（AWS Systems Manager 中的一项工具），都必须执行本节中的任务。

如果您将 Change Manager 用于组织，可以在您的委托管理员账户或您允许使用 Change Manager 的组织单位内的任何账户中执行以下任务。

**Topics**
+ [任务 1：配置 Change Manager 用户身份管理和模板审核人员](#cm-configure-account-task-1)
+ [任务 2：配置 Change Manager 更改冻结事件审批人员和最佳实践](#cm-configure-account-task-2)
+ [为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)

## 任务 1：配置 Change Manager 用户身份管理和模板审核人员
<a name="cm-configure-account-task-1"></a>

在首次访问 Change Manager 时，请执行此过程中的该任务。您可以在以后更新这些配置设置，方法是返回到 Change Manager，然后选择 **Settings (设置)** 选项卡上的 **Edit (编辑)**。

**配置 Change Manager 用户身份管理和模板审核人员**

1. 登录到 AWS 管理控制台。

   如果您将 Change Manager 用于组织，请使用您的委托管理员账户的凭证登录。用户必须拥有更新 Change Manager 设置的必要 AWS Identity and Access Management（IAM）权限。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 在服务主页上，根据可用选项，执行以下操作之一：
   + 如果您将 Change Manager 用于 AWS Organizations，请选择 **Set up delegated account (设置委托账户)**。
   + 如果您将 Change Manager 用于单个 AWS 账户，请选择 **Set up Change Manager (设置 Change Manager)**。

     - 或者 -

     选择 **Create sample change request (创建示例更改请求)**、**Skip (跳过)**，然后选择 **Settings (设置)** 选项卡。

1. 对于 **User identity management (用户身份管理)**，请选择以下选项之一。
   + **AWS Identity and Access Management（IAM）**- 确定提出和批准请求以及使用您的现有用户、组和角色在 Change Manager 中执行其他操作的用户的身份。
   + **AWS IAM Identity Center（IAM Identity Center）** – 允许 [IAM Identity Center](https://docs.aws.amazon.com/singlesignon/latest/userguide/) 创建和管理身份，或连接到您的现有身份源，以确定在 Change Manager 中执行操作的用户的身份。

1. 在 **Template reviewer notification**（模板审核人员通知）部分，指定 Amazon Simple Notification Service (Amazon SNS) 主题，这些主题将要用于通知模板审核人员新的更改模板或更改模板版本已准备就绪可供审核。请确保已将您选择的 Amazon SNS 主题配置为向您的模板审核人员发送通知。

   有关为更改模板审核人员通知创建和配置 Amazon SNS 主题的信息，请参阅 [为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

   1. 要为模板审核人员通知指定 Amazon SNS 主题，请选择以下选项之一：
      + **Enter an SNS Amazon Resource Name (ARN) (输入 SNS Amazon 资源名称 (ARN))** – 对于 **Topic ARN (主题 ARN)**，请输入现有 Amazon SNS 主题的 ARN。此主题可以位于您组织的任何账户中。
      + **Select an existing SNS topic（选择现有 SNS 主题）** – 对于 **Target notification topic（设定通知主题目标）**，选择您当前的 AWS 账户中现有 Amazon SNS 主题的 ARN。（如果您尚未在当前的 AWS 账户 和 AWS 区域 中创建任何 Amazon SNS 主题，则此选项不可用。）
**注意**  
您选择的 Amazon SNS 主题必须被配置为指定它所发送的通知，以及接收这些通知的订阅者。其访问策略还必须向 Systems Manager 授予权限，以便 Change Manager 可以发送通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

   1. 选择 **Add notification（添加通知）**。

1. 在 **Change template reviewers (更改模板审核人员)** 部分中，在您的组织或账户选择用户审核新的更改模板或更改模板版本，然后才能在操作中使用它们。

   更改模板审核人员负责验证其他用户提交的、要在 Change Manager 运行手册工作流中使用的模板的适用性和安全性。

   可以通过执行以下操作选择更改模板审核人员：

   1. 选择 **Add (添加)**。

   1. 选中您要指定为更改模板审核人员的每个用户、组或 IAM 角色名称旁边的复选框。

   1. 选择 **Add approvers (添加审批人员)**。

1. 选择 **Submit (提交)**。

 完成此初始设置过程后，请按 [任务 2：配置 Change Manager 更改冻结事件审批人员和最佳实践](#cm-configure-account-task-2) 中的步骤操作，配置其他 Change Manager 设置和最佳实践。

## 任务 2：配置 Change Manager 更改冻结事件审批人员和最佳实践
<a name="cm-configure-account-task-2"></a>

在您完成 [任务 1：配置 Change Manager 用户身份管理和模板审核人员](#cm-configure-account-task-1) 中的步骤之后，可为*更改冻结事件*期间的更改请求指定额外的审核人员，还可指定您希望允许哪些可用的最佳实践用于 Change Manager 操作。

更改冻结事件意味着在当前更改日历中设置限制（AWS Systems Manager Change Calendar 中的日历状态为 `CLOSED`）。在这些情况下，除了更改请求的常规审批人员以外，或者如果更改请求是使用允许自动批准的模板创建的，更改冻结审批人员必须为此更改请求的运行授予权限。如果他们不这样做，则不会处理该更改，直到日历状态再次为 `OPEN` 时为止。

**配置 Change Manager 更改冻结事件审批人员和最佳实践**

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Settings (设置)** 选项卡，然后选择 **Edit (编辑)**。

1. 在 **Approvers for change freeze events (更改冻结事件的审批人员)** 部分中，选择您的组织或账户中可以批准更改即便在 Change Calendar 中使用的日历当前处于 CLOSED (已关闭) 状态也能运行的用户。
**注意**  
要允许更改冻结审核，必须打开 **Best practices (最佳实践)** 中的 **Check Change Calendar for restricted change events (检查更改日历中的受限更改事件)** 选项。

   通过执行以下操作，选择更改冻结事件的审批人员：

   1. 选择**添加**。

   1. 选中您要指定为更改冻结事件审批人员的每个用户、组或 IAM 角色名称旁边的复选框。

   1. 选择 **Add approvers (添加审批人员)**。

1. 在 **Best practices (最佳实践)** 部分中，启用您要针对以下各个选项强制实施的最佳实践。
   + 选项：**Check Change Calendar for restricted change events (检查更改日历中的受限更改事件)**

     要指定 Change Manager 检查 Change Calendar 中的日历，以确保更改不会已被计划的事件阻止，请首先选中 **Enabled (已启用)** 复选框，然后从 **Change Calendar (更改日历)** 列表中选择要检查受限事件的日历。

     有关 Change Calendar 的更多信息，请参阅 [AWS Systems Manager Change Calendar](systems-manager-change-calendar.md)。
   + 选项：**SNS topic for approvers for closed events (用于已关闭事件的审批人员的 SNS 主题)**

     1. 选择以下选项之一，在您的账户中指定 Amazon Simple Notification Service (Amazon SNS) 主题，用于在更改冻结事件期间向审批人员发送通知。（请注意，您还必须在 **Best practices (最佳实践)** 上方的 **Approvers for change freeze events (更改冻结事件的审批人员)** 部分中指定审批人员。）
        + **Enter an SNS Amazon Resource Name (ARN) (输入 SNS Amazon 资源名称 (ARN))** – 对于 **Topic ARN (主题 ARN)**，请输入现有 Amazon SNS 主题的 ARN。此主题可以位于您组织的任何账户中。
        + **Select an existing SNS topic（选择现有 SNS 主题）** – 对于 **Target notification topic（设定通知主题目标）**，选择您当前的 AWS 账户中现有 Amazon SNS 主题的 ARN。（如果您尚未在当前的 AWS 账户 和 AWS 区域 中创建任何 Amazon SNS 主题，则此选项不可用。）
**注意**  
您选择的 Amazon SNS 主题必须被配置为指定它所发送的通知，以及接收这些通知的订阅者。其访问策略还必须向 Systems Manager 授予权限，以便 Change Manager 可以发送通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

     1. 选择 **Add notification（添加通知）**。
   + 选项：**Require monitors for all templates (所有模板都需要监控器)**

     如果您希望确保您的组织或账户的所有模板都指定 Amazon CloudWatch 告警来监控您的更改操作，请选中 **Enabled**（已启用）复选框。
   + 选项：**Require template review and approval before use (使用前需要审核和批准模板)**

     要确保在不基于已审核和已批准的模板的情况下，不创建任何更改请求，也不运行任何运行手册工作流，请选中 **Enabled (已启用)** 复选框。

1. 选择**保存**。

# 为 Change Manager 通知配置 Amazon SNS 主题
<a name="change-manager-sns-setup"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以将 Change Manager（AWS Systems Manager 中的一项工具）配置为针对与更改请求和更改模板有关的事件向 Amazon Simple Notiﬁcation Service（Amazon SNS）主题发送通知。要接收针对您向其添加了主题的 Change Manager 事件的通知，请完成以下任务。

**Topics**
+ [任务 1：创建并订阅 Amazon SNS 主题](#change-manager-sns-setup-create-topic)
+ [任务 2：更新 Amazon SNS 访问策略](#change-manager-sns-setup-encryption-policy)
+ [任务 3：（可选）更新 AWS Key Management Service 访问策略](#change-manager-sns-setup-KMS-policy)

## 任务 1：创建并订阅 Amazon SNS 主题
<a name="change-manager-sns-setup-create-topic"></a>

首先，必须创建一个 Amazon SNS 主题并订阅此主题。有关更多信息，请参阅 *Amazon Simple Notification Service 开发人员指南*中的[创建 Amazon SNS 主题](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)和[订阅 Amazon SNS 主题](https://docs.aws.amazon.com/sns/latest/dg/sns-tutorial-create-subscribe-endpoint-to-topic.html)。

**注意**  
要接收通知，您必须指定与委托管理员账户位于相同 AWS 区域 和 AWS 账户 的 Amazon SNS 主题的 Amazon Resource Name (ARN)。

## 任务 2：更新 Amazon SNS 访问策略
<a name="change-manager-sns-setup-encryption-policy"></a>

请使用以下过程更新 Amazon SNS 访问策略，以便 Systems Manager 能将 Change Manager 通知发布到您在“任务 1”中创建的 Amazon SNS 主题。如果不完成这项任务，Change Manager 将没有权限针对您为其添加主题的事件发送通知。

1. 访问 [https://console.aws.amazon.com/sns/v3/home](https://console.aws.amazon.com/sns/v3/home)，登录 AWS 管理控制台 并打开 Amazon SNS 控制台。

1. 在导航窗格中，选择 **Topics (主题)**。

1. 选择您在“任务 1”中创建的主题，然后选择 **Edit (编辑)**。

1. 展开**访问策略**。

1. 将以下 `Sid` 数据块添加并更新到现有策略中，并将每个*用户输入占位符*替换为您的信息。

   ```
   {
       "Sid": "Allow Change Manager to publish to this topic",
       "Effect": "Allow",
       "Principal": {
           "Service": "ssm.amazonaws.com"
       },
       "Action": "sns:Publish",
       "Resource": "arn:aws:sns:region:account-id:topic-name",
       "Condition": {
           "StringEquals": {
               "aws:SourceAccount": [
                   "account-id"
               ]
           }
       }
   }
   ```

   在现有 `Sid` 数据块后输入此数据块，然后针对您创建的主题，将 *region*、*account-id* 和 *topic-name* 替换为适当的值。

1. 选择**保存更改**。

现在，当您添加到主题中的事件类型发生时，系统将向 Amazon SNS 主题发送通知。

**重要**  
如果您已使用 AWS Key Management Service (AWS KMS) 服务器端加密密钥配置了 Amazon SNS 主题，则必须完成“任务 3”。

## 任务 3：（可选）更新 AWS Key Management Service 访问策略
<a name="change-manager-sns-setup-KMS-policy"></a>

如果您为 Amazon SNS 主题启用了 AWS Key Management Service (AWS KMS) 服务器端加密，则还必须更新您在配置该主题时选择的 AWS KMS key 的访问策略。请使用以下过程更新访问策略，以便 Systems Manager 能将 Change Manager 批准通知发布到您在“任务 1”中创建的 Amazon SNS 主题。

1. 访问 [https://console.aws.amazon.com/kms](https://console.aws.amazon.com/kms)，打开 AWS KMS 控制台。

1. 在导航窗格中，选择 **Customer managed keys (客户托管密钥)**。

1. 选择您在创建主题时选择的客户托管密钥的 ID。

1. 在 **Key Policy (密钥策略)** 部分中，选择 **Switch to policy view (切换到策略视图)**。

1. 选择**编辑**。

1. 在现有策略中的现有 `Sid` 块之一之后输入以下 `Sid` 块。将每个*用户输入占位符*替换为您自己的信息。

   ```
   {
       "Sid": "Allow Change Manager to decrypt the key",
       "Effect": "Allow",
       "Principal": {
           "Service": "ssm.amazonaws.com"
       },
       "Action": [
           "kms:Decrypt",
           "kms:GenerateDataKey*"
       ],
       "Resource": "arn:aws:kms:region:account-id:key/key-id",
       "Condition": {
           "StringEquals": {
               "aws:SourceAccount": [
                   "account-id"
               ]
           }
       }
   }
   ```

1. 现在，在资源策略中现有的 `Sid` 块之一之后输入以下 `Sid` 块，以帮助防止[跨服务混淆代理问题](https://docs.aws.amazon.com/IAM/latest/UserGuide/confused-deputy.html)。

   此块使用 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourcearn) 和 [https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_condition-keys.html#condition-keys-sourceaccount) 全局条件上下文键来限制 Systems Manager 向资源提供其他服务的权限。

   将每个*用户输入占位符*替换为您自己的信息。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Sid": "Configure confused deputy protection for AWS KMS keys used in Amazon SNS topic when called from Systems Manager",
               "Effect": "Allow",
               "Principal": {
                   "Service": "ssm.amazonaws.com"
               },
               "Action": [
                   "sns:Publish"
               ],
               "Resource": "arn:aws:sns:us-east-1:111122223333:topic-name",
               "Condition": {
                   "ArnLike": {
                       "aws:SourceArn": "arn:aws:ssm:us-east-1:111122223333:*"
                   },
                   "StringEquals": {
                       "aws:SourceAccount": "111122223333"
                   }
               }
           }
       ]
   }
   ```

------

1. 选择**保存更改**。

# 为 Change Manager 配置角色和权限
<a name="change-manager-permissions"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

默认情况下，Change Manager 没有对您的资源执行操作的权限。您必须使用 AWS Identity and Access Management (IAM) 服务角色或*担任角色*授予访问权限。该角色可以让 Change Manager 代表您安全地运行在批准的更改请求中指定的运行手册工作流。该角色向 AWS Security Token Service (AWS STS) [AssumeRole](https://docs.aws.amazon.com/STS/latest/APIReference/API_AssumeRole.html) 授予对 Change Manager 的信任。

通过向角色提供这些权限以代表企业中的用户行事，用户本身不需要被授予该权限数组。权限允许的操作仅限于批准的操作。

当您的账户或企业中的用户创建更改请求时，他们可以选择此担任角色来执行更改操作。

您可以为 Change Manager 创建新的担任角色，也可以利用所需的权限更新现有角色。

如果您需要为 Change Manager 创建一个服务角色，请完成以下任务。

**Topics**
+ [任务 1：为 Change Manager 创建担任角色策略](#change-manager-role-policy)
+ [任务 2：为 Change Manager 创建担任角色](#change-manager-role)
+ [任务 3：将 `iam:PassRole` 策略附加到其他角色](#change-manager-passpolicy)
+ [任务 4：向担任角色添加内联策略以调用其他 AWS 服务](#change-manager-role-add-inline-policy)
+ [任务 5：配置用户对 Change Manager 的访问权限](#change-manager-passrole)

## 任务 1：为 Change Manager 创建担任角色策略
<a name="change-manager-role-policy"></a>

使用以下过程创建将附加到您的 Change Manager 担任角色的策略。

**为 Change Manager 创建担任角色策略**

1. 访问：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)，打开 IAM 控制台。

1. 在导航窗格中选择 **Policies**，然后选择 **Create Policy**。

1. 在 **Create policy**（创建策略）页面上，选择 **JSON** 选项卡，将默认内容替换为以下内容，您将在以下步骤中针对自己的 Change Manager 操作对其进行修改。
**注意**  
如果要创建用于单个 AWS 账户 的策略，而不是具有多个账户和 AWS 区域 的企业，则可以省略第一个数据块。对于使用 Change Manager 的单个账户，不需要 `iam:PassRole` 权限。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::111122223333:role/AWS-SystemsManager-job-functionAdministrationRole",
               "Condition": {
                   "StringEquals": {
                       "iam:PassedToService": "ssm.amazonaws.com"
                   }
               }
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:DescribeDocument",
                   "ssm:GetDocument",
                   "ssm:StartChangeRequestExecution"
               ],
               "Resource": [
                   "arn:aws:ssm:us-east-1::document/template-name",
                   "arn:aws:ssm:us-east-1:111122223333:automation-execution/*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:ListOpsItemEvents",
                   "ssm:GetOpsItem",
                   "ssm:ListDocuments",
                   "ssm:DescribeOpsItems"
               ],
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 对于 `iam:PassRole` 操作，更新 `Resource` 值以包括为您的企业定义的所有工作职能的 ARN，您希望对这些工作职能授予启动运行手册工作流的权限。

1. 将 *region*、*account-id*、*template-name*、*delegated-admin-account-id* 和 *job-function* 占位符替换为 Change Manager 操作的值。

1. 对于第二个 `Resource` 语句，修改列表以包括要授予权限的所有更改模板。或者，指定 `"Resource": "*"` 为企业中的所有更改模板授予权限。

1. 选择**下一步：标签**。

1. （可选）添加一个或多个标签键值对，以组织、跟踪或控制此策略的访问权限。

1. 选择**下一步：审核**。

1. 在 **Review policy**（查看策略）页面上的 **Name**（名称）框中输入一个名称，例如 **MyChangeManagerAssumeRole**，然后输入可选描述。

1. 选择 **Create policy**（创建策略），然后继续转至 [任务 2：为 Change Manager 创建担任角色](#change-manager-role)。

## 任务 2：为 Change Manager 创建担任角色
<a name="change-manager-role"></a>

使用以下过程为 Change Manager 创建 Change Manager 担任角色（一种服务角色类型）。

**为 Change Manager 创建担任角色**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于 **Select trusted entity**（选择可信实体），完成以下选择：

   1. 对于**可信实体类型**，选择 **AWS 服务**。

   1. 对于**其他 AWS 服务 的应用场景**，选择 **Systems Manager**

   1. 选择 **Systems Manager**，如下图所示。  
![\[展示了将 Systems Manager 选为应用场景的选项屏幕截图。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/iam_use_cases_for_MWs.png)

1. 选择**下一步**。

1. 在 **Attached permissions policy**（附加的权限策略）页面上，搜索您在 [任务 1：为 Change Manager 创建担任角色策略](#change-manager-role-policy) 中创建的担任角色策略，比如 **MyChangeManagerAssumeRole**。

1. 选中担任角色策略名称旁边的复选框，然后选择 **Next: Tags**（下一步：标签）。

1. 对于**Role name**（角色名称），请输入新实例配置文件的名称，例如 **MyChangeManagerAssumeRole**。

1. （可选）对于 **Description**（描述），更新该实例角色的描述。

1. （可选）添加一个或多个标签键值对，以组织、跟踪或控制此角色的访问权限。

1. 选择**下一步：审核**。

1. （可选）对于 **Tags**（标签），添加一个或多个标签键值对，以组织、跟踪或控制此角色的访问，然后选择 **Create role**（创建角色）。系统将让您返回到 **角色** 页面。

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

1. 在**角色**页面中，选择刚刚创建的角色以打开**摘要**页面。

## 任务 3：将 `iam:PassRole` 策略附加到其他角色
<a name="change-manager-passpolicy"></a>

使用以下过程将 `iam:PassRole` 策略附加到 IAM 实例配置文件或 IAM 服务角色。（Systems Manager 服务使用 IAM 实例配置文件与 EC2 实例进行通信。对于[混合和多云](operating-systems-and-machine-types.md#supported-machine-types)环境中的非 EC2 托管式节点，改用 IAM 服务角色。）

通过附加 `iam:PassRole` 策略，Change Manager 服务可以在运行运行手册工作流时将担任角色权限传递给其他服务或 Systems Manager 工具。

**将 `iam:PassRole` 策略附加到 IAM 实例配置文件或服务角色**

1. 通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 搜索您创建的 Change Manager 担任角色（如 **MyChangeManagerAssumeRole**），然后选择其名称。

1. 在担任角色的 **Summary**（摘要）页面中，选择 **Permissions**（权限）选项卡。

1. 选择 **Add permissions, Create inline policy**（添加权限、创建内联策略）。

1. 在 **Create policy (创建策略)** 页面上，选择 **Visual editor (可视化编辑器)** 选项卡。

1. 选择**服务**，然后选择 **IAM**。

1. 在 **Filter actions**（筛选操作）文本框中，输入 **PassRole**，然后选择 **PassRole** 选项。

1. 展开 **Resources**（资源）。确保已选择**特定**，然后选择**添加 ARN**。

1. 在 **Specify ARN for role**（为角色指定 ARN）字段中，输入要向其传递担任角色权限的 IAM 实例配置文件角色或 IAM 服务角色的 ARN。系统会自动填充**账户**和**具有路径的角色名称**字段。

1. 选择 **Add (添加)**。

1. 选择**查看策略**。

1. 对于 **Name**（名称），输入一个名称来标识此策略，然后选择 **Create policy**（创建策略）。

**更多信息**  
+ [配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)
+ [在混合和多云环境中创建 Systems Manager 所需的 IAM 服务角色](hybrid-multicloud-service-role.md)

## 任务 4：向担任角色添加内联策略以调用其他 AWS 服务
<a name="change-manager-role-add-inline-policy"></a>

当更改请求使用 Change Manager 代入角色调用其他 AWS 服务时，必须为代入角色配置调用这些服务的权限。此要求适用于可能在更改请求中使用的所有 AWS 自动化运行手册（AWS-\$1 运行手册），例如 `AWS-ConfigureS3BucketLogging`、`AWS-CreateDynamoDBBackup` 和 `AWS-RestartEC2Instance` 运行手册。对于您创建的任何自定义运行手册，如果这些文档使用调用其他服务的操作来调用其他 AWS 服务，则此要求同样适用。例如，如果您使用 `aws:executeAwsApi`、`aws:CreateStack` 或 `aws:copyImage` 操作，则您必须配置具有权限的服务角色来调用这些服务。您可以通过将 IAM 内联策略添加到角色以向其他 AWS 服务授予权限。

**将内联策略添加到代入角色以调用其他 AWS 服务（IAM 控制台）**

1. 登录 AWS 管理控制台，然后通过以下网址打开 IAM 控制台：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)。

1. 在导航窗格中，选择**角色**。

1. 在列表中，选择要更新的担任角色的名称，例如 `MyChangeManagerAssumeRole`。

1. 选择**权限**选项卡。

1. 选择 **Add permissions, Create inline policy**（添加权限、创建内联策略）。

1. 选择 **JSON** 选项卡。

1. 输入您希望调用的 AWS 服务的 JSON 策略文档。以下是两个示例 JSON 策略文档。

   **Simple Storage Service (Amazon S3) `PutObject` 和 `GetObject` 示例**

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "s3:PutObject",
                   "s3:GetObject"
               ],
               "Resource": "arn:aws:s3:::amzn-s3-demo-bucket/*"
           }
       ]
   }
   ```

------

   **Amazon EC2 `CreateSnapshot` 和 `DescribeSnapShots` 示例**

------
#### [ JSON ]

****  

   ```
   {
      "Version":"2012-10-17",		 	 	 
      "Statement":[
         {
            "Effect":"Allow",
            "Action":"ec2:CreateSnapshot",
            "Resource":"*"
         },
         {
            "Effect":"Allow",
            "Action":"ec2:DescribeSnapshots",
            "Resource":"*"
         }
      ]
   }
   ```

------

    有关 IAM policy 语言的详细信息，请参阅《IAM 用户指南》中的 [IAM JSON 策略参考](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies.html)。

1. 完成后，选择**查看策略**。[策略验证程序](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_policy-validator.html)将报告任何语法错误。

1. 对于 **Name**（名称），输入一个名称来标识您创建的策略。查看策略**摘要**以查看您的策略授予的权限。然后，选择**创建策略**以保存您的工作。

1. 创建内联策略后，它会自动嵌入您的角色。

## 任务 5：配置用户对 Change Manager 的访问权限
<a name="change-manager-passrole"></a>

如果已为您的用户、组或角色分配了管理员权限，则您有权访问 Change Manager。如果您没有管理员权限，则管理员必须为您的用户、组或角色分配 `AmazonSSMFullAccess` 托管策略或提供类似权限的策略。

使用以下过程配置用户，以使用 Change Manager。您选择的用户将拥有配置并运行 Change Manager 的权限。

根据您在组织中使用的身份应用程序，您可以选择三个可用选项中的任何一个来配置用户访问权限。在配置用户访问权限时，请分配或添加以下内容：

1. 分配提供访问 Systems Manager 权限的 `AmazonSSMFullAccess` 策略或类似策略。

1. 分配 `iam:PassRole` 策略。

1. 为您在 [任务 2：为 Change Manager 创建担任角色](#change-manager-role) 末尾复制的 Change Manager 担任角色添加 ARN。

要提供访问权限，请为您的用户、组或角色添加权限：
+ AWS IAM Identity Center 中的用户和群组：

  创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
+ 通过身份提供者在 IAM 中托管的用户：

  创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
+ IAM 用户：
  + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
  + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》**中[向用户添加权限（控制台）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

您已完成了为 Change Manager 配置所需的角色。您现在可以在 Change Manager 操作中使用 Change Manager 担任角色 ARN。

# 控制对自动批准运行手册工作流的访问
<a name="change-manager-auto-approval-access"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

在为您的组织或账户创建的每个更改模板中，您可以指定从该模板创建的更改请求是否可以作为自动批准的更改请求运行，这意味着这些更改请求将在没有审核步骤的情况下自动运行（更改冻结事件除外）。

但是，您可能希望阻止某些用户、组或 AWS Identity and Access Management (IAM) 角色运行自动批准的更改请求，即使更改模板允许此操作也是如此。您可以将 `ssm:AutoApprove` 条件键用于分配给用户、组或 IAM 角色的 IAM policy 中的 `StartChangeRequestExecution` 操作，借此实现上述目标。

您可以将以下策略添加为内联策略，其中将该条件指定为 `false`，以阻止用户运行可自动批准的更改请求。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
            {
            "Effect": "Allow",
            "Action": "ssm:StartChangeRequestExecution",
            "Resource": "*",
            "Condition": {
                "BoolIfExists": {
                    "ssm:AutoApprove": "false"
                }
            }
        }
    ]
}
```

------

有关指定内联策略的信息，请参阅 *IAM 用户指南*中的[内联策略](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_managed-vs-inline.html#inline-policies)及[添加和删除 IAM 身份权限](https://docs.aws.amazon.com//IAM/latest/UserGuide/access_policies_manage-attach-detach.html)。

有关 Systems Manager 策略条件键的更多信息，请参阅 [Systems Manager 的条件键](security_iam_service-with-iam.md#policy-conditions)。

# 使用 Change Manager
<a name="working-with-change-manager"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

借助 Change Manager（AWS Systems Manager 中的一项工具），整个组织或单个 AWS 账户中的（已获必要权限）用户可以执行与更改相关的任务。Change Manager 任务如下：
+ 创建、审核和批准或拒绝更改模板。

  更改模板是 Change Manager 中的一个配置设置集合，它定义了所需的批准、可用的运行手册和更改请求的通知选项等内容。
+ 创建、审核和批准或拒绝更改请求。

  更改请求是 Change Manager 中的一个请求，旨在运行更新您的 AWS 或本地环境中一个或多个资源的自动化运行手册。更改请求是使用更改模板创建的。
+ 可以指定组织或账户中的哪些用户可以成为更改模板和更改请求的审核人员。
+ 可以编辑配置设置，例如如何在 Change Manager 中管理用户身份，以及在您的 Change Manager 操作中强制实施哪些可用的*最佳实践*选项。有关配置这些设置的信息，请参阅 [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)。

**Topics**
+ [使用更改模板](change-templates.md)
+ [使用更改请求](change-requests.md)
+ [审核更改请求详细信息、任务和时间表（控制台）](reviewing-changes.md)
+ [查看更改请求的聚合计数（命令行）](change-requests-review-aggregate-command-line.md)

# 使用更改模板
<a name="change-templates"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

更改模板是 Change Manager 中的一个配置设置集合，它定义了所需的批准、可用的运行手册和更改请求的通知选项等内容。

**注意**  
AWS 提供了一个示例 [Hello World](change-templates-aws-managed.md) 更改模板，您可使用该示例来试用 Change Manager（AWS Systems Manager 中的一项工具）。但是，您可以创建自己的更改模板，来定义您要允许对组织或账户中的资源进行的更改。

在运行手册工作流运行时进行的更改基于自动化运行手册的内容。在您创建的每个更改模板中，都可以包含一个或多个自动化运行手册，提出更改请求的用户可以从中选择这些运行手册，以便在更新过程中运行。您还可以创建允许请求者为更改请求选择任何可用的自动化运行手册的更改模板。

要创建更改模板，可以使用 **Create template (创建模板)** 控制台页面中的 **Builder (生成器)** 选项，来构建更改模板。或者，使用 **Editor (编辑器)** 选项，可以借助您要用于运行手册工作流的配置手动编写 JSON 或 YAML 内容。您还可以使用命令行工具创建更改模板，将该更改模板的 JSON 内容存储在外部文件中。

**Topics**
+ [试用 AWS 托管 `Hello World` 更改模板](change-templates-aws-managed.md)
+ [创建更改模板](change-templates-create.md)
+ [审核和批准或拒绝更改模板](change-templates-review.md)
+ [删除更改模板](change-templates-delete.md)

# 试用 AWS 托管 `Hello World` 更改模板
<a name="change-templates-aws-managed"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以使用示例更改模板 `AWS-HelloWorldChangeTemplate`（该模板使用示例 Automation 运行手册 `AWS-HelloWorld`），在完成 Change Manager（AWS Systems Manager 中的一项工具）的设置后，对审核和批准流程进行测试。此模板用于测试或验证已配置的权限、审批人员指定和批准流程。AWS 已经批准在您的组织或账户中使用此更改模板。但是，基于此更改模板的任何更改请求，仍然必须得到您的组织或账户中的审核人员的批准。

与此模板关联的运行手册工作流的结果，不会对资源进行更改，而是在“自动化”步骤的输出中打印一条消息。

**开始前的准备工作**  
在开始之前，请确保您已完成以下任务：
+ 如果您使用 AWS Organizations 管理整个组织中的更改，请完成 [为组织设置 Change Manager（管理账户）](change-manager-organization-setup.md) 中描述的组织设置任务。
+ 按照 [配置 Change Manager 选项和最佳实践](change-manager-account-setup.md)中的描述，为您的委托管理员账户或单个账户配置 Change Manager。
**注意**  
如果您在 Change Manager 设置中打开了最佳实践选项 **Require monitors for all templates (所有模板都需要监控器)**，请在测试 Hello World 更改模板时暂时关闭该选项。

**试用 AWS 托管 Hello World 更改模板**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Create request (创建请求)**。

1. 选择名为 `AWS-HelloWorldChangeTemplate` 的更改模板，然后选择 **Next (下一步)**。

1. 对于 **Name (名称)**，请输入更改请求的名称，以便于识别其用途，例如 **MyChangeRequestTest**。

1. 有关创建更改请求的其余步骤，请参阅 [创建更改请求创建更改请求（控制台）](change-requests-create.md)。

**后续步骤**  
有关批准更改请求的信息，请参阅 [审核和批准或拒绝更改请求](change-requests-review.md)。

要查看您的更改请求的状态和结果，请在 Change Manager 中的 **Requests (请求)** 选项卡上选择您的更改请求的名称。

# 创建更改模板
<a name="change-templates-create"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

更改模板是 Change Manager 中的一个配置设置集合，它定义了所需的批准、可用的运行手册和更改请求的通知选项等内容。

您可以使用控制台（内含“生成器”和“编辑器”选项）或命令行工具，在 Change Manager（AWS Systems Manager 中的一项工具）中为操作创建更改模板。

**Topics**
+ [关于更改模板中的批准](cm-approvals-templates.md)
+ [使用 Builder (生成器) 创建更改模板](change-templates-custom-builder.md)
+ [使用 Editor (编辑器) 创建更改模板](change-templates-custom-editor.md)
+ [使用命令行工具创建更改模板](change-templates-tools.md)

# 关于更改模板中的批准
<a name="cm-approvals-templates"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

对于您创建的每个更改模板，您最多可以为通过该更改模板创建的更改请求指定五个批准*级别*。对于其中每个级别，您最多可以指定五个潜在*审批者*。审批者并不限于单个用户。您还可以将 IAM 组或 IAM 角色指定为单独的审批者。对于 IAM 组和 IAM 角色，属于该组或角色的一个或多个用户可以提供批准，以获得更改请求所需的批准总数。您还可以指定数量超过您的更改模板所需数量的审批者。

Change Manager 支持两种主要的批准方法：*逐级批准*和*逐行批准*。在某些情况下，也可以将这两种类型组合在一起。我们建议在您的 Change Manager 操作中仅使用逐级批准。

------
#### [ Per-level approvals ]

*推荐*。自 2023 年 1 月 23 日起，Change Manager 支持逐级批准。在此模型中，对于更改模板中的每个批准级别，您首先需要指定该级别需要多少次批准。然后，您需要为该级别至少指定对应数量的审批者，并且可以指定更多审批者。但只有您指定数量的逐级审批者才需要批准更改请求。例如，您可以指定五个审批者，但需要三次批准。

有关此批准类型的控制台视图和 JSON 示例，请参阅 [逐级批准配置示例](approval-type-samples.md#per-level-approvals)。

------
#### [ Per-line approvals ]

*支持向后兼容性*。原始版本的 Change Manager 仅支持逐行批准。在此模型中，为批准级别指定的每个审批者都以一个批准行来表示。每个审批者都必须批准一次更改请求，该更改请求才能在该级别获得批准。在 2023 年 1 月 23 日之前，这是唯一受支持的批准模型。在此日期之前创建的更改模板继续支持逐行批准，但我们建议改用逐级批准。

有关此批准类型的控制台视图和 JSON 示例，请参阅 [逐行批准配置示例](approval-type-samples.md#per-line-approvals)。

------
#### [ Combined per-line and per-level approvals ]

*不推荐*。在控制台中，**构建器**选项卡不再支持添加逐行批准。但在某些情况下，您最终可能会在更改模板中同时包含逐行和逐级批准。如果您更新在 2023 年 1 月 23 日之前创建的更改模板，或者通过手动编辑更改模板的 YAML 内容来创建或更新更改模板，则可能会发生这种情况。

有关此批准类型的控制台视图和 JSON 示例，请参阅 [逐级和逐行组合批准配置示例](approval-type-samples.md#combined-approval-levels)。

------

**重要**  
虽然可以创建将逐行和逐级批准组合在一起的更改模板，但不建议或不必使用此配置。无论哪种批准类型，需要较多批准者（逐行或逐级批准）优先。例如：  
如果更改模板指定了三次逐级批准，但指定了五次逐行批准，则需要五次批准。
如果更改模板指定了四次逐级批准，但指定了两次逐行批准，则需要四次批准。

您可以通过手动编辑 YAML 或 JSON 内容，来创建同时包括逐行和逐级批准的级别。然后，**构建器**选项卡将显示用于为该级别和单个行指定所需批准数量的控件。但您使用控制台添加的新级别仍然仅支持逐级批准配置。

## 更改请求通知和拒绝
<a name="notifications-and-rejections"></a>

Amazon SNS 通知  
在使用您的更改模板创建更改请求后，将向已为该级别的批准通知指定的 Amazon Simple Notification Service（Amazon SNS）主题的订阅用户发送通知。您可以在更改模板中指定通知主题，也可以允许创建更改请求的用户指定通知主题。  
在某一级别获得最低所需批准数量后，将向订阅下一级别 Amazon SNS 主题的审批者发送通知，依此类推。  
确保您指定的 IAM 角色、组和用户共同提供足够的审批者，以满足您指定的所需批准数量。例如，如果您仅将一个包含三个用户的 IAM 组指定为审批者，则您无法指定在该级别必须获得五次批准，只能指定三次或以下。

更改请求拒绝  
无论您指定了多少个批准级别和审批者，只需拒绝一次更改请求，就会阻止执行该请求的运行手册工作流。

# Change Manager 批准类型示例
<a name="approval-type-samples"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

以下示例演示了 Change Manager 中三种批准类型的控制台视图和 JSON 内容。

**Topics**
+ [逐级批准配置示例](#per-level-approvals)
+ [逐行批准配置示例](#per-line-approvals)
+ [逐级和逐行组合批准配置示例](#combined-approval-levels)

## 逐级批准配置示例
<a name="per-level-approvals"></a>

在下图所示的逐级批准级别设置中，需要三次批准。这些批准可以来自被指定为审批者的 IAM 用户、组和角色的任意组合。指定的审批者包括两个 IAM 用户（John Stiles 和 Ana Carolina Silva），一个包含三个成员的用户组（`GroupOfThree`），以及一个代表十个用户的用户角色（`RoleOfTen`）。

如果 `GroupOfThree` 组中的所有三个用户都批准了更改请求，则该更改请求即获得了该级别的批准。不必获得来自每个用户、组或角色的批准。最低批准数量可以来自指定审批者的任意组合。我们建议对您的 Change Manager 操作进行逐级批准。

![\[批准级别显示需要三次批准和四个指定审批者。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/Add-approval-2.png)


以下示例说明了此配置的部分 YAML 代码。

**注意**  
此版本的 YAML 代码包括一个额外的输入 `MinRequiredApprovals`（包含首字母大写 `M`）。此输入的值表示需要从所有可用审核者获得多少次批准。另请注意，`Approvers` 列表中每个审批者的 `minRequiredApprovals`（首字母小写 `m`）值为 `0`（零）。这表示相应审批者可以为总批准数做出贡献，但不需要这样做。

```
schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
  - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 604800
    inputs:
      Message: Please approve this change request
      MinRequiredApprovals: 3
      EnhancedApprovals:
        Approvers:
          - approver: John Stiles
            type: IamUser
            minRequiredApprovals: 0
          - approver: Ana Carolina Silva
            type: IamUser
            minRequiredApprovals: 0
          - approver: GroupOfThree
            type: IamGroup
            minRequiredApprovals: 0
          - approver: RoleOfTen
            type: IamRole
            minRequiredApprovals: 0
templateInformation: >
  #### What is the purpose of this change?
    //truncated
```

## 逐行批准配置示例
<a name="per-line-approvals"></a>

在下图所示的批准级别设置中，指定了四个审批者。其中包括两个 IAM 用户（John Stiles 和 Ana Carolina Silva），一个包含三个成员的用户组（`GroupOfThree`），以及一个代表十个用户的用户角色（`RoleOfTen`）。为了实现向后兼容性支持逐行批准，但不推荐使用该类型。

![\[批准级别显示需要四个逐行审批者。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/Add-approval-1.png)


要使更改请求在此逐行批准配置中获得批准，该更该请求必须获得所有审批者行的批准：John Stiles、Ana Carolina Silva、`GroupOfThree` 组的一名成员，以及 `RoleOfTen` 角色的一名成员。

以下示例说明了此配置的部分 YAML 代码。

**注意**  
请注意，每个 `minRequiredApprovals` 审批者的值均为 `1`。这表示需要从每个审批者获得一次批准。

```
schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
  - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 10000
    inputs:
      Message: Please approve this change request
      EnhancedApprovals:
        Approvers:
          - approver: John Stiles
            type: IamUser
            minRequiredApprovals: 1
          - approver: Ana Carolina Silva
            type: IamUser
            minRequiredApprovals: 1
          - approver: GroupOfThree
            type: IamGroup
            minRequiredApprovals: 1
          - approver: RoleOfTen
            type: IamRole
            minRequiredApprovals: 1
executableRunBooks:
  - name: AWS-HelloWorld
    version: $DEFAULT
templateInformation: >
  #### What is the purpose of this change?
    //truncated
```

## 逐级和逐行组合批准配置示例
<a name="combined-approval-levels"></a>

在下图所示的逐级和逐行组合批准设置中，为级别指定了三次批准，但为行项目批准指定了四次批准。无论哪种批准类型，需要更多批准的类型都优先于另一种类型，所以此配置需要四次批准。不推荐使用按级别和按行组合批准。

![\[批准级别显示级别需要三次批准，但行级别需要四次批准。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/Add-approval-3.png)


```
schemaVersion: "0.3"
emergencyChange: false
autoApprovable: false
mainSteps:
  - name: ApproveAction1
    action: aws:approve
    timeoutSeconds: 604800
    inputs:
      Message: Please approve this change request
      MinRequiredApprovals: 3
      EnhancedApprovals:
        Approvers:
          - approver: John Stiles
            type: IamUser
            minRequiredApprovals: 1
          - approver: Ana Carolina Silva
            type: IamUser
            minRequiredApprovals: 1
          - approver: GroupOfThree
            type: IamGroup
            minRequiredApprovals: 1
          - approver: RoleOfTen
            type: IamRole
            minRequiredApprovals: 1
templateInformation: >
  #### What is the purpose of this change?
    //truncated
```

**Topics**
+ [关于更改模板中的批准](cm-approvals-templates.md)
+ [使用 Builder (生成器) 创建更改模板](change-templates-custom-builder.md)
+ [使用 Editor (编辑器) 创建更改模板](change-templates-custom-editor.md)
+ [使用命令行工具创建更改模板](change-templates-tools.md)

# 使用 Builder (生成器) 创建更改模板
<a name="change-templates-custom-builder"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

将生成器用于 Change Manager（AWS Systems Manager 中的一项工具）中的更改模板，即可配置在更改模板中定义的运行手册工作流，免于使用使用 JSON 或 YAML 语法。在您指定选项后，系统会将您的输入转换为 YAML 格式，Systems Manager 可以将其用于运行运行手册工作流。

**使用 Builder (生成器) 创建更改模板**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择**创建模板**。

1. 对于 **Name (名称)**，请输入模板的名称，以便于识别其用途，例如 **UpdateEC2LinuxAMI**。

1. 在 **Change template details (更改模板详细信息)** 部分中，执行以下操作：
   + 对于 **Description (描述)**，请提供有关如何以及何时使用您所创建的更改模板的简要说明。

     此描述可帮助创建更改请求的用户确定他们是否使用了正确的更改模板。它可以帮助审核更改请求的人员了解是否应该批准该请求。
   + 对于 **Change template type (更改模板类型)**，请指定您是创建标准更改模板还是紧急更改模板。

     紧急更改模板用于即便 AWS Systems Manager Change Calendar 所使用的日历中的某个事件阻止更改，也必须进行更改的情况。从紧急更改模板创建的更改请求仍然必须由其指定的审批人员批准，但即便日历被阻止，所请求的更改仍可运行。
   + 对于 **Runbook options (运行手册选项)**，请指定用户在创建更改请求时可以从中选择的运行手册。您可以添加一个运行手册或多个运行手册。或者，您也可以允许请求者指定要使用哪一个运行手册。在上述任何情况下，更改请求中都只能包含一个运行手册。
   + 对于 **Runbook (运行手册)**，请选择用户可以为其更改请求从中选择的运行手册的名称及其版本。无论您向更改模板添加了多少个运行手册，每个更改请求只能选择一个运行手册。

     如果您先前选择了 **Any runbook can be used (可以使用任何运行手册)**，则您无需指定运行手册。
**提示**  
选择运行手册和运行手册版本，然后选择 **View (查看)**，以便在 Systems Manager Documents (文档) 界面中检查运行手册的内容。

1. 在 **Template information (模板信息)** 部分中，使用 Markdown 输入从此更改模板创建更改请求的用户的信息。我们提供了一组问题，您可以为创建更改请求的用户提供这些问题，也可以添加其他信息和问题作为替代。
**注意**  
Markdown 是一种标记语言，允许您为文档和文档中的各个步骤中添加维基百科式的描述。有关使用 Markdown 的更多信息，请参阅[在 AWS 中使用 Markdown](https://docs.aws.amazon.com/general/latest/gr/aws-markdown.html)。

   我们建议为用户提供问题，询问有关其更改请求的信息，以帮助审批人员决定是否批准每个更改请求，例如列出作为更改的组成部分需要运行的任何手动步骤和回滚计划。
**提示**  
在 **Hide preview (隐藏预览)** 和 **Show preview (显示预览)** 之间切换，以便查看您的哪些内容看起来符合您的编写要求。

1. 在 **Change request approvals (更改请求批准)** 部分中，执行以下操作：
   + （可选）如果您希望允许从此更改模板创建的更改请求自动运行，而不需要任何审批人员进行审核（更改冻结事件除外），则请选择 **Enable auto-approval (启用自动批准)**。
**注意**  
在更改模板中启用自动批准，可为用户提供绕过审核人员的*选项*。他们仍然可以在创建更改请求时选择指定审核人员。因此，您仍然必须在更改模板中指定审批人员选项。
**重要**  
如果您为更改模板启用了自动批准，则用户可以使用该模板提交更改请求，这些更改请求在运行前无需审核人员进行审核（更改冻结事件审批人员除外）。如果您要限制特定用户、组或 IAM 角色提交自动批准请求，可以使用 IAM policy 中的某一条件来实现此目的。有关更多信息，请参阅 [控制对自动批准运行手册工作流的访问](change-manager-auto-approval-access.md)。
   + 对于**此级别所需的批准数量**，选择通过此更改模板创建的更改请求对于此级别必须获得的批准数量。
   + 要添加强制的第一级审批人员，请选择 **Add approver (添加审批人员)**，然后从以下选项中进行选择：
     + **Template specified approvers (模板指定的审批人员)** – 从您的账户中选择一个或多个用户、组或 AWS Identity and Access Management (IAM) 角色，以批准从此更改模板创建的更改请求。使用此模板创建的任何更改请求都必须由您指定的每个审批人员进行审核和批准。
     + **Request specified approvers**（请求指定的审批人员）：提出更改请求的用户将在提出该请求时指定审核人员，并可从您账户中的用户列表中进行选择。

       您在 **Required (必需)** 列中输入的数字确定使用此更改模板的更改请求必须指定的审核人员的数量。
**重要**  
在 2023 年 1 月 23 日之前，**构建器**选项卡仅支持指定逐行批准。新更改模板和您使用**构建器**选项卡添加到现有更改模板的新级别，仅支持逐级批准。我们建议在您的 Change Manager 操作中仅使用逐级批准。  
有关更多信息，请参阅 [关于更改模板中的批准](cm-approvals-templates.md)。
   + 对于 **SNS topic to notify approvers (要通知审批人员的 SNS 主题)**，请执行以下操作：

     1. 选择以下选项之一，在您的账户中指定 Amazon Simple Notification Service (Amazon SNS) 主题，用于向审批人员发送更改请求已准备好供其审核的通知：
        + **Enter an SNS Amazon Resource Name (ARN) (输入 SNS Amazon 资源名称 (ARN))** – 对于 **Topic ARN (主题 ARN)**，请输入现有 Amazon SNS 主题的 ARN。此主题可以位于您组织的任何账户中。
        + **Select an existing SNS topic（选择现有 SNS 主题）** – 对于 **Target notification topic（设定通知主题目标）**，选择您当前的 AWS 账户中现有 Amazon SNS 主题的 ARN。（如果您尚未在当前的 AWS 账户 和 AWS 区域 中创建任何 Amazon SNS 主题，则此选项不可用。）
        + **Specify SNS topic when the change request is created (创建更改请求时指定 SNS 主题)** – 创建更改请求的用户可以指定要用于通知的 Amazon SNS 主题。
**注意**  
您选择的 Amazon SNS 主题必须被配置为指定它所发送的通知，以及接收这些通知的订阅者。其访问策略还必须向 Systems Manager 授予权限，以便 Change Manager 可以发送通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

     1. 选择 **Add notification（添加通知）**。

1. （可选）要添加其他级别的审批人员，请选择 **Add approval level (添加批准级别)**，然后在与此级别对应的模板指定的审批人员和请求指定的审批人员之间进行选择。然后选择 SNS 主题以通知此级别的审批人员。

   在第一级审批人员收到所有批准后，会通知第二级审批人员，依此类推。

   您可以在每个模板中添加最多五个级别的审批人员。例如，您可能需要担任技术角色的用户提供第一级别的批准，然后需要管理人员提供第二级别的批准。

1. 在 **Monitoring (监控)** 部分中，对于 **CloudWatch alarm to monitor (要监控的 CloudWatch 告警)**，请输入当前账户中 Amazon CloudWatch 告警的名称，以监控基于此模板的运行手册工作流的进度。
**提示**  
要创建新告警，或要审核您要指定的告警的设置，请选择 **Open the Amazon CloudWatch console (打开 Amazon CloudWatch 控制台)**。有关使用 CloudWatch 告警的信息，请参阅 *Amazon CloudWatch 用户指南*中的[使用 CloudWatch 告警](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

1. 在 **Notifications**（通知）部分执行以下操作：

   1. 选择以下选项之一，在您的账户中指定 Amazon SNS 主题，用于发送有关使用此更改模板创建的更改请求的通知：
      + **Enter an SNS Amazon Resource Name (ARN) (输入 SNS Amazon 资源名称 (ARN))** – 对于 **Topic ARN (主题 ARN)**，请输入现有 Amazon SNS 主题的 ARN。此主题可以位于您组织的任何账户中。
      + **Select an existing SNS topic（选择现有 SNS 主题）** – 对于 **Target notification topic（设定通知主题目标）**，选择您当前的 AWS 账户中现有 Amazon SNS 主题的 ARN。（如果您尚未在当前的 AWS 账户 和 AWS 区域 中创建任何 Amazon SNS 主题，则此选项不可用。）
**注意**  
您选择的 Amazon SNS 主题必须被配置为指定它所发送的通知，以及接收这些通知的订阅者。其访问策略还必须向 Systems Manager 授予权限，以便 Change Manager 可以发送通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

   1. 选择 **Add notification（添加通知）**。

1. （可选）在 **Tags (标签)** 部分中，将一个或多个标签键名/键值对应用于更改模板。

   标签是您分配给资源的可选元数据。通过使用标签，您可以按各种方式（如用途、所有者或环境）对资源进行分类。例如，您可能希望标记更改模板，以标识它所进行的更改的类型及其运行的环境。在这种情况下，您可以指定以下键名/键值对：
   + `Key=TaskType,Value=InstanceRepair`
   + `Key=Environment,Value=Production`

1. 选择 **Save and preview (保存和预览)**。

1. 审核您所创建的更改模板的详细信息。

   如果要在提交更改模板以供审核之前对其进行更改，请选择 **Actions (操作)、Edit (编辑)**。

   如果您对更改模板的内容感到满意，请选择 **Submit for review (提交以供审核)**。您的组织或账户内在 Change Manager 中的 **Settings (设置)** 选项卡上被指定为模板审核人员的用户，将收到新的更改模板正等待其审核的通知。

   如果已为更改模板指定 Amazon SNS 主题，则当更改模板被拒绝或批准时，系统会发送通知。如果您没有收到与此更改模板相关的通知，可在稍后返回 Change Manager 以检查其状态。

# 使用 Editor (编辑器) 创建更改模板
<a name="change-templates-custom-editor"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

按照本主题中的步骤操作，通过输入 JSON 或 YAML，而不是使用控制台控件，即可在 Change Manager（AWS Systems Manager 中的一项工具）中配置更改模板。

**使用 Editor (编辑器) 创建更改模板**

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择**创建模板**。

1. 对于 **Name (名称)**，请输入模板的名称，以便于识别其用途，例如 **RestartEC2LinuxInstance**。

1. 在 **Change template details (更改模板详细信息)** 上方，选择 **Editor (编辑器)**。

1. 在 **Document editor (文档编辑器)** 部分中，选择 **Edit (编辑)**，然后为您的更改模板输入 JSON 或 YAML 内容。

   示例如下：
**注意**  
参数 `minRequiredApprovals` 用于指定对于使用此模板创建的更改请求，必须取得多少指定级别的审阅者批准。  
此示例演示了两个级别的批准。您可以指定最多五个级别的批准，但只需要一个级别。  
在第一级，每个更改请求必须取得指定用户“John-Doe”的批准。然后，该更改请求必须由 IAM 角色 `Admin` 的任意三个成员批准。  
有关批准更改模板的更多信息，请参阅 [关于更改模板中的批准](cm-approvals-templates.md)。

------
#### [ YAML ]

   ```
   description: >-
     This change template demonstrates the feature set available for creating
     change templates for Change Manager. This template starts a Runbook workflow
     for the Automation runbook called AWS-HelloWorld.
   templateInformation: >
     ### Document Name: HelloWorldChangeTemplate
   
     ## What does this document do?
   
     This change template demonstrates the feature set available for creating
     change templates for Change Manager. This template starts a Runbook workflow
     for the Automation runbook called AWS-HelloWorld.
   
     ## Input Parameters
   
     * ApproverSnsTopicArn: (Required) Amazon Simple Notification Service ARN for
     approvers.
   
     * Approver: (Required) The name of the approver to send this request to.
   
     * ApproverType: (Required) The type of reviewer.
       * Allowed Values: IamUser, IamGroup, IamRole, SSOGroup, SSOUser
   
     ## Output Parameters
   
     This document has no outputs
   schemaVersion: '0.3'
   parameters:
     ApproverSnsTopicArn:
       type: String
       description: Amazon Simple Notification Service ARN for approvers.
     Approver:
       type: String
       description: IAM approver
     ApproverType:
       type: String
       description: >-
         Approver types for the request. Allowed values include IamUser, IamGroup,
         IamRole, SSOGroup, and SSOUser.
   executableRunBooks:
     - name: AWS-HelloWorld
       version: '1'
   emergencyChange: false
   autoApprovable: false
   mainSteps:
     - name: ApproveAction1
       action: 'aws:approve'
       timeoutSeconds: 3600
       inputs:
         Message: >-
           A sample change request has been submitted for your review in Change
           Manager. You can approve or reject this request.
         EnhancedApprovals:
           NotificationArn: '{{ ApproverSnsTopicArn }}'
           Approvers:
             - approver: John-Doe
               type: IamUser
               minRequiredApprovals: 1
     - name: ApproveAction2
       action: 'aws:approve'
       timeoutSeconds: 3600
       inputs:
         Message: >-
           A sample change request has been submitted for your review in Change
           Manager. You can approve or reject this request.
         EnhancedApprovals:
           NotificationArn: '{{ ApproverSnsTopicArn }}'
           Approvers:
             - approver: Admin
               type: IamRole
               minRequiredApprovals: 3
   ```

------
#### [ JSON ]

   ```
   {
      "description": "This change template demonstrates the feature set available for creating
     change templates for Change Manager. This template starts a Runbook workflow
     for the Automation runbook called AWS-HelloWorld",
      "templateInformation": "### Document Name: HelloWorldChangeTemplate\n\n
       ## What does this document do?\n
       This change template demonstrates the feature set available for creating change templates for Change Manager. 
       This template starts a Runbook workflow for the Automation runbook called AWS-HelloWorld.\n\n
       ## Input Parameters\n* ApproverSnsTopicArn: (Required) Amazon Simple Notification Service ARN for approvers.\n
       * Approver: (Required) The name of the approver to send this request to.\n
       * ApproverType: (Required) The type of reviewer.  * Allowed Values: IamUser, IamGroup, IamRole, SSOGroup, SSOUser\n\n
       ## Output Parameters\nThis document has no outputs\n",
      "schemaVersion": "0.3",
      "parameters": {
         "ApproverSnsTopicArn": {
            "type": "String",
            "description": "Amazon Simple Notification Service ARN for approvers."
         },
         "Approver": {
            "type": "String",
            "description": "IAM approver"
         },
         "ApproverType": {
            "type": "String",
            "description": "Approver types for the request. Allowed values include IamUser, IamGroup, IamRole, SSOGroup, and SSOUser."
         }
      },
      "executableRunBooks": [
         {
            "name": "AWS-HelloWorld",
            "version": "1"
         }
      ],
      "emergencyChange": false,
      "autoApprovable": false,
      "mainSteps": [
         {
            "name": "ApproveAction1",
            "action": "aws:approve",
            "timeoutSeconds": 3600,
            "inputs": {
               "Message": "A sample change request has been submitted for your review in Change Manager. You can approve or reject this request.",
               "EnhancedApprovals": {
                  "NotificationArn": "{{ ApproverSnsTopicArn }}",
                  "Approvers": [
                     {
                        "approver": "John-Doe",
                        "type": "IamUser",
                        "minRequiredApprovals": 1
                     }
                  ]
               }
            }
         },
           {
            "name": "ApproveAction2",
            "action": "aws:approve",
            "timeoutSeconds": 3600,
            "inputs": {
               "Message": "A sample change request has been submitted for your review in Change Manager. You can approve or reject this request.",
               "EnhancedApprovals": {
                  "NotificationArn": "{{ ApproverSnsTopicArn }}",
                  "Approvers": [
                     {
                        "approver": "Admin",
                        "type": "IamRole",
                        "minRequiredApprovals": 3                  
                     }
                  ]
               }
            }
         }
      ]
   }
   ```

------

1. 选择 **Save and preview (保存和预览)**。

1. 审核您所创建的更改模板的详细信息。

   如果要在提交更改模板以供审核之前对其进行更改，请选择 **Actions (操作)、Edit (编辑)**。

   如果您对更改模板的内容感到满意，请选择 **Submit for review (提交以供审核)**。您的组织或账户内在 Change Manager 中的 **Settings (设置)** 选项卡上被指定为模板审核人员的用户，将收到新的更改模板正等待其审核的通知。

   如果已为更改模板指定 Amazon Simple Notification Service (Amazon SNS) 主题，则当更改模板被拒绝或批准时，系统会发送通知。如果您没有收到与此更改模板相关的通知，可在稍后返回 Change Manager 以检查其状态。

# 使用命令行工具创建更改模板
<a name="change-templates-tools"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

以下过程介绍了如何使用 AWS Command Line Interface（AWS CLI）（在 Linux、macOS 或 Windows Server 上）或 AWS Tools for Windows PowerShell 在 Change Manager（AWS Systems Manager 中的一个工具）中创建更改请求。

**创建更改模板**

1. 安装并配置 AWS Tools for PowerShell (AWS CLI)（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 在本地计算机上使用 `MyChangeTemplate.json` 之类的名称创建一个 JSON 文件，然后将更改模板的内容粘贴到此文件中。
**注意**  
更改模板使用架构 0.3 版本，该版本包含的支持与针对自动化运行手册的支持不完全相同。

   示例如下：
**注意**  
参数 `minRequiredApprovals` 用于指定对于使用此模板创建的更改请求，必须取得多少指定级别的审阅者批准。  
此示例演示了两个级别的批准。您可以指定最多五个级别的批准，但只需要一个级别。  
在第一级，每个更改请求必须取得指定用户“John-Doe”的批准。然后，该更改请求必须由 IAM 角色 `Admin` 的任意三个成员批准。  
有关批准更改模板的更多信息，请参阅 [关于更改模板中的批准](cm-approvals-templates.md)。

   ```
   {
      "description": "This change template demonstrates the feature set available for creating
     change templates for Change Manager. This template starts a Runbook workflow
     for the Automation runbook called AWS-HelloWorld",
      "templateInformation": "### Document Name: HelloWorldChangeTemplate\n\n
       ## What does this document do?\n
       This change template demonstrates the feature set available for creating change templates for Change Manager. 
       This template starts a Runbook workflow for the Automation runbook called AWS-HelloWorld.\n\n
       ## Input Parameters\n* ApproverSnsTopicArn: (Required) Amazon Simple Notification Service ARN for approvers.\n
       * Approver: (Required) The name of the approver to send this request to.\n
       * ApproverType: (Required) The type of reviewer.  * Allowed Values: IamUser, IamGroup, IamRole, SSOGroup, SSOUser\n\n
       ## Output Parameters\nThis document has no outputs\n",
      "schemaVersion": "0.3",
      "parameters": {
         "ApproverSnsTopicArn": {
            "type": "String",
            "description": "Amazon Simple Notification Service ARN for approvers."
         },
         "Approver": {
            "type": "String",
            "description": "IAM approver"
         },
         "ApproverType": {
            "type": "String",
            "description": "Approver types for the request. Allowed values include IamUser, IamGroup, IamRole, SSOGroup, and SSOUser."
         }
      },
      "executableRunBooks": [
         {
            "name": "AWS-HelloWorld",
            "version": "1"
         }
      ],
      "emergencyChange": false,
      "autoApprovable": false,
      "mainSteps": [
         {
            "name": "ApproveAction1",
            "action": "aws:approve",
            "timeoutSeconds": 3600,
            "inputs": {
               "Message": "A sample change request has been submitted for your review in Change Manager. You can approve or reject this request.",
               "EnhancedApprovals": {
                  "NotificationArn": "{{ ApproverSnsTopicArn }}",
                  "Approvers": [
                     {
                        "approver": "John-Doe",
                        "type": "IamUser",
                        "minRequiredApprovals": 1
                     }
                  ]
               }
            }
         },
           {
            "name": "ApproveAction2",
            "action": "aws:approve",
            "timeoutSeconds": 3600,
            "inputs": {
               "Message": "A sample change request has been submitted for your review in Change Manager. You can approve or reject this request.",
               "EnhancedApprovals": {
                  "NotificationArn": "{{ ApproverSnsTopicArn }}",
                  "Approvers": [
                     {
                        "approver": "Admin",
                        "type": "IamRole",
                        "minRequiredApprovals": 3                  
                     }
                  ]
               }
            }
         }
      ]
   }
   ```

1. 运行以下命令创建更改模板。

------
#### [ Linux & macOS ]

   ```
   aws ssm create-document \
       --name MyChangeTemplate \
       --document-format JSON \
       --document-type Automation.ChangeTemplate \
       --content file://MyChangeTemplate.json \
       --tags Key=tag-key,Value=tag-value
   ```

------
#### [ Windows ]

   ```
   aws ssm create-document ^
       --name MyChangeTemplate ^
       --document-format JSON ^
       --document-type Automation.ChangeTemplate ^
       --content file://MyChangeTemplate.json ^
       --tags Key=tag-key,Value=tag-value
   ```

------
#### [ PowerShell ]

   ```
   $json = Get-Content -Path "C:\path\to\file\MyChangeTemplate.json" | Out-String
   New-SSMDocument `
       -Content $json `
       -Name "MyChangeTemplate" `
       -DocumentType "Automation.ChangeTemplate" `
       -Tags "Key=tag-key,Value=tag-value"
   ```

------

   有关可以指定的其他选项的信息，请参阅 [https://docs.aws.amazon.com/cli/latest/reference/ssm/create-document.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/create-document.html)。

   系统将返回类似于以下内容的信息。

   ```
   {
      "DocumentDescription":{
         "CreatedDate":1.585061751738E9,
         "DefaultVersion":"1",
         "Description":"Use this template to update an EC2 Linux AMI. Requires one
         approver specified in the template and an approver specified in the request.",
         "DocumentFormat":"JSON",
         "DocumentType":"Automation",
         "DocumentVersion":"1",
         "Hash":"0d3d879b3ca072e03c12638d0255ebd004d2c65bd318f8354fcde820dEXAMPLE",
         "HashType":"Sha256",
         "LatestVersion":"1",
         "Name":"MyChangeTemplate",
         "Owner":"123456789012",
         "Parameters":[
            {
               "DefaultValue":"",
               "Description":"Level one approvers",
               "Name":"LevelOneApprovers",
               "Type":"String"
            },
            {
               "DefaultValue":"",
               "Description":"Level one approver type",
               "Name":"LevelOneApproverType",
               "Type":"String"
            },
      "cloudWatchMonitors": {
         "monitors": [
            "my-cloudwatch-alarm"
         ]
      }
         ],
         "PlatformTypes":[
            "Windows",
            "Linux"
         ],
         "SchemaVersion":"0.3",
         "Status":"Creating",
         "Tags":[
   
         ]
      }
   }
   ```

您的组织或账户内在 Change Manager 中的 **Settings (设置)** 选项卡上被指定为模板审核人员的用户，将收到新的更改模板正等待其审核的通知。

如果已为更改模板指定 Amazon Simple Notification Service (Amazon SNS) 主题，则当更改模板被拒绝或批准时，系统会发送通知。如果您没有收到与此更改模板相关的通知，可在稍后返回 Change Manager 以检查其状态。

# 审核和批准或拒绝更改模板
<a name="change-templates-review"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

如果您在 Change Manager（AWS Systems Manager 中的一项工具）中被指定为更改模板的审核人员，只要有新的更改模板或新版本的更改模板等待审核，您就会收到通知。Amazon Simple Notification Service (Amazon SNS) 主题可以发送通知。

**注意**  
此功能取决于是否已将您的账户配置为使用 Amazon SNS 主题发送更改模板审核通知。有关指定模板审核人员通知主题的信息，请参阅 [任务 1：配置 Change Manager 用户身份管理和模板审核人员](change-manager-account-setup.md#cm-configure-account-task-1)。

要审核更改模板，请访问您的通知中的链接，登录到 AWS 管理控制台，然后按照本过程中的步骤进行操作。

**审核和批准或拒绝更改模板**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 在 **Overview (概述)** 选项卡底部的 **Change templates (更改模板)** 部分中，选择 **Pending review (等待审核)** 中的编号。

1. 在 **Change templates (更改模板)** 列表中，找到并选择要审核的更改模板的名称。

1. 在摘要页面中，审核更改模板的建议内容，然后执行以下操作之一：
   + 要批准更改模板（这将允许在更改请求中使用该模板），请选择 **Approve**（批准）。
   + 要拒绝更改模板（这将阻止在更改请求中使用该模板），请选择 **Reject**（拒绝）。

# 删除更改模板
<a name="change-templates-delete"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

本主题介绍如何删除您在 Change Manager（Systems Manager 中的一项工具）中创建的模板。如果您正在为企业使用 Change Manager，则此过程将在委托管理员账户中执行。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Templates** 选项卡。

1. 选择要删除的模板的名称。

1. 选择 **Actions, Delete template**（操作，删除模板）。

1. 在确认对话框中，输入 **DELETE** 一词，然后选择 **Delete**（删除）。

# 使用更改请求
<a name="change-requests"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

更改请求是 Change Manager 中的一个请求，旨在运行更新您的 AWS 或本地环境中一个或多个资源的自动化运行手册。更改请求是使用更改模板创建的。

在 Change Manager（AWS Systems Manager 中的一项工具）中创建更改请求时，组织或账户中的一个或多个审批人员必须审核并批准该请求。如果没有获得所需的批准，则不允许运行进行您请求的更改的运行手册工作流。

**Topics**
+ [创建更改请求](change-requests-create.md)
+ [审核和批准或拒绝更改请求](change-requests-review.md)

# 创建更改请求
<a name="change-requests-create"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

在 Change Manager（AWS Systems Manager 中的一项工具）中创建更改请求时，您选择的更改模板通常会执行以下操作：
+ 为更改请求指定审批人员或者指定所需审批人员的数量
+ 指定要用于将您的更改请求通知审批人员的 Amazon Simple Notification Service (Amazon SNS) 主题
+ 指定 Amazon CloudWatch 告警，以监控更改请求的运行手册工作流
+ 确定您可以从哪些自动化运行手册中进行选择，以进行所请求的更改

在某些情况下，可能会配置更改模板，以使您能指定自己的自动化运行手册以供使用，并指定应该审核和批准该请求的人员。

**重要**  
如果您在整个组织中使用 Change Manager，我们建议始终从委托管理员账户进行更改。虽然您可以从组织中的其他账户进行更改，但这些更改不会在委派管理员账户中报告，也无法从该账户查看。

**Topics**
+ [关于更改请求批准](#cm-approvals-requests)
+ [创建更改请求（控制台）](#change-requests-create-console)
+ [创建更改请求 (AWS CLI)](#change-requests-create-cli)

## 关于更改请求批准
<a name="cm-approvals-requests"></a>

根据更改模板中指定的要求，您在该模板中创建的更改请求可能需要获得最多五个*级别*的批准，然后才能为该请求执行运行手册工作流。对于每个级别，模板创建者最多可以指定五个潜在*审批者*。审批者并不限于单个用户。从这个意义上讲，审批者也可以是 IAM 组或 IAM 角色。对于 IAM 组和 IAM 角色，属于该组或角色的一个或多个用户可以提供批准，以获得更改请求所需的批准总数。模板创建者还可以指定数量超过更改模板所需数量的审批者。

**原始审批工作流以及经过更新的审批工作流和/或审批**  
使用在 2023 年 1 月 23 日之前创建的更改模板，必须获得每个指定审批者的批准，更改请求才能在该级别获得批准。例如，在下图所示的批准级别设置中，指定了四个审批者。指定的审批者包括两个用户（John Stiles 和 Ana Carolina Silva），一个包含三个成员的用户组（GroupOfThree），以及一个代表十个用户的用户角色（RoleOfTen）。

![\[批准级别显示需要四个逐行审批者。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/Add-approval-1.png)


要使更改请求在此级别获得批准，该更改请求必须经过 John Stiles、Ana Carolina Silva、`GroupOfThree` 组的一名成员和 `RoleOfTen` 角色的一名成员的批准。

使用在 2023 年 1 月 23 日或之后创建的更改模板，模板创建者可为每个批准级别指定所需批准的总数。这些批准可以来自已被指定为审批者的用户、组和角色的任意组合。一个更改模板对于一个级别可能只需要一次批准，但举例来说，需要指定两个单独的用户、两个组和一个角色作为潜在审批者。

例如，在下图所示的批准级别区域中，需要三次批准。模板指定的审批者包括两个用户（John Stiles 和 Ana Carolina Silva），一个包含三个成员的用户组（`GroupOfThree`），以及一个代表十个用户的用户角色（`RoleOfTen`）。

![\[批准级别显示需要三次批准和四个指定审批者。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/Add-approval-2.png)


如果 `GroupOfThree` 组中的所有三个用户都批准了您的更改请求，则该更改请求即获得了该级别的批准。不必获得来自每个用户、组或角色的批准。最低批准数量可以来自潜在审批者的任意组合。

在创建更改请求后，将向已为该级别的批准通知指定的 Amazon SNS 主题的订阅用户发送通知。更改模板创建者可能已经指定了必须使用的通知主题，或者允许您指定通知主题。

在某一级别获得最低所需批准数量后，将向订阅下一级别 Amazon SNS 主题的审批者发送通知，依此类推。

无论指定了多少个批准级别和审批者，只需拒绝一次更改请求，就会阻止执行该请求的运行手册工作流。

## 创建更改请求（控制台）
<a name="change-requests-create-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台创建更改请求。

**创建更改请求（控制台）**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Create request (创建请求)**。

1. 搜索并选择要用于此更改请求的更改模板。

1. 选择**下一步**。

1. 对于 **Name (名称)**，请输入更改请求的名称，以便于识别其用途，例如 **UpdateEC2LinuxAMI-us-east-2**。

1. 对于 **Runbook (运行手册)**，请选择您要用于进行所请求的更改的运行手册。
**注意**  
如果选择运行手册的选项不可用，则更改模板作者已指定了必须使用哪个运行手册。

1. 对于 **Change request information (更改请求信息)**，请使用 Markdown 提供有关更改请求的其他信息，以帮助审核人员决定是批准还是拒绝更改请求。您使用的模板的作者可能已提供了说明或需要您解答的问题。
**注意**  
Markdown 是一种标记语言，允许您为文档和文档中的各个步骤中添加维基百科式的描述。有关使用 Markdown 的更多信息，请参阅[在 AWS 中使用 Markdown](https://docs.aws.amazon.com/general/latest/gr/aws-markdown.html)。

1. 在 **Workflow start time (工作流开始时间)** 部分中，选择以下选项之一：
   + **Run the operation at a scheduled time (在计划时间运行该操作)** – 对于 **Requested start time (请求的开始时间)**，请输入您建议运行此请求的运行手册工作流的日期和时间。对于 **Estimated end time (估计结束时间)**，请输入您预计运行手册工作流完成的日期和时间。（此时间仅是您为审核人员提供的估计值。）
**提示**  
选择 **View Change Calendar (查看更改日历)**，以检查您指定的时间内是否存在任何阻止事件。
   + **Run the operation as soon as possible after approval (批准后尽快运行操作)**— 如果更改请求获得批准，则运行手册工作流将在出现可以进行更改的非限制时段时立即运行。

1. 在 **Change request approvals (更改请求批准)** 部分中，执行以下操作：

   1. 如果出现 **Approval type (批准类型)** 选项，请选择以下选项之一：
      + **Automatic approval (自动批准)** – 您选择的更改模板将被配置为允许更改请求自动运行，而无需任何审批人员审核。继续执行步骤 11。
**注意**  
在管理 Systems Manager 使用的 IAM policy 中指定的权限，不得限制您为使更改请求能够自动运行而提交自动批准更改请求。
      + **Specify approvers (指定审批人员)** – 您必须添加一个或多个用户、组或 IAM 角色，才能查看和批准此更改请求。
**注意**  
即便在管理 Systems Manager 使用的 IAM policy 中指定的权限允许您运行自动批准更改请求，您也可以选择指定审核人员。

   1. 选择 **Add approver (添加审批人员)**，然后从可用审核人员的列表中选择一个或多个用户、组或 AWS Identity and Access Management (IAM) 角色。
**注意**  
可能已指定了一个或多个审批人员。这意味着已在您选择的更改模板中指定了强制审批人员。不能从请求中移除这些批准者。如果**添加审批者**按钮不可用，则您选择的模板不允许将其他审核者添加到请求。

      有关批准更改请求的更多信息，请参阅 [关于更改请求批准](#cm-approvals-requests)。

   1. 在 **SNS topic to notify approvers (用于通知审批人员的 SNS 主题)** 中，请选择以下选项之一，以便在您的账户中指定要用于向您添加到此更改请求的审批人员发送通知的 Amazon SNS 主题。
**注意**  
如果用于指定 Amazon SNS 主题的选项不可用，则您选择的更改模板已指定了要使用的 Amazon SNS 主题。
      + **Enter an SNS Amazon Resource Name (ARN)** [输入 SNS Amazon 资源名称 (ARN)] – 对于 **Topic ARN**（主题 ARN），请输入现有 Amazon SNS 主题的 ARN。此主题可以位于您组织的任何账户中。
      + **Select an existing SNS topic (选择现有 SNS 主题)** – 对于 **Target notification topic (设定通知主题目标)**，选择您的当前账户中现有 Amazon SNS 主题的 ARN。（如果您尚未在当前的 AWS 账户 和 AWS 区域 中创建任何 Amazon SNS 主题，则此选项不可用。）
**注意**  
您选择的 Amazon SNS 主题必须被配置为指定它所发送的通知，以及接收这些通知的订阅者。其访问策略还必须向 Systems Manager 授予权限，以便 Change Manager 可以发送通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

   1. 选择 **Add notification（添加通知）**。

1. 选择**下一步**。

1. 对于 **IAM role (IAM 角色)**，请选择*您的当前账户中*拥有所需权限、能够运行为此更改请求指定的运行手册的 IAM 角色。

   此角色也称为 自动化的服务角色或代入角色。有关该角色的更多信息，请参阅 [设置自动化](automation-setup.md)。

1. 在 **Deployment location (部署位置)** 部分中，选择以下选项之一：
**注意**  
如果您仅将 Change Manager 用于单个 AWS 账户，而非用于在 AWS Organizations 中设置的组织，则不需要指定部署位置。
   + **Apply change to this account (将更改应用于此账户)** – 运行手册工作流仅在当前账户中运行。对于组织，这意味着委托管理员账户。
   + **Apply change to multiple organizational units (OUs) (将更改应用于多个组织单元 (OU))** – 请执行以下操作：

     1. 对于 **Accounts and organizational units (OUs) (账户和组织单位 (OU))**，请输入您的组织中成员账户的 ID，格式为 **123456789012**；或组织单位的 ID，格式为 **o-o96EXAMPLE**。

     1. （可选）对于 **Execution role name (执行角色名称)**，请输入*目标账户*或 OU 中拥有所需权限、能够运行为此更改请求指定的运行手册的 IAM 角色的名称。您指定的任何 OU 中的所有账户都应该为此角色使用相同的名称。

     1. （可选）对于您要指定的每个额外账户或 OU，请选择 **Add another target location (添加其他目标位置)**，并重复步骤 a 和 b。

     1. 对于 **Target AWS 区域 (目标 Amazon Web Services Region)**，请选择要在其中进行更改的 Region，例如为美国东部（俄亥俄）区域选择 `Ohio (us-east-2)`。

     1. 展开 **Rate control (速率控制)**。

        对于 **Concurrency (并发)**，请输入一个数字，然后从列表中选择此数字是表示可在其中同时运行运行手册工作流的账户数量还是百分比。

        对于 **Error threshold (错误阈值)**，请输入一个数字，然后从列表中选择此数字是表示在停止操作之前其中的运行手册工作流可能失败的账户数量还是百分比。

1. 在 **Deployment targets (部署目标)** 部分中，执行以下操作：

   1. 选择下列选项之一：
      + **Single resource (单个资源)** – 仅对一个资源进行更改。例如，单个节点或单个 Amazon Machine Image (AMI)，具体取决于在此更改请求的运行手册中定义的操作。
      + **Multiple resources (多个资源)** – 对于 **Parameter (参数)**，请从此更改请求的运行手册内的可用参数中进行选择。此选择反映了要更新的资源的类型。

        例如，如果此更改请求的运行手册为 `AWS-RetartEC2Instance`，则可选择 `InstanceId`，然后通过从以下选项中进行选择，来定义要更新的实例：
        + **Specify tags (指定标签)** - 输入标记要更新的所有资源时使用的键值对。
        + **Choose a resource group (选择资源组)** - 选择要更新的所有资源所属的资源组的名称。
        + **Specify parameter values (指定参数值)** - 确定 **Runbook parameters (运行手册参数)** 部分中要更新的资源。
        + **Target all instances**（将所有实例设为目标）- 对目标位置中的所有托管式节点进行更改。

   1. 如果您选择了 **Multiple resources (多个资源)**，请展开 **Rate control (速率控制)**。

      对于 **Concurrency (并发)**，请输入一个数字，然后从列表中选择此数字是表示运行手册工作流可以同时更新的目标的数量还是百分比。

      对于 **Error threshold (错误阈值)**，请输入一个数字，然后从列表中选择此数字是表示在停止操作之前更新可能失败的目标的数量还是百分比。

1. 如果您选择了 **Specify parameter values (指定参数值)**，以更新上一步中的多个资源：在 **Runbook parameters (运行手册参数)** 部分中，指定所需输入参数的值。您必须提供的参数值基于与所选更改模板相关联的自动化运行手册的内容。

   例如，如果更改模板使用 `AWS-RetartEC2Instance` 运行手册，则您必须为 **InstanceId** 参数输入一个或多个实例 ID。或者，选择 **Show interactive instance picker (显示交互式实例选择器)**，然后逐个选择可用实例。

1. 选择**下一步**。

1. 在 **Review and submit (审核并提交)** 页面上，仔细检查您为此更改请求指定的资源和选项。

   对于您要对其进行更改的任何部分，请选择 **Edit (编辑)** 按钮。

   如果您对更改请求详细信息感到满意，请选择 **Submit for approval (提交以供批准)**。

如果已在您为请求选择的更改模板中指定了 Amazon SNS 主题，则当该请求被拒绝或批准时，系统会发送通知。如果您未收到有关该请求的通知，您可以返回到 Change Manager 以检查您的请求的状态。

## 创建更改请求 (AWS CLI)
<a name="change-requests-create-cli"></a>

您可以使用 AWS Command Line Interface (AWS CLI) 创建更改请求，方法是在 JSON 文件中指定更改请求的选项和参数，并使用 `--cli-input-json` 选项将其包含在您的命令中。

**创建更改请求 (AWS CLI)**

1. 安装并配置 AWS Tools for PowerShell (AWS CLI)（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。

1. 在本地计算机上使用 `MyChangeRequest.json` 之类的名称创建一个 JSON 文件，然后将以下内容粘贴到此文件中。

   将*占位符*替换为您的更改请求的值。
**注意**  
此示例 JSON 使用 `AWS-HelloWorldChangeTemplate` 更改模板和 `AWS-HelloWorld` 运行手册创建更改请求。要帮助您根据自己的更改请求调整此示例，请参阅**《AWS Systems Manager API Reference》中的 [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_StartChangeRequestExecution.html)，以了解有关所有可用参数的信息  
有关批准更改请求的更多信息，请参阅 [关于更改请求批准](#cm-approvals-requests)。

   ```
   {
       "ChangeRequestName": "MyChangeRequest",
       "DocumentName": "AWS-HelloWorldChangeTemplate",
       "DocumentVersion": "$DEFAULT",
       "ScheduledTime": "2021-12-30T03:00:00",
       "ScheduledEndTime": "2021-12-30T03:05:00",
       "Tags": [
           {
               "Key": "Purpose",
               "Value": "Testing"
           }
       ],
       "Parameters": {
           "Approver": [
               "JohnDoe"
           ],
           "ApproverType": [
               "IamUser"
           ],
           "ApproverSnsTopicArn": [
               "arn:aws:sns:us-east-2:123456789012:MyNotificationTopic"
           ]
       },
       "Runbooks": [
           {
               "DocumentName": "AWS-HelloWorld",
               "DocumentVersion": "1",
               "MaxConcurrency": "1",
               "MaxErrors": "1",
               "Parameters": {
                   "AutomationAssumeRole": [
                       "arn:aws:iam::123456789012:role/MyChangeManagerAssumeRole"
                   ]
               }
           }
       ],
       "ChangeDetails": "### Document Name: HelloWorldChangeTemplate\n\n## What does this document do?\nThis change template demonstrates the feature set available for creating change templates for Change Manager. This template starts a Runbook workflow for the Automation document called AWS-HelloWorld.\n\n## Input Parameters\n* ApproverSnsTopicArn: (Required) Amazon Simple Notification Service ARN for approvers.\n* Approver: (Required) The name of the approver to send this request to.\n* ApproverType: (Required) The type of reviewer.\n  * Allowed Values: IamUser, IamGroup, IamRole, SSOGroup, SSOUser\n\n## Output Parameters\nThis document has no outputs \n"
   }
   ```

1. 在创建此 JSON 文件的目录中，运行以下命令。

   ```
   aws ssm start-change-request-execution --cli-input-json file://MyChangeRequest.json
   ```

   系统将返回类似于以下内容的信息。

   ```
   {
       "AutomationExecutionId": "b3c1357a-5756-4839-8617-2d2a4EXAMPLE"
   }
   ```

# 审核和批准或拒绝更改请求
<a name="change-requests-review"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

如果在 Change Manager（AWS Systems Manager 中的一项工具）中被指定为更改请求的审核人员，只要有新的更改请求等待审核，您就会通过 Amazon Simple Notification Service（Amazon SNS）主题收到通知。

**注意**  
此功能取决于是否在更改模板中指定了 Amazon SNS 来发送审核通知。有关信息，请参阅[为 Change Manager 通知配置 Amazon SNS 主题](change-manager-sns-setup.md)。

要审核更改请求，可以访问您的通知中的链接，或直接登录到 AWS 管理控制台，然后按照本过程中的步骤进行操作。

**注意**  
如果在更改模板中为审核人员分配了 Amazon SNS 主题，则当更改请求状态发生变化时，会向该主题的订阅者发送通知。  
有关批准更改请求的更多信息，请参阅 [关于更改请求批准](change-requests-create.md#cm-approvals-requests)。

## 审核和批准或拒绝更改请求（控制台）
<a name="change-requests-review-console"></a>

以下过程介绍了如何使用 Systems Manager 控制台审核和批准或拒绝更改请求。

**审核和批准或拒绝更改请求**

1. 打开您收到的电子邮件通知中的链接，然后登录到 AWS 管理控制台，它将引导您转到供您审核的更改请求。

1. 在摘要页面中，审核更改请求的建议内容。

   要批准更改请求，请选择 **Approve (批准)**。在对话框中，提供您要为此批准添加的任何注释，然后选择 **Approve (批准)**。此请求所代表的运行手册工作流将按计划开始运行，或在更改未被任何限制阻止时立即开始运行。

   –或者–

   要拒绝更改请求，请选择 **Reject (拒绝)**。在对话框中，提供您要为此拒绝添加的任何注释，然后选择 **Reject (拒绝)**。

**批量审核和批准或拒绝更改请求**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Approvals**（批准）选项卡。

1. （可选）通过选择每个请求的名称来查看等待批准的请求的详细信息，然后返回到 **Approvals**（批准）选项卡。

1. 选中要批准的每个更改请求的复选框。

   –或者–

   选中要拒绝的每个更改请求的复选框。

1. 在对话框中，提供您要为此批准或拒绝添加的任何注释。

1. 根据您是要批准还是拒绝选定的更改请求，选择 **Approve**（批准）或 **Reject**（拒绝）。

## 审核和批准或拒绝更改请求（命令行）
<a name="change-requests-review-command-line"></a>

以下过程介绍了如何使用 AWS Command Line Interface（AWS CLI）（在 Linux、macOS 或 Windows Server 上）审核并批准或拒绝更改请求。

**审核和批准或拒绝更改请求**

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 在您的本地计算机上创建一个 JSON 文件，该文件将为您的 AWS CLI 调用指定参数。

   ```
   {
     "OpsItemFilters": 
     [
       {
         "Key": "OpsItemType",
         "Values": ["/aws/changerequest"],
         "Operator": "Equal"
       }
     ],
     "MaxResults": number
   }
   ```

   您可以通过在该 JSON 文件中指定审批人员的 Amazon Resource Name (ARN) 来筛选特定审批人员的结果。见下列。

   ```
   {
     "OpsItemFilters": 
     [
       {
         "Key": "OpsItemType",
         "Values": ["/aws/changerequest"],
         "Operator": "Equal"
       },
       {
         "Key": "ChangeRequestByApproverArn",
         "Values": ["arn:aws:iam::account-id:user/user-name"],
         "Operator": "Equal"
       }
     ],
     "MaxResults": number
   }
   ```

1. 运行以下命令可以查看您在 JSON 文件中指定的最大更改请求数量。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-ops-items \
   --cli-input-json file://filename.json
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-ops-items ^
   --cli-input-json file://filename.json
   ```

------

1. 运行以下命令可以批准或拒绝更改请求。

------
#### [ Linux & macOS ]

   ```
   aws ssm send-automation-signal \
       --automation-execution-id ID \
       --signal-type Approve_or_Reject \
       --payload Comment="message"
   ```

------
#### [ Windows ]

   ```
   aws ssm send-automation-signal ^
   --automation-execution-id ID ^
       --signal-type Approve_or_Reject ^
       --payload Comment="message"
   ```

------

   如果已在您为请求选择的更改模板中指定了 Amazon SNS 主题，则当该请求被拒绝或批准时，系统会发送通知。如果您未收到有关该请求的通知，您可以返回到 Change Manager 以检查您的请求的状态。有关使用此命令时其他选项的信息，请参阅 **《AWS CLI Command Reference》的 AWS Systems Manager 部分中的 [https://docs.aws.amazon.com/cli/latest/reference/ssm/send-automation-signal.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/send-automation-signal.html)。

# 审核更改请求详细信息、任务和时间表（控制台）
<a name="reviewing-changes"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以在 Change Manager（AWS Systems Manager 中的一项工具）的控制面板中查看有关更改请求（包括已处理其更改的请求）的信息。这些详细信息包含一个链接，它指向运行进行更改的运行手册的自动化操作。在创建请求时会生成自动化执行 ID，但仅在获得所有批准并且没有部署任何阻止更改的限制的情况下，该流程才会运行。

**审核更改请求详细信息、任务和时间表**

1. 在导航窗格中，请选择 **Change Manager**。

1. 选择 **Requests (请求)** 选项卡。

1. 在 **Change requests (更改请求)** 部分中，搜索您要审核的更改请求。

   您可以使用 **Create date range (创建日期范围)** 选项，将结果限制在特定时间段内。

   您可以通过以下属性筛选请求：
   + `Status`
   + `Request ID`
   + `Approver`
   + `Requester`

   例如，要查看有关在过去 24 小时内成功完成的所有更改请求的详细信息，请执行以下操作：

   1. 对于 **Create date range (创建日期范围)**，请选择 **1d**。

   1. 在搜索框中，选择 **Status (状态)、CompletedWithSuccess**。

   1. 在结果中，选择要审核其结果的、已成功完成的更改请求的名称。

1. 在以下选项卡上查看有关更改请求的信息：
   + **Request details (请求详细信息)** - 查看有关更改请求的基本详细信息，包括请求者、更改模板，和为更改选择的自动化运行手册。您还可以访问指向自动化操作详细信息的链接，查看有关请求中指定的任何运行手册参数、分配给更改请求的 Amazon CloudWatch 告警以及为请求提供的批准和注释的信息。
   + **Task (任务)** - 查看有关更改中的任务的信息，包括已完成的更改请求的任务状态、目标资源、关联的自动化运行手册中的步骤，以及并发和错误阈值详细信息。
   + **Timeline (时间表)** - 查看与更改请求关联的所有事件的摘要，按日期和时间列出。该摘要将指明创建更改请求的时间、指定的审批人员的操作、已批准的更改请求计划运行时间的记录、运行手册工作流详细信息，以及运行手册中整个更改流程和每个步骤的状态变化。
   + **Associated events**（关联事件）：查看有关在 [AWS CloudTrail Lake](https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-lake.html) 中记录的变更请求的可审批详细信息。详细信息包括运行了哪些 API 操作、这些操作包含的请求参数、运行操作的用户账户、在此过程中更新的资源等。

     当您启用 CloudTrail Lake 事件跟踪时，CloudTrail Lake 会为与您的变更请求相关的事件创建事件数据存储。事件详细信息适用于提出变更请求的账户或组织。您可以通过账户或组织中的任何变更请求启用 CloudTrail Lake 事件跟踪。有关启用 CloudTrail Lake 集成和创建事件数据存储的信息，请参阅 [监控您的变更请求事件](monitoring-change-request-events.md)。
**注意**  
使用 **CloudTrail Lake** 需要付费。有关详细信息，请参阅 [AWS CloudTrail 定价](https://aws.amazon.com/cloudtrail/pricing/)。

# 查看更改请求的聚合计数（命令行）
<a name="change-requests-review-aggregate-command-line"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以使用 [GetOpsSummary](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_GetOpsSummary.html) API 操作，查看 Change Manager（AWS Systems Manager 中的一项工具）中更改请求的汇总计数。此 API 操作可以返回单个 AWS 区域中的单个 AWS 账户的计数，或者多个账户和多个区域的计数。

**注意**  
如果您要查看多个 AWS 账户 和多个 AWS 区域 的聚合计数，必须设置和配置资源数据同步。有关更多信息，请参阅 [为 Inventory 创建资源数据同步](inventory-create-resource-data-sync.md)。

以下过程介绍了如何使用 AWS Command Line Interface（AWS CLI）（在 Linux、macOS 或 Windows Server 上）查看更改请求的聚合计数。

**查看更改请求的聚合计数**

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 运行以下命令之一。

   **Single account and Region (单个账户和区域)**

   此命令将返回为其配置您的 AWS CLI 会话的 AWS 账户 和 AWS 区域 的所有更改请求的计数。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-ops-summary \
   --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal \
   --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------
#### [ Windows ]

   ```
   aws ssm get-ops-summary ^
   --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal ^
   --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------

   该调用将返回类似于以下内容的信息。

   ```
   {
       "Entities": [
           {
               "Data": {
                   "AWS:OpsItem": {
                       "Content": [
                           {
                               "Count": "38",
                               "Status": "Open"
                           }
                       ]
                   }
               }
           }
       ]
   }
   ```

   **Multiple accounts and/or Regions (多个账户和/或区域)**

   此命令将返回在资源数据同步中指定的 AWS 账户和 AWS 区域的所有更改请求的计数。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-ops-summary \
       --sync-name resource_data_sync_name \
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal \
       --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------
#### [ Windows ]

   ```
   aws ssm get-ops-summary ^
       --sync-name resource_data_sync_name ^
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal ^
       --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------

   该调用将返回类似于以下内容的信息。

   ```
   {
       "Entities": [
           {
               "Data": {
                   "AWS:OpsItem": {
                       "Content": [
                           {
                               "Count": "43",
                               "Status": "Open"
                           },
                           {
                               "Count": "2",
                               "Status": "Resolved"
                           }
                       ]
                   }
               }
           }
       ]
   }
   ```

   **Multiple accounts and a specific Region (多个账户和某一特定区域)**

   此命令将返回在资源数据同步中指定的 AWS 账户 的所有更改请求的计数。但是，它只会返回该命令中指定的区域中的数据。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-ops-summary \
       --sync-name resource_data_sync_name \
       --filters Key=AWS:OpsItem.SourceRegion,Values='Region',Type=Equal Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal \
       --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------
#### [ Windows ]

   ```
   aws ssm get-ops-summary ^
       --sync-name resource_data_sync_name ^
       --filters Key=AWS:OpsItem.SourceRegion,Values='Region',Type=Equal Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal ^
       --aggregators AggregatorType=count,AttributeName=Status,TypeName=AWS:OpsItem
   ```

------

   **Multiple accounts and Regions with output grouped by Region (输出按区域分组的多个账户和区域)**

   此命令将返回在资源数据同步中指定的 AWS 账户和 AWS 区域的所有更改请求的计数。输出将显示每个区域的计数信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-ops-summary \
       --sync-name resource_data_sync_name \
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal \
       --aggregators '[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"Status","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceRegion"}]}]'
   ```

------
#### [ Windows ]

   ```
   aws ssm get-ops-summary ^
       --sync-name resource_data_sync_name ^
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal ^
       --aggregators '[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"Status","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceRegion"}]}]'
   ```

------

   该调用将返回类似于以下内容的信息。

   ```
   {
           "Entities": [
               {
                   "Data": {
                       "AWS:OpsItem": {
                           "Content": [
                               {
                                   "Count": "38",
                                   "SourceRegion": "us-east-1",
                                   "Status": "Open"
                               },
                               {
                                   "Count": "4",
                                   "SourceRegion": "us-east-2",
                                   "Status": "Open"
                               },
                               {
                                   "Count": "1",
                                   "SourceRegion": "us-west-1",
                                   "Status": "Open"
                               },
                               {
                                   "Count": "2",
                                   "SourceRegion": "us-east-2",
                                   "Status": "Resolved"
                               }
                           ]
                       }
                   }
               }
           ]
       }
   ```

   **Multiple accounts and Regions with output grouped by accounts and Regions (输出按帐户和区域分组的多个账户和区域)**

   此命令将返回在资源数据同步中指定的 AWS 账户 和 AWS 区域 的所有更改请求的计数。输出将按账户和区域对计数信息进行分组。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-ops-summary \
       --sync-name resource_data_sync_name \
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal \
       --aggregators '[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"Status","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceAccountId","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceRegion"}]}]}]'
   ```

------
#### [ Windows ]

   ```
   aws ssm get-ops-summary ^
       --sync-name resource_data_sync_name ^
       --filters Key=AWS:OpsItem.OpsItemType,Values="/aws/changerequests",Type=Equal ^
       --aggregators '[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"Status","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceAccountId","Aggregators":[{"AggregatorType":"count","TypeName":"AWS:OpsItem","AttributeName":"SourceRegion"}]}]}]'
   ```

------

   该调用将返回类似于以下内容的信息。

   ```
   {
       "Entities": [
           {
               "Data": {
                   "AWS:OpsItem": {
                       "Content": [
                           {
                               "Count": "38",
                               "SourceAccountId": "123456789012",
                               "SourceRegion": "us-east-1",
                               "Status": "Open"
                           },
                           {
                               "Count": "4",
                               "SourceAccountId": "111122223333",
                               "SourceRegion": "us-east-2",
                               "Status": "Open"
                           },
                           {
                               "Count": "1",
                               "SourceAccountId": "111122223333",
                               "SourceRegion": "us-west-1",
                               "Status": "Open"
                           },
                           {
                               "Count": "2",
                               "SourceAccountId": "444455556666",
                               "SourceRegion": "us-east-2",
                               "Status": "Resolved"
                           },
                           {
                               "Count": "1",
                               "SourceAccountId": "222222222222",
                               "SourceRegion": "us-east-1",
                               "Status": "Open"
                           }
                       ]
                   }
               }
           }
       ]
   }
   ```

# 审计和记录 Change Manager 活动
<a name="change-manager-auditing"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

您可以使用 Amazon CloudWatch 和 AWS CloudTrail 警报，审核 Change Manager（AWS Systems Manager 中的一项工具）中的活动。

有关 Systems Manager 的审计和日志记录选项的更多信息，请参阅 [AWS Systems Manager 中的日志记录和监控](monitoring.md)。

## 使用 CloudWatch 告警审计 Change Manager
<a name="change-manager-logging-auditing-alarms"></a>

您可以配置 CloudWatch 告警并将其分配给更改模板。如果满足该告警中定义的任何条件，则将执行为该告警指定的操作。在告警配置中，您可以指定 Amazon Simple Notification Service (Amazon SNS) 主题，以便在满足告警条件时发送通知。

有关创建 Change Manager 模板的信息，请参阅 [使用更改模板](change-templates.md)。

有关创建 CloudWatch 告警的信息，请参阅 [Amazon CloudWatch 用户指南](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)中的*使用 CloudWatch 告警*。

## 使用 CloudTrail 审计 Change Manager 的活动
<a name="change-manager-logging-auditing-cloudtrail"></a>

CloudTrail 可以捕获在 Systems Manager 控制台、AWS Command Line Interface (AWS CLI) 和 Systems Manager 软件开发工具包中进行的 API 调用。您可以在 CloudTrail 控制台或 Amazon Simple Storage Service (Amazon S3) 存储桶中查看信息，这些信息存储在其中。账户的所有 CloudTrail 日志都存储在一个存储桶中。

Change Manager 操作的日志可以显示更改模板文档创建、更改模板和更改请求批准及拒绝、自动化运行手册生成的活动等。有关查看和使用 Systems Manager 活动的 CloudTrail 日志的更多信息，请参阅 [使用 AWS CloudTrail 记录 AWS Systems Manager API 调用](monitoring-cloudtrail-logs.md)。

# 排除 Change Manager 问题
<a name="change-manager-troubleshooting"></a>

**Change Manager 可用性变更**  
自 2025 年 11 月 7 日起，AWS Systems Manager Change Manager 将不再向新客户开放。如果想要使用 Change Manager，请在该日期之前注册。现有客户可以继续正常使用该服务。有关更多信息，请参阅 [AWS Systems Manager Change Manager 可用性变更](https://docs.aws.amazon.com/systems-manager/latest/userguide/change-manager-availability-change.html)。

利用以下信息，帮助排查Change Manager（AWS Systems Manager 中的一项工具）出现的问题。

**Topics**
+ [在使用 Active Directory（组）时，在更改请求批准期间出现“Group *\$1GUID\$1* not found”（未找到组 \$1GUID\$1）错误。](#change-manager-troubleshooting-sso)

## 在使用 Active Directory（组）时，在更改请求批准期间出现“Group *\$1GUID\$1* not found”（未找到组 \$1GUID\$1）错误。
<a name="change-manager-troubleshooting-sso"></a>

**问题**：在将 AWS IAM Identity Center（IAM Identity Center）用于用户身份管理时，已在 Change Manager 中获得批准权限的 Active Directory 组成员收到“not authorized”（未授权）或“group not found”（未找到组）错误。
+ **解决方法**：当您在 IAM Identity Center 中选择 Active Directory 组以访问 AWS 管理控制台 时，系统将计划定期同步，以将这些 Active Directory 组中的信息复制到 IAM Identity Center。必须完成此流程，然后通过 Active Directory 组成员身份授权的用户才能成功批准请求。有关更多信息，请参阅 *AWS IAM Identity Center 用户指南*中的[连接到您的 Microsoft AD 目录](https://docs.aws.amazon.com/singlesignon/latest/userguide/manage-your-identity-source-ad.html)。

# AWS Systems Manager 文档
<a name="documents"></a>

AWS Systems Manager 文档 (SSM document) 定义 Systems Manager 对您的托管实例执行的操作。Systems Manager 包括 100 个预先配置的文档，您可以在运行时通过指定参数进行使用。您可以在 Systems Manager 文档控制台中找到预配置的文档，方法是选择 **Owned by Amazon**（Amazon 所有）选项卡，或者通过在调用 `ListDocuments` API 操作时指定 Amazon `Owner` 筛选条件。文档使用 JavaScript 对象表示法 (JSON) 或 YAML，并包括您指定的步骤和参数。

为增强安全性，从 2025 年 7 月 14 日起，SSM 文档在处理参数时支持环境变量插值。此功能在 2.2 版架构和 3.3.2746.0 或更高版本的 SSM Agent 中可用，可帮助防范命令注入攻击。

要开始使用 SSM 文档，请打开 [Systems Manager 控制台](https://console.aws.amazon.com/systems-manager/documents)。在导航窗格中，选择**文档**。

**重要**  
在 Systems Manager 中，*Amazon 拥有的* SSM 文档是由 Amazon Web Services 自己创建和管理的文档。*Amazon 拥有的*文档在文档名称中包含 `AWS-*` 之类的前缀。文档的所有者被视为 Amazon，而不是 AWS 内的特定用户账户。这些文档可供所有人公开使用。

## 我的组织如何从 Documents 工具获益？
<a name="ssm-docs-benefits"></a>

Documents（AWS Systems Manager 中的一项工具）具有以下优点：
+ **文档类别**

  为了帮助您找到所需的文档，请根据要搜索的文档类型选择一个类别。要扩大搜索范围，您可以选择同一文档类型的多个类别。不支持选择不同文档类型的类别。分类仅支持 Amazon 拥有的文档。
+  **文档版本** 

  您可以创建并保存不同版本的文档。您可以为每个文档指定默认版本。文档的默认版本可以更新到较新版本或恢复到较旧版本。当您更改文档的内容时，Systems Manager 将自动递增文档的版本。您可以通过在控制台、AWS Command Line Interface (AWS CLI) 命令或 API 调用中指定文档版本来检索或使用任何版本的文档。
+  **根据您的需求自定义文档** 

  如果您要通过文档自定义步骤和操作，可以自行创建文档。系统将文档与您的 AWS 账户 一起存储在创建其所在的 AWS 区域 中。有关如何创建 SSM 文档的更多信息，请参阅 [创建 SSM 文档内容](documents-creating-content.md)。
+  **标记文档** 

  您可以标记文档，以便根据为其分配的标签快速识别一个或多个文档。例如，您可以为特定环境、部门、用户、组或时间段的文档添加标签。此外，您还可以通过创建一个指定用户或组可访问的标签的 AWS Identity and Access Management (IAM) policy 来限制对文档的访问。
+  **共享文档** 

  您可以将文档公开，或者将它们与同一 AWS 区域 区域中的特定 AWS 账户 共享。在账户之间共享文档可能很有用，例如，如果您希望提供给客户或员工的所有 Amazon Elastic Compute Cloud (Amazon EC2) 实例都能够具有相同配置。除了保持实例上的应用程序或补丁的最新状态，您可能还希望限制客户实例执行某些活动。或者，您可能需要确保整个组织的员工账户使用的实例均被授予访问特定内部资源的访问权限。有关更多信息，请参阅 [共享 SSM 文档](documents-ssm-sharing.md)。

## 谁应该使用文档？
<a name="documents-who"></a>
+ 任何希望使用 Systems Manager 工具大规模提高其运营效率、减少与手动干预相关的错误以及缩短解决常见问题的时间的 AWS 客户。
+ 希望自动执行部署和配置任务的基础设施专家。
+ 想要可靠地解决常见问题、提高故障排除效率和减少重复性操作的管理员。
+ 想要自动执行通常需要手动执行的任务的用户。

## SSM 文档有哪些类型？
<a name="what-are-document-types"></a>

下表介绍了不同类型的 SSM 文档及其使用。


****  

| Type | 一起使用 | Details | 
| --- | --- | --- | 
|  ApplicationConfiguration ApplicationConfigurationSchema  |   [AWS AppConfig](https://docs.aws.amazon.com/appconfig/latest/userguide/what-is-appconfig.html)   |  AWS AppConfig 是 AWS Systems Manager 中的一项工具，可让您创建、管理以及快速部署应用程序配置。您可以通过创建使用 `ApplicationConfiguration` 文档类型的文档，从而将配置数据存储到 SSM 文档中。有关更多信息，请参阅《AWS AppConfig 用户指南》**中的[自由度配置](https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-configuration-and-profile.html#free-form-configurations)。 如果在 SSM 文档中创建配置，则必须指定对应的 JSON Schema。该 schema 使用 `ApplicationConfigurationSchema` 文档类型，并且与一组规则类似，它会定义每个应用程序配置设置允许的属性。有关更多信息，请参阅《AWS AppConfig 用户指南》**中的[关于验证器](https://docs.aws.amazon.com/appconfig/latest/userguide/appconfig-creating-configuration-and-profile-validators.html)。  | 
|  自动化运行手册  |   [自动化](systems-manager-automation.md)   [State Manager](systems-manager-state.md)   [Maintenance Windows](maintenance-windows.md)   |  在执行常规维护和部署任务 – 如创建或更新 Amazon Machine Image (AMI)时使用自动化手册 - 使用自动化运行手册。State Manager 使用自动化运行手册应用配置。这些操作可以在实例生命周期内的任何时刻在一个或多个目标上运行。Maintenance Windows 使用自动化运行手册基于指定的计划执行常规维护和部署任务。 macOS 的 EC2 实例也支持基于 Linux 的操作系统支持的所有自动化运行手册。  | 
|  更改日历文档  |   [Change Calendar](systems-manager-change-calendar.md)   |  Change Calendar 是 AWS Systems Manager 中的一项工具，使用 `ChangeCalendar` 文档类型。Change Calendar 文档存储日历条目和关联的事件，这些事件可以允许或阻止自动化操作更改您的环境。在 Change Calendar 中，文档以明文格式存储 [iCalendar 2.0](https://icalendar.org/) 数据。 Change Calendar 在 EC2 实例上不支持 macOS。  | 
|  AWS CloudFormation 模板  |   [AWS CloudFormation](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/Welcome.html)   |  AWS CloudFormation 模板描述您要在 CloudFormation 堆栈中调配的资源。通过将 CloudFormation 模板存储为 Systems Manager 文档，您可以受益于 Systems Manager 文档功能。其中包括创建和比较模板的多个版本，以及与同一 AWS 区域 中的其它账号共享模板。 您可以使用 Application Manager（Systems Manager 中的一项工具）创建和编辑 CloudFormation 模板及堆栈。有关更多信息，请参阅 [在 Application Manager 中使用 CloudFormation 模板和堆栈](application-manager-working-stacks.md)。  | 
|  命令文档  |   [Run Command](run-command.md)   [State Manager](systems-manager-state.md)   [Maintenance Windows](maintenance-windows.md)   |  Run Command 是 AWS Systems Manager 中的一项工具，使用命令文档运行命令。State Manager是 AWS Systems Manager 中的一项工具，使用命令文档应用配置。这些操作可以在实例生命周期内的任何时刻在一个或多个目标上运行。Maintenance Windows 是 AWS Systems Manager 中的一项工具，使用命令文档基于指定的计划应用配置。 大多数命令文档在所有 Linux 和 Systems Manager 所支持的 Windows Server 操作系统上受支持。macOS 的 EC2 实例支持以下命令文档： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/documents.html)  | 
|  AWS Config 一致性包模板  |   [AWS Config](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)   |  AWS Config 一致性包模板是 YAML 格式的文档，用于创建包含 AWS Config 规则（托管或自定义）和修复操作列表的一致性包。 有关更多信息，请参阅[一致性包](https://docs.aws.amazon.com/config/latest/developerguide/conformance-packs.html)。  | 
|  软件包文档  |   [Distributor](distributor.md)   |  在 Distributor（AWS Systems Manager 中的一项工具）中，软件包用 SSM 文档表示。软件包文档包括附加的 ZIP 存档文件，其中包含要在托管实例上安装的软件或资产。在 Distributor 中创建软件包会创建软件包文档。 Oracle Linux 和 macOS 托管实例上不受支持 Distributor。  | 
|  策略文档  |   [State Manager](systems-manager-state.md)   |  Inventory 是 AWS Systems Manager 中的一项工具，使用 `AWS-GatherSoftwareInventory` 策略文档和State Manager关联从托管式实例中收集清单数据。在创建您自己的 SSM 文档时，自动化文档和命令文档是在托管实例上实施策略的首选方法。 Systems Manager 清单和 `AWS-GatherSoftwareInventory` 策略文档在 Systems Manager 所支持的所有操作系统上均受支持。  | 
|  事件后分析模板  |   [Incident Manager 事件后分析](https://docs.aws.amazon.com/incident-manager/latest/userguide/analysis.html)   |  Incident Manager 使用事件后分析模板基于 AWS 运营管理最佳实践创建分析。 使用模板创建分析，您的团队可以使用该分析来了解如何改进事件响应。  | 
|  会话文档  |   [Session Manager](session-manager.md)   |  Session Manager 是 AWS Systems Manager 中的一项工具，使用会话文档确定要启动哪些类型的会话，例如端口转发会话、运行交互式命令的会话或创建 SSH 隧道的会话。 Systems Manager 支持的所有 Linux 和 Windows Server 操作系统都支持会话文档。macOS 的 EC2 实例支持以下命令文档： [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/documents.html)  | 

**SSM 文档配额**  
有关 SSM 服务配额的更多信息，请参阅《Amazon Web Services 一般参考》**中的 [Systems Manager Service Quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。

**Topics**
+ [我的组织如何从 Documents 工具获益？](#ssm-docs-benefits)
+ [谁应该使用文档？](#documents-who)
+ [SSM 文档有哪些类型？](#what-are-document-types)
+ [文档组件](documents-components.md)
+ [创建 SSM 文档内容](documents-creating-content.md)
+ [使用文档](documents-using.md)
+ [参数处理问题的疑难解答](parameter-troubleshooting.md)

# 文档组件
<a name="documents-components"></a>

本部分包含有关构成 SSM 文档的组件的信息。

**Topics**
+ [架构、功能和示例](documents-schemas-features.md)
+ [数据元素和参数](documents-syntax-data-elements-parameters.md)
+ [命令文档插件参考](documents-command-ssm-plugin-reference.md)

# 架构、功能和示例
<a name="documents-schemas-features"></a>

AWS Systems Manager (SSM) 文档当前使用以下架构版本。
+ `Command` 型文档可以使用 1.2、2.0 和 2.2 版架构。如果您使用架构 1.2 文档，我们建议您创建使用架构版本 2.2 的文件。
+ `Policy` 型文档必须使用 2.0 版或更高版本的架构。
+ `Automation` 型文档必须使用 0.3 版架构。
+ `Session` 型文档必须使用 1.0 版架构。
+ 您可以创建 JSON 或 YAML 格式的文档。

有关 `Session` 文档架构的更多信息，请参阅 [会话文档架构](session-manager-schema.md)。

通过为 `Command` 和 `Policy` 文档使用最新架构版本，您可以利用以下功能。


**2.2 版架构文档功能**  

| 功能 | Details | 
| --- | --- | 
|  编辑文档  |  文档现在可以更新。如果版本为 1.2，对文档的任何更新都需要另存为其他名称。  | 
|  自动版本控制  |  对文档的任何更新都会创建一个新版本。这不是架构版本，而是文档版本。  | 
|  默认版本  |  如果您拥有某个文档的多个版本，可以指定哪个版本是默认文档。  | 
|  顺序  |  文档中的插件或*步骤*按指定的顺序运行。  | 
|  跨平台支持  |  跨平台支持可让您为同一个 SSM 文档中的不同插件指定不同操作系统。跨平台支持在某个步骤中使用 `precondition` 参数。  | 
| 参数插值 | 插值是指将变量值插入或替换到字符串中。可以将其想象为在使用字符串之前用实际值填充空白。在 SSM 文档上下文中，参数插值允许在执行命令之前将字符串参数插值到环境变量中，从而更好地防范命令注入攻击。设置为 `ENV_VAR` 时，代理会创建一个包含参数值的环境变量 `SSM_parameter-name`。 | 

**注意**  
您必须将实例上的 AWS Systems Manager SSM Agent 更新到最新版本才能使用新的 Systems Manager 功能和 SSM 文档功能。有关更多信息，请参阅 [使用 Run Command 更新 SSM Agent](run-command-tutorial-update-software.md#rc-console-agentexample)。

下表列出了主要架构版本之间的区别。


****  

| 版本 1.2 | 版本 2.2（最新版本） | Details | 
| --- | --- | --- | 
|  runtimeConfig  |  mainSteps  |  在版本 2.2 中，`mainSteps` 部分替换了 `runtimeConfig` 部分。这些区域有：`mainSteps` 部分允许 Systems Manager 按顺序运行步骤。  | 
|  属性  |  输入  |  在版本 2.2 中，`inputs` 部分替换了 `properties` 部分。`inputs` 部分接受步骤参数。  | 
|   命令  |  runCommand  |  在版本 2.2 中，`inputs` 部分接收 `runCommand` 参数，而不是 `commands` 参数。  | 
|  id  |  action  |  在版本 2.2 中，`Action` 替换了 `ID`。这只是更改了名称。  | 
|  不适用  |  名称  |  在版本 2.2 中，`name` 是用户定义的任意步骤名称。  | 

**使用前提条件参数**  
在 2.2 版或更高版本架构中，您可以使用 `precondition` 参数为每个插件指定目标操作系统验证您在 SSM 文档中定义的输入参数。`precondition` 参数支持引用 SSM 文档的输入参数，`platformType` 使用`Linux` 的值、`MacOS`,和 `Windows`。仅支持 `StringEquals` 运算符。

对于使用 2.2 版或更高版本架构的文档，如果未指定 `precondition`，每个插件将被运行或跳过，具体取决于插件与操作系统的兼容性。插件与操作系统的兼容性在 `precondition` 之前被评估。对于使用 2.0 版或更低版本架构的文档，不兼容的插件将会引发错误。

例如，在 2.2 版架构文档中，如果未指定 `precondition`，将会列出 `aws:runShellScript` 插件，该步骤在 Linux 实例上运行，但系统会在 Windows Server 实例上跳过该步骤，因为 `aws:runShellScript` 与 Windows Server 实例不兼容。但是，对于 2.0 版架构文档，如果您指定 `aws:runShellScript` 插件，然后在 Windows Server 实例上运行文档，执行将会失败。本节稍后将介绍在 SSM 文档中使用前提条件参数的示例。

## 架构版本 2.2
<a name="documents-schema-twox"></a>

**顶级元素**  
以下示例使用 2.2 版架构显示 SSM 文档的顶级元素。

------
#### [ YAML ]

```
---
schemaVersion: "2.2"
description: A description of the document.
parameters:
  parameter 1:
    property 1: "value"
    property 2: "value"
  parameter 2:
    property 1: "value"
    property 2: "value"
mainSteps:
  - action: Plugin name
    name: A name for the step.
    inputs:
      input 1: "value"
      input 2: "value"
      input 3: "{{ parameter 1 }}"
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "A description of the document.",
   "parameters": {
       "parameter 1": {
           "property 1": "value",
           "property 2": "value"
        },
        "parameter 2":{
           "property 1": "value",
           "property 2": "value"
        } 
    },
   "mainSteps": [
      {
         "action": "Plugin name",
         "name": "A name for the step.",
         "inputs": {
            "input 1": "value",
            "input 2": "value",
            "input 3": "{{ parameter 1 }}"
         }
      }
   ]
}
```

------

**2.2 版架构示例**  
以下示例使用 `aws:runPowerShellScript` 插件在目标实例上运行 PowerShell 命令。

------
#### [ YAML ]

```
---
schemaVersion: "2.2"
description: "Example document"
parameters:
  Message:
    type: "String"
    description: "Example parameter"
    default: "Hello World"
    allowedValues: 
    - "Hello World"
mainSteps:
  - action: "aws:runPowerShellScript"
    name: "example"
    inputs:
      timeoutSeconds: '60'
      runCommand:
      - "Write-Output {{Message}}"
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "Example document",
   "parameters": {
      "Message": {
         "type": "String",
         "description": "Example parameter",
         "default": "Hello World",
         "allowedValues": ["Hello World"]
      }
   },
   "mainSteps": [
      {
         "action": "aws:runPowerShellScript",
         "name": "example",
         "inputs": {
            "timeoutSeconds": "60",
            "runCommand": [
               "Write-Output {{Message}}"
            ]
         }
      }
   ]
}
```

------

**架构版本 2.2 前提条件参数示例**  
2.2 版架构提供跨平台支持。这意味着在一个 SSM 文档内，您可以为不同的插件指定不同的操作系统。跨平台支持在某个步骤中使用 `precondition` 参数，如下例所示。您也可以使用 `precondition` 参数来验证您在 SSM 文档中定义的输入参数。您可以在以下第二个示例中看到此内容。

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: cross-platform sample
mainSteps:
- action: aws:runPowerShellScript
  name: PatchWindows
  precondition:
    StringEquals:
    - platformType
    - Windows
  inputs:
    runCommand:
    - cmds
- action: aws:runShellScript
  name: PatchLinux
  precondition:
    StringEquals:
    - platformType
    - Linux
  inputs:
    runCommand:
    - cmds
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "cross-platform sample",
   "mainSteps": [
      {
         "action": "aws:runPowerShellScript",
         "name": "PatchWindows",
         "precondition": {
            "StringEquals": [
               "platformType",
               "Windows"
            ]
         },
         "inputs": {
            "runCommand": [
               "cmds"
            ]
         }
      },
      {
         "action": "aws:runShellScript",
         "name": "PatchLinux",
         "precondition": {
            "StringEquals": [
               "platformType",
               "Linux"
            ]
         },
         "inputs": {
            "runCommand": [
               "cmds"
            ]
         }
      }
   ]
}
```

------

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
parameters:
  action:
    type: String
    allowedValues:
    - Install
    - Uninstall
  confirmed:
    type: String
    allowedValues:
    - True
    - False
mainSteps:
- action: aws:runShellScript
  name: InstallAwsCLI
  precondition:
    StringEquals:
    - "{{ action }}"
    - "Install"
  inputs:
    runCommand:
    - sudo apt install aws-cli
- action: aws:runShellScript
  name: UninstallAwsCLI
  precondition:
    StringEquals:
    - "{{ action }} {{ confirmed }}"
    - "Uninstall True"
  inputs:
    runCommand:
    - sudo apt remove aws-cli
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "parameters": {
      "action": {
         "type": "String",
         "allowedValues": [
            "Install",
            "Uninstall"
         ]
      },
      "confirmed": {
         "type": "String",
         "allowedValues": [
            true,
            false
         ]
      }
   },
   "mainSteps": [
      {
         "action": "aws:runShellScript",
         "name": "InstallAwsCLI",
         "precondition": {
            "StringEquals": [
               "{{ action }}",
               "Install"
            ]
         },
         "inputs": {
            "runCommand": [
               "sudo apt install aws-cli"
            ]
         }
      },
      {
         "action": "aws:runShellScript",
         "name": "UninstallAwsCLI",
         "precondition": {
            "StringEquals": [
               "{{ action }} {{ confirmed }}",
               "Uninstall True"
            ]
         },
         "inputs": {
            "runCommand": [
               "sudo apt remove aws-cli"
            ]
         }
      }
   ]
}
```

------

**2.2 版架构插值示例（3.3.2746.0 之前的 SSM Agent 版本）**  
在 3.3.2746.0 之前的 SSM Agent 版本中，代理会忽略 `interpolationType` 参数，转而执行原始字符串的替换。若要显式引用 `SSM_parameter-name`，则必须明确设置此项。以下 Linux 示例显式引用了环境变量 `SSM_Message`。

```
{
    "schemaVersion": "2.2",
    "description": "An example document",
    "parameters": {
        "Message": {
            "type": "String",
            "description": "Message to be printed",
            "default": "Hello",
            "interpolationType" : "ENV_VAR",
	     "allowedPattern: "^[^"]*$"

        }
    },
    "mainSteps": [{
        "action": "aws:runShellScript",
        "name": "printMessage",
        "inputs": {
            "runCommand": [
              "if [ -z "${SSM_Message+x}" ]; then",
              "    export SSM_Message=\"{{Message}}\"",
              "fi",
              "",
              "echo $SSM_Message"
            ]
        }
    }
}
```

**注意**  
如果 SSM 文档未使用以下双大括号，则 `allowedPattern` 在技术上是不必要的：`{{ }}`

**2.2 版架构 State Manager 示例**  
您可以将以下 SSM 文档用于State Manager（Systems Manager 中的一项工具）来下载并安装 ClamAV 防病毒软件。State Manager会强制实施特定配置，这意味着每次运行State Manager关联时，系统都会检查是否安装了 ClamAV 软件。如果未安装，State Manager 会重新运行本文档。

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: State Manager Bootstrap Example
parameters: {}
mainSteps:
- action: aws:runShellScript
  name: configureServer
  inputs:
    runCommand:
    - sudo yum install -y httpd24
    - sudo yum --enablerepo=epel install -y clamav
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "State Manager Bootstrap Example",
   "parameters": {},
   "mainSteps": [
      {
         "action": "aws:runShellScript",
         "name": "configureServer",
         "inputs": {
            "runCommand": [
               "sudo yum install -y httpd24",
               "sudo yum --enablerepo=epel install -y clamav"
            ]
         }
      }
   ]
}
```

------

**2.2 版架构清单示例**  
您可以将以下 SSM 文档用于 State Manager,以收集关于实例的清单元数据。

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: Software Inventory Policy Document.
parameters:
  applications:
    type: String
    default: Enabled
    description: "(Optional) Collect data for installed applications."
    allowedValues:
    - Enabled
    - Disabled
  awsComponents:
    type: String
    default: Enabled
    description: "(Optional) Collect data for AWS Components like amazon-ssm-agent."
    allowedValues:
    - Enabled
    - Disabled
  networkConfig:
    type: String
    default: Enabled
    description: "(Optional) Collect data for Network configurations."
    allowedValues:
    - Enabled
    - Disabled
  windowsUpdates:
    type: String
    default: Enabled
    description: "(Optional) Collect data for all Windows Updates."
    allowedValues:
    - Enabled
    - Disabled
  instanceDetailedInformation:
    type: String
    default: Enabled
    description: "(Optional) Collect additional information about the instance, including
      the CPU model, speed, and the number of cores, to name a few."
    allowedValues:
    - Enabled
    - Disabled
  customInventory:
    type: String
    default: Enabled
    description: "(Optional) Collect data for custom inventory."
    allowedValues:
    - Enabled
    - Disabled
mainSteps:
- action: aws:softwareInventory
  name: collectSoftwareInventoryItems
  inputs:
    applications: "{{ applications }}"
    awsComponents: "{{ awsComponents }}"
    networkConfig: "{{ networkConfig }}"
    windowsUpdates: "{{ windowsUpdates }}"
    instanceDetailedInformation: "{{ instanceDetailedInformation }}"
    customInventory: "{{ customInventory }}"
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "Software Inventory Policy Document.",
   "parameters": {
      "applications": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect data for installed applications.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      },
      "awsComponents": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect data for AWS Components like amazon-ssm-agent.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      },
      "networkConfig": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect data for Network configurations.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      },
      "windowsUpdates": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect data for all Windows Updates.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      },
      "instanceDetailedInformation": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect additional information about the instance, including\nthe CPU model, speed, and the number of cores, to name a few.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      },
      "customInventory": {
         "type": "String",
         "default": "Enabled",
         "description": "(Optional) Collect data for custom inventory.",
         "allowedValues": [
            "Enabled",
            "Disabled"
         ]
      }
   },
   "mainSteps": [
      {
         "action": "aws:softwareInventory",
         "name": "collectSoftwareInventoryItems",
         "inputs": {
            "applications": "{{ applications }}",
            "awsComponents": "{{ awsComponents }}",
            "networkConfig": "{{ networkConfig }}",
            "windowsUpdates": "{{ windowsUpdates }}",
            "instanceDetailedInformation": "{{ instanceDetailedInformation }}",
            "customInventory": "{{ customInventory }}"
         }
      }
   ]
}
```

------

**2.2 版架构 `AWS-ConfigureAWSPackage` 示例**  
以下示例显示 `AWS-ConfigureAWSPackage` 文档。这些区域有：`mainSteps`部分包括`aws:configurePackage`插件`action`步骤。

**注意**  
在 Linux 操作系统上，仅支持 `AmazonCloudWatchAgent` 和 `AWSSupport-EC2Rescue` 软件包。

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: 'Install or uninstall the latest version or specified version of an AWS
  package. Available packages include the following: AWSPVDriver, AwsEnaNetworkDriver,
  AwsVssComponents, and AmazonCloudWatchAgent, and AWSSupport-EC2Rescue.'
parameters:
  action:
    description: "(Required) Specify whether or not to install or uninstall the package."
    type: String
    allowedValues:
    - Install
    - Uninstall
  name:
    description: "(Required) The package to install/uninstall."
    type: String
    allowedPattern: "^arn:[a-z0-9][-.a-z0-9]{0,62}:[a-z0-9][-.a-z0-9]{0,62}:([a-z0-9][-.a-z0-9]{0,62})?:([a-z0-9][-.a-z0-9]{0,62})?:package\\/[a-zA-Z][a-zA-Z0-9\\-_]{0,39}$|^[a-zA-Z][a-zA-Z0-9\\-_]{0,39}$"
  version:
    type: String
    description: "(Optional) A specific version of the package to install or uninstall."
mainSteps:
- action: aws:configurePackage
  name: configurePackage
  inputs:
    name: "{{ name }}"
    action: "{{ action }}"
    version: "{{ version }}"
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "Install or uninstall the latest version or specified version of an AWS package. Available packages include the following: AWSPVDriver, AwsEnaNetworkDriver, AwsVssComponents, and AmazonCloudWatchAgent, and AWSSupport-EC2Rescue.",
   "parameters": {
      "action": {
         "description":"(Required) Specify whether or not to install or uninstall the package.",
         "type":"String",
         "allowedValues":[
            "Install",
            "Uninstall"
         ]
      },
      "name": {
         "description": "(Required) The package to install/uninstall.",
         "type": "String",
         "allowedPattern": "^arn:[a-z0-9][-.a-z0-9]{0,62}:[a-z0-9][-.a-z0-9]{0,62}:([a-z0-9][-.a-z0-9]{0,62})?:([a-z0-9][-.a-z0-9]{0,62})?:package\\/[a-zA-Z][a-zA-Z0-9\\-_]{0,39}$|^[a-zA-Z][a-zA-Z0-9\\-_]{0,39}$"
      },
      "version": {
         "type": "String",
         "description": "(Optional) A specific version of the package to install or uninstall."
      }
   },
   "mainSteps":[
      {
         "action": "aws:configurePackage",
         "name": "configurePackage",
         "inputs": {
            "name": "{{ name }}",
            "action": "{{ action }}",
            "version": "{{ version }}"
         }
      }
   ]
}
```

------

## 架构版本 1.2
<a name="documents-schema-onex"></a>

以下示例显示 1.2 版架构文档的顶级元素。

```
{
   "schemaVersion":"1.2",
   "description":"A description of the SSM document.",
   "parameters":{
      "parameter 1":{
         "one or more parameter properties"
      },
      "parameter 2":{
         "one or more parameter properties"
      },
      "parameter 3":{
         "one or more parameter properties"
      }
   },
   "runtimeConfig":{
      "plugin 1":{
         "properties":[
            {
               "one or more plugin properties"
            }
         ]
      }
   }
}
```

**1.2 版架构 `aws:runShellScript` 示例**  
以下示例显示 `AWS-RunShellScript` SSM 文档。**runtimeConfig** 部分包含 `aws:runShellScript` 插件。

```
{
    "schemaVersion":"1.2",
    "description":"Run a shell script or specify the commands to run.",
    "parameters":{
        "commands":{
            "type":"StringList",
            "description":"(Required) Specify a shell script or a command to run.",
            "minItems":1,
            "displayType":"textarea"
        },
        "workingDirectory":{
            "type":"String",
            "default":"",
            "description":"(Optional) The path to the working directory on your instance.",
            "maxChars":4096
        },
        "executionTimeout":{
            "type":"String",
            "default":"3600",
            "description":"(Optional) The time in seconds for a command to complete before it is considered to have failed. Default is 3600 (1 hour). Maximum is 172800 (48 hours).",
            "allowedPattern":"([1-9][0-9]{0,3})|(1[0-9]{1,4})|(2[0-7][0-9]{1,3})|(28[0-7][0-9]{1,2})|(28800)"
        }
    },
    "runtimeConfig":{
        "aws:runShellScript":{
            "properties":[
                {
                    "id":"0.aws:runShellScript",
                    "runCommand":"{{ commands }}",
                    "workingDirectory":"{{ workingDirectory }}",
                    "timeoutSeconds":"{{ executionTimeout }}"
                }
            ]
        }
    }
}
```

## 架构版本 0.3
<a name="automation-doc-syntax-examples"></a>

**顶级元素**  
以下示例显示 JSON 格式的架构 0.3 版自动化运行手册的顶级元素。

```
{
    "description": "document-description",
    "schemaVersion": "0.3",
    "assumeRole": "{{assumeRole}}",
    "parameters": {
        "parameter1": {
            "type": "String",
            "description": "parameter-1-description",
            "default": ""
        },
        "parameter2": {
            "type": "String",
            "description": "parameter-2-description",
            "default": ""
        }
    },
    "variables": {
        "variable1": {
            "type": "StringMap",
            "description": "variable-1-description",
            "default": {}
        },
        "variable2": {
            "type": "String",
            "description": "variable-2-description",
            "default": "default-value"
        }
    },
    "mainSteps": [
        {
            "name": "myStepName",
            "action": "action-name",
            "maxAttempts": 1,
            "inputs": {
                "Handler": "python-only-handler-name",
                "Runtime": "runtime-name",
                "Attachment": "script-or-zip-name"
            },
            "outputs": {
                "Name": "output-name",
                "Selector": "selector.value",
                "Type": "data-type"
            }
        }
    ],
    "files": {
        "script-or-zip-name": {
            "checksums": {
                "sha256": "checksum"
            },
            "size": 1234
        }
    }
}
```

**YAML 自动化运行手册示例**  
以下示例显示了 YAML 格式的自动化运行手册的内容。0.3 版文档架构的此工作示例还演示了如何使用 Markdown 格式化文档描述。

```
description: >-
  ##Title: LaunchInstanceAndCheckState

  -----

  **Purpose**: This Automation runbook first launches an EC2 instance
  using the AMI ID provided in the parameter ```imageId```. The second step of
  this document continuously checks the instance status check value for the
  launched instance until the status ```ok``` is returned.


  ##Parameters:

  -----

  Name | Type | Description | Default Value

  ------------- | ------------- | ------------- | -------------

  assumeRole | String | (Optional) The ARN of the role that allows Automation to
  perform the actions on your behalf. | -

  imageId  | String | (Optional) The AMI ID to use for launching the instance.
  The default value uses the latest Amazon Linux AMI ID available. | {{
  ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64 }}
schemaVersion: '0.3'
assumeRole: 'arn:aws:iam::111122223333::role/AutomationServiceRole'
parameters:
  imageId:
    type: String
    default: '{{ ssm:/aws/service/ami-amazon-linux-latest/al2023-ami-kernel-6.1-x86_64 }}'
    description: >-
      (Optional) The AMI ID to use for launching the instance. The default value
      uses the latest released Amazon Linux AMI ID.
  tagValue:
    type: String
    default: ' LaunchedBySsmAutomation'
    description: >-
      (Optional) The tag value to add to the instance. The default value is
      LaunchedBySsmAutomation.
  instanceType:
    type: String
    default: t2.micro
    description: >-
      (Optional) The instance type to use for the instance. The default value is
      t2.micro.
mainSteps:
  - name: LaunchEc2Instance
    action: 'aws:executeScript'
    outputs:
      - Name: payload
        Selector: $.Payload
        Type: StringMap
    inputs:
      Runtime: python3.11
      Handler: launch_instance
      Script: ''
      InputPayload:
        image_id: '{{ imageId }}'
        tag_value: '{{ tagValue }}'
        instance_type: '{{ instanceType }}'
      Attachment: launch.py
    description: >-
      **About This Step**


      This step first launches an EC2 instance using the ```aws:executeScript```
      action and the provided python script.
  - name: WaitForInstanceStatusOk
    action: 'aws:executeScript'
    inputs:
      Runtime: python3.11
      Handler: poll_instance
      Script: |-
        def poll_instance(events, context):
          import boto3
          import time

          ec2 = boto3.client('ec2')

          instance_id = events['InstanceId']

          print('[INFO] Waiting for instance status check to report ok', instance_id)

          instance_status = "null"

          while True:
            res = ec2.describe_instance_status(InstanceIds=[instance_id])

            if len(res['InstanceStatuses']) == 0:
              print("Instance status information is not available yet")
              time.sleep(5)
              continue

            instance_status = res['InstanceStatuses'][0]['InstanceStatus']['Status']

            print('[INFO] Polling to get status of the instance', instance_status)

            if instance_status == 'ok':
              break

            time.sleep(10)

          return {'Status': instance_status, 'InstanceId': instance_id}
      InputPayload: '{{ LaunchEc2Instance.payload }}'
    description: >-
      **About This Step**


      The python script continuously polls the instance status check value for
      the instance launched in Step 1 until the ```ok``` status is returned.
files:
  launch.py:
    checksums:
      sha256: 18871b1311b295c43d0f...[truncated]...772da97b67e99d84d342ef4aEXAMPLE
```

## 安全处理参数示例
<a name="secure-parameter-examples"></a>

以下示例演示使用环境变量 `interpolationType` 安全处理参数。

### 基本安全命令执行
<a name="basic-secure-command"></a>

本示例说明如何安全处理命令参数：

**注意**  
在不使用以下双大括号的 SSM 文档中，`allowedPattern` 在技术上是不必要的：`{{ }}`

------
#### [ YAML ]

```
---

schemaVersion: '2.2'
description: An example document.
parameters:
  Message:
    type: String
    description: "Message to be printed"
    default: Hello
    interpolationType: ENV_VAR
    allowedPattern: "^[^"]*$"
mainSteps:
  - action: aws:runShellScript
    name: printMessage
    precondition:
      StringEquals:
        - platformType
        - Linux
    inputs:
      runCommand:
        - echo {{Message}}
```

------
#### [ JSON ]

```
{
    "schemaVersion": "2.2",
    "description": "An example document.",
    "parameters": {
        "Message": {
            "type": "String",
            "description": "Message to be printed",
            "default": "Hello",
            "interpolationType": "ENV_VAR",
            "allowedPattern": "^[^"]*$"
        }
    },
    "mainSteps": [{
        "action": "aws:runShellScript",
        "name": "printMessage",
        "precondition": {
           "StringEquals": ["platformType", "Linux"]
        },
        "inputs": {
            "runCommand": [
              "echo {{Message}}"
            ]
        }
    }]
}
```

------

### 在解释性语言中使用参数
<a name="interpreted-language-example"></a>

本示例演示在 Python 中安全处理参数：

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: 'Secure Python script execution'
parameters:
  inputData:
    type: String
    description: 'Input data for processing'
    interpolationType: 'ENV_VAR'
mainSteps:
  - action: aws:runPowerShellScript
    name: runPython
    inputs:
      runCommand:
        - |
          python3 -c '
          import os
          import json
          
          # Safely access parameter through environment variable
          input_data = os.environ.get("SSM_inputData", "")
          
          # Process the data
          try:
              processed_data = json.loads(input_data)
              print(f"Successfully processed: {processed_data}")
          except json.JSONDecodeError:
              print("Invalid JSON input")
          '
```

------

### 向后兼容性示例
<a name="backwards-compatibility-example"></a>

本示例展示如何安全处理参数，同时保持向后兼容性：

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: 'Backwards compatible secure parameter handling'
parameters:
  userInput:
    type: String
    description: 'User input to process'
    interpolationType: 'ENV_VAR'
    allowedPattern: '^[^"]*$'

mainSteps:
  - action: aws:runShellScript
    name: processInput
    inputs:
      runCommand:
        - |
          # Handle both modern and legacy agent versions
          if [ -z "${SSM_userInput+x}" ]; then
              # Legacy agent - fall back to direct parameter reference
              export SSM_userInput="{{userInput}}"
          fi
          
          # Process the input securely
          echo "Processing input: $SSM_userInput"
```

------

**注意**  
在不使用以下双大括号的 SSM 文档中，`allowedPattern` 在技术上是不必要的：`{{ }}`

## 参数安全的最佳实践
<a name="parameter-security-best-practices"></a>

在处理 SSM 文档中的参数时，请遵循以下最佳实践：
+ **使用环境变量插值**：即将用于命令执行的字符串参数始终使用 `interpolationType: "ENV_VAR"`。
+ **实现输入验证**：使用 `allowedPattern` 将参数值限制为安全模式。
+ **处理遗留系统**：为不支持环境变量插值的旧版 SSM Agent 添加回退逻辑。
+ **转义特殊字符**：在命令中使用参数值时，请对特殊字符进行恰当转义以防止被 shell 解释。
+ **限制参数范围**：为用例使用尽可能严格的参数模式。

# 数据元素和参数
<a name="documents-syntax-data-elements-parameters"></a>

本主题介绍 SSM 文档中使用的数据元素。用于创建文档的架构版本定义了文档接受的语法和数据元素。我们建议您对命令文档使用架构版本 2.2 或更高版本。自动化运行手册使用架构版本 0.3。此外，自动化运行手册还支持使用 Markdown（一种标记语言），它允许您为文档和文档中的各个步骤添加 Wiki 样式的描述。有关使用 Markdown 的详细信息，请参阅*《AWS 管理控制台 入门指南》*中的[在控制台中使用 Markdown](https://docs.aws.amazon.com/general/latest/gr/aws-markdown.html)。

以下部分介绍了 SSM 文档中可以包含的数据元素。

## 顶级数据元素
<a name="top-level"></a>

**schemaVersion**  
要使用的架构版本。  
类型：版本  
是否必需：是

**描述**  
您提供的描述文档目的的信息。您还可以使用此字段来指定参数是否需要一个值才能运行文档，或者为参数提供值是否为可选项。可在本主题的所有示例中查看必需参数和可选参数。  
类型：字符串  
必需：否

**参数**  
定义文档接受的参数的结构。  
为增强处理字符串参数的安全性，可通过指定 `interpolationType` 属性来使用环境变量插值。设置为 `ENV_VAR` 时，系统会创建一个包含参数值的环境变量 `SSM_parameter-name`。  
下面是一个使用环境变量 `interpolationType` 的参数的示例：  

```
{
    "schemaVersion": "2.2",
    "description": "An example document.",
    "parameters": {
        "Message": {
            "type": "String",
            "description": "Message to be printed",
            "default": "Hello",
            "interpolationType" : "ENV_VAR",
            "allowedPattern": "^[^"]*$"

        }
    },
    "mainSteps": [{
        "action": "aws:runShellScript",
        "name": "printMessage",
        "precondition" : {
           "StringEquals" : ["platformType", "Linux"]
        },
        "inputs": {
            "runCommand": [
              "echo {{Message}}"
            ]
        }
    }
}
```
在不使用以下双大括号的 SSM 文档中，`allowedPattern` 在技术上是不必要的：`{{ }}`
对于经常使用的参数，建议将这些参数存储在 Parameter Store（AWS Systems Manager 中的一项工具）中。然后，可以在文档中定义参数，并引用 Parameter Store 参数作为默认值。要引用 Parameter Store 参数，请使用以下语法。  

```
{{ssm:parameter-name}}
```
可以使用参数通过与任何其他文档参数相同的方式引用 Parameter Store 参数。在以下示例中，`commands` 参数的默认值是 Parameter Store 参数 `myShellCommands`。如果将 `commands` 参数指定为 `runCommand` 字符串，文档将运行存储在 `myShellCommands` 参数中的命令。  

```
---
schemaVersion: '2.2'
description: runShellScript with command strings stored as Parameter Store parameter
parameters:
  commands:
    type: StringList
    description: "(Required) The commands to run on the instance."
    default: ["{{ ssm:myShellCommands }}"],
            interpolationType : 'ENV_VAR'
            allowedPattern: '^[^"]*$'

mainSteps:
- action: aws:runShellScript
  name: runShellScriptDefaultParams
  inputs:
    runCommand:"{{ commands }}"
```

```
{
    "schemaVersion": "2.2",
    "description": "runShellScript with command strings stored as Parameter Store parameter",
    "parameters": {
      "commands": {
        "type": "StringList",
        "description": "(Required) The commands to run on the instance.",
        "default": ["{{ ssm:myShellCommands }}"],
        "interpolationType" : "ENV_VAR"
      }
    },
    "mainSteps": [
      {
        "action": "aws:runShellScript",
        "name": "runShellScriptDefaultParams",
        "inputs": {
            "runCommand": [
              "{{ commands }}"
          ]
        }
      }
    ]
  }
```
您可以在文档的 `parameters` 部分引用 `String` 和 `StringList` Parameter Store 参数。您不能引用 `SecureString` Parameter Store 参数。
有关 Parameter Store 的更多信息，请参阅 [AWS Systems Manager Parameter Store](systems-manager-parameter-store.md)。  
类型：结构  
`parameters` 结构接受以下字段和值：  
+ `type`：(必需) 允许的值包括：`String`、`StringList`、`Integer`、`Boolean`、`MapList` 和 `StringMap`。要查看每种类型的示例，请参阅下一节中的 [文档参数 `type` 示例](#top-level-properties-type)。
**注意**  
命令类型文档仅支持 `String` 和 `StringList` 参数类型。
+ `description`：(可选) 关于参数的描述。
+ `default`：（可选）参数的默认值或对 Parameter Store 中参数的引用。
+ `allowedValues`：（可选）参数允许的值数组。定义参数的允许值将验证用户输入。如果用户输入了不允许的值，则执行将无法启动。

------
#### [ YAML ]

  ```
  DirectoryType:
    type: String
    description: "(Required) The directory type to launch."
    default: AwsMad
    allowedValues:
    - AdConnector
    - AwsMad
    - SimpleAd
  ```

------
#### [ JSON ]

  ```
  "DirectoryType": {
    "type": "String",
    "description": "(Required) The directory type to launch.",
    "default": "AwsMad",
    "allowedValues": [
      "AdConnector",
      "AwsMad",
      "SimpleAd"
    ]
  }
  ```

------
+ `allowedPattern`：（可选）验证用户输入是否与参数的定义模式匹配的正则表达式。如果用户输入与允许的模式不匹配，则执行无法启动。
**注意**  
Systems Manager 会执行两次 `allowedPattern` 验证。第一次验证是在您使用文档时利用 [Java 正则表达式库](https://docs.oracle.com/javase/8/docs/api/java/util/regex/package-summary.html)在 API 级别进行。第二次验证是在处理文档之前通过使用 [GO 正则表达式库](https://pkg.go.dev/regexp)在 SSM Agent 上进行。

------
#### [ YAML ]

  ```
  InstanceId:
    type: String
    description: "(Required) The instance ID to target."
    allowedPattern: "^i-(?:[a-f0-9]{8}|[a-f0-9]{17})$"
    default: ''
  ```

------
#### [ JSON ]

  ```
  "InstanceId": {
    "type": "String",
    "description": "(Required) The instance ID to target.",
    "allowedPattern": "^i-(?:[a-f0-9]{8}|[a-f0-9]{17})$",
    "default": ""
  }
  ```

------
+ `displayType`：（可选）用于在 AWS 管理控制台 中显示 `textfield` 或 `textarea`。`textfield` 是单行文本框。`textarea` 是多行文本区域。
+ `minItems`：(可选) 允许的最小项目数。
+ `maxItems`：(可选) 允许的最大项目数。
+ `minChars`：(可选) 允许的最小参数字符数。
+ `maxChars`：(可选) 允许的最大参数字符数。
+ `interpolationType`：（可选）定义在执行命令之前如何处理参数值。如果设置为 `ENV_VAR`，则可以将参数值用作名为 `SSM_parameter-name` 的环境变量。此功能通过将参数值视为文字字符串，从而帮助防范命令注入攻击。

  类型：字符串

  有效值：`ENV_VAR`
必需：否

**变量**  
（仅限架构版本 0.3）您可以在自动化运行手册的整个步骤中引用或更新的值。变量与参数类似，但在重要方面有所区别。参数值在运行手册的上下文中是静态的，但是变量的值可以在运行手册的上下文中更改。更新变量的值时，数据类型必须与定义的数据类型相匹配。有关更新自动化中的变量值的信息，请参阅 [`aws:updateVariable` – 更新运行手册变量的值](automation-action-update-variable.md)  
类型：Boolean \$1 Integer \$1 MapList \$1 String \$1 StringList \$1 StringMap  
必需：否  

```
variables:
    payload:
        type: StringMap
        default: "{}"
```

```
{
    "variables": [
        "payload": {
            "type": "StringMap",
            "default": "{}"
        }
    ]
}
```

**runtimeConfig**  
(仅限 1.2 版架构) 由一个或多个 Systems Manager 插件应用的实例的配置。不保证插件按顺序运行。  
类型：Dictionary<string,PluginConfiguration>  
必需：否

**mainSteps**  
（仅架构版本 0.3、2.0 和 2.2）可以包含多个步骤（插件）的对象。插件在步骤内定义。步骤按文档中列出的先后顺序运行。  
类型：Dictionary<string,PluginConfiguration>  
是否必需：是

**输出**  
（仅架构版本 0.3）通过执行本文档而生成的可用于其他进程的数据。例如，如果文档创建新的 AMI，您可以指定 “CreateImage.ImageId” 作为输出值，然后使用该输出以在后续自动化执行中创建新的实例。有关输出的更多信息，请参阅 [使用操作输出作为输入](automation-action-outputs-inputs.md)。  
类型：Dictionary<string,OutputConfiguration>  
必需：否

**文件**  
（仅架构版本 0.3）附加到文档并在自动化执行期间运行的脚本文件（及其校验和）。仅适用于包含 `aws:executeScript` 操作且已在一个或多个步骤中指定附件的文档。  
要了解自动化运行手册支持的运行时，请参阅 [`aws:executeScript` - 运行脚本](automation-action-executeScript.md)。有关在自动化运行手册中包含脚本的更多信息，请参阅 [在运行手册中使用脚本](automation-document-script-considerations.md) 和 [自动化运行手册的视觉对象设计体验](automation-visual-designer.md)。  
使用附件创建自动化运行手册时，可以使用 `--attachments` 选项（对于 AWS CLI）或 `Attachments`（对于 API 和开发工具包）指定附件文件。您可以为存储在 Amazon Simple Storage Service（Amazon S3）存储桶中的 SSM 文档和文件指定文件位置。有关更多信息，请参阅 AWS Systems Manager API 参考中的[附件](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreateDocument.html#systemsmanager-CreateDocument-request-Attachments)。  

```
---
files:
  launch.py:
    checksums:
      sha256: 18871b1311b295c43d0f...[truncated]...772da97b67e99d84d342ef4aEXAMPLE
```

```
"files": {
    "launch.py": {
        "checksums": {
            "sha256": "18871b1311b295c43d0f...[truncated]...772da97b67e99d84d342ef4aEXAMPLE"
        }
    }
}
```
类型：Dictionary<string,FilesConfiguration>  
必需：否

## 文档参数 `type` 示例
<a name="top-level-properties-type"></a>

SSM 文档中的参数类型是静态的。这意味着参数类型在定义后无法更改。将参数用于 SSM 文档插件时，不能在插件的输入中动态更改参数的类型。例如，您不能在 `aws:runShellScript` 插件的 `runCommand` 输入中引用 `Integer` 参数，因为此输入接受字符串或字符串列表。要将参数用于插件输入，参数类型必须与接受的类型匹配。例如，您必须为`aws:updateSsmAgent` 插件的 `allowDowngrade` 输入指定 `Boolean` 类型参数。如果参数类型与插件的输入类型不匹配，则 SSM 文档无法验证，并且系统不会创建文档。在其他插件或 AWS Systems Manager 自动化操作的输入中使用下游参数时也是如此。例如，您不能引用 `aws:runDocument` 插件的 `documentParameters` 输入内的 `StringList` 参数。`documentParameters` 输入接受字符串映射，即使下游 SSM 文档参数类型是 `StringList` 参数并与您要引用的参数匹配。

将参数用于自动化操作时，大多数情况下创建 SSM 文档时不会验证参数类型。只有在使用 `aws:runCommand` 操作的情况下，才会在创建 SSM 文档时验证参数类型。在所有其他情况下，在运行操作之前验证该操作的输入时，会在自动化执行期间进行参数验证。例如，如果输入参数为 `String` 并将其引用为 `aws:runInstances` 操作 `MaxInstanceCount` 输入的值，则会创建 SSM 文档。但是，在运行该文档期间，验证 `aws:runInstances` 操作时自动化将失败，因为 `MaxInstanceCount` 输入需要 `Integer`。

下面是每个参数的示例 `type`。

字符串  
使用引号括起来的零个或多个 Unicode 字符序列。例如，"i-1234567890abcdef0"。使用反斜杠转义。  
字符串参数可包括一个值为 `ENV_VAR` 的可选 `interpolationType` 字段，以启用环境变量插值增强安全性。  

```
---
InstanceId:
  type: String
  description: "(Optional) The target EC2 instance ID."
  interpolationType: ENV_VAR
```

```
"InstanceId":{
  "type":"String",
  "description":"(Optional) The target EC2 instance ID.",
  "interpolationType": "ENV_VAR"
}
```

StringList  
以逗号分隔的字符串项目列表。例如，["cd \$1", "pwd"]。  

```
---
commands:
  type: StringList
  description: "(Required) Specify a shell script or a command to run."
  default: ""
  minItems: 1
  displayType: textarea
```

```
"commands":{
  "type":"StringList",
  "description":"(Required) Specify a shell script or a command to run.",
  "minItems":1,
  "displayType":"textarea"
}
```

布尔值  
仅接受 `true` 或 `false`。不接受 "true" 或 0。  

```
---
canRun:
  type: Boolean
  description: ''
  default: true
```

```
"canRun": {
  "type": "Boolean",
  "description": "",
  "default": true
}
```

整数  
整数。不接受小数（例如 3.14159）或使用引号的数字（例如 "3"）。  

```
---
timeout:
  type: Integer
  description: The type of action to perform.
  default: 100
```

```
"timeout": {
  "type": "Integer",
  "description": "The type of action to perform.",
  "default": 100    
}
```

StringMap  
键到值的映射。密钥和值必须是字符串。例如，\$1"Env": "Prod"\$1。  

```
---
notificationConfig:
  type: StringMap
  description: The configuration for events to be notified about
  default:
    NotificationType: 'Command'
    NotificationEvents:
    - 'Failed'
    NotificationArn: "$dependency.topicArn"
  maxChars: 150
```

```
"notificationConfig" : {
  "type" : "StringMap",
  "description" : "The configuration for events to be notified about",
  "default" : {
    "NotificationType" : "Command",
    "NotificationEvents" : ["Failed"],
    "NotificationArn" : "$dependency.topicArn"
  },
  "maxChars" : 150
}
```

MapList  
StringMap 对象的列表。  

```
blockDeviceMappings:
  type: MapList
  description: The mappings for the create image inputs
  default:
  - DeviceName: "/dev/sda1"
    Ebs:
      VolumeSize: "50"
  - DeviceName: "/dev/sdm"
    Ebs:
      VolumeSize: "100"
  maxItems: 2
```

```
"blockDeviceMappings":{
  "type":"MapList",
  "description":"The mappings for the create image inputs",
  "default":[
    {
      "DeviceName":"/dev/sda1",
      "Ebs":{
        "VolumeSize":"50"
      }
    },
    {
      "DeviceName":"/dev/sdm",
      "Ebs":{
        "VolumeSize":"100"
      }
    }
  ],
  "maxItems":2
}
```

## 查看 SSM 命令文档内容
<a name="viewing-ssm-document-content"></a>

要预览需要的和可选参数 AWS Systems Manager(SSM) 命令文档，除了文档运行的操作外，您还可以在 Systems Manager 控制台中查看此文档的内容。

**查看 SSM 命令文档内容**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在搜索框中，选择**文档类型**，然后选择**命令**。

1. 选择文档的名称，然后选择**内容**选项卡。

1. 在内容字段中，查看文档的可用参数和操作步骤。

   例如，下图显示 (1) `version` 和 (2) `allowDowngrade` 是 `AWS-UpdateSSMAgent` 文档的可选参数，并且文档运行的第一个操作是 (3) `aws:updateSsmAgent`。  
![\[在 Systems Manager 控制台中查看 SSM 文档内容\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/view-document-content.png)

# 命令文档插件参考
<a name="documents-command-ssm-plugin-reference"></a>

此参考介绍可在 AWS Systems Manager (SSM) 命令类型文档中指定的插件。这些插件不能在使自动化操作的 SSM 自动化运行手册中使用。有关 AWS Systems Manager 自动化操作的信息，请参阅 [Systems Manager 自动化操作参考](automation-actions.md)。

Systems Manager 通过读取 SSM 文档的内容确定在托管实例上执行的操作。每个文档都包含代码执行部分。根据文档的架构版本，此代码执行部分可能包含一个或多个插件或步骤。为了便于理解本帮助主题，我们将这些插件和步骤都称为*插件*。本部分包含有关每个 Systems Manager 插件的信息。有关文档的详细信息（包括有关创建文档和架构版本之间的差异的信息），请参阅 [AWS Systems Manager 文档](documents.md)。

对于接受字符串参数（例如 `aws:runShellScript` 和 `aws:runPowerShellScript`）的插件，可以使用 `interpolationType` 参数增强安全性，方法是将参数输入视为字符串文本值，而非可能的可执行命令。例如：

```
{
    "schemaVersion": "2.2",
    "description": "runShellScript with command strings stored as Parameter Store parameter",
    "parameters": {
      "commands": {
        "type": "StringList",
        "description": "(Required) The commands to run on the instance.",
        "default": ["{{ ssm:myShellCommands }}"],
        "interpolationType" : "ENV_VAR"
      }
    },
    //truncated
 }
```

**注意**  
此处介绍的部分插件仅在 Windows Server 实例或 Linux 实例上运行。每个插件都记录了平台依赖关系。  
macOS 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例支持以下文档插件：  
`aws:refreshAssociation`
`aws:runShellScript`
`aws:runPowerShellScript`
`aws:softwareInventory`
`aws:updateSsmAgent`

**Topics**
+ [共享输入](#shared-inputs)
+ [`aws:applications`](#aws-applications)
+ [`aws:cloudWatch`](#aws-cloudWatch)
+ [`aws:configureDocker`](#aws-configuredocker)
+ [`aws:configurePackage`](#aws-configurepackage)
+ [`aws:domainJoin`](#aws-domainJoin)
+ [`aws:downloadContent`](#aws-downloadContent)
+ [`aws:psModule`](#aws-psModule)
+ [`aws:refreshAssociation`](#aws-refreshassociation)
+ [`aws:runDockerAction`](#aws-rundockeraction)
+ [`aws:runDocument`](#aws-rundocument)
+ [`aws:runPowerShellScript`](#aws-runPowerShellScript)
+ [`aws:runShellScript`](#aws-runShellScript)
+ [`aws:softwareInventory`](#aws-softwareinventory)
+ [`aws:updateAgent`](#aws-updateagent)
+ [`aws:updateSsmAgent`](#aws-updatessmagent)

## 共享输入
<a name="shared-inputs"></a>

仅在版本 3.0.502 和更高版本的 SSM Agent 中，所有插件都可以使用以下输入：

**最终步骤**  
您希望文档运行的最后一步。如果此输入是为某个步骤定义的，则它优先于 `onFailure` 或 `onSuccess` 输入中指定的 `exit` 值。为了使具有此输入的步骤按预期运行，该步骤必须是文档 `mainSteps` 中定义的最后一个步骤。  
类型：布尔值  
有效值：`true` \$1 `false`  
必需：否

**onFailure**  
如果您为插件指定此输入的 `exit` 值并且步骤失败，则步骤状态会显示失败，并且文档不会运行任何剩余步骤，除非 `finallyStep` 已定义。如果您为插件指定此输入的 `successAndExit` 值并且步骤失败，则步骤状态会显示成功，并且文档不会运行任何剩余的步骤，除非 `finallyStep` 已定义。  
类型：字符串  
有效值：`exit` \$1 `successAndExit`  
必需：否

**onSuccess**  
如果您为插件指定此输入并且步骤成功运行，则文档不会运行任何剩余的步骤，除非 `finallyStep` 已定义。  
类型：字符串  
有效值：`exit`  
必需：否

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: Shared inputs example
parameters:
  customDocumentParameter:
    type: String
    description: Example parameter for a custom Command-type document.
mainSteps:
- action: aws:runDocument
  name: runCustomConfiguration
  inputs:
    documentType: SSMDocument
    documentPath: "yourCustomDocument"
    documentParameters: '"documentParameter":{{customDocumentParameter}}'
    onSuccess: exit
- action: aws:runDocument
  name: ifConfigurationFailure
  inputs:
    documentType: SSMDocument
    documentPath: "yourCustomRepairDocument"
    onFailure: exit
- action: aws:runDocument
  name: finalConfiguration
  inputs:
    documentType: SSMDocument
    documentPath: "yourCustomFinalDocument"
    finallyStep: true
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "Shared inputs example",
   "parameters": {
      "customDocumentParameter": {
         "type": "String",
         "description": "Example parameter for a custom Command-type document."
      }
   },
   "mainSteps":[
      {
         "action": "aws:runDocument",
         "name": "runCustomConfiguration",
         "inputs": {
            "documentType": "SSMDocument",
            "documentPath": "yourCustomDocument",
            "documentParameters": "\"documentParameter\":{{customDocumentParameter}}",
            "onSuccess": "exit"
         }
      },
      {
         "action": "aws:runDocument",
         "name": "ifConfigurationFailure",
         "inputs": {
            "documentType": "SSMDocument",
            "documentPath": "yourCustomRepairDocument",
            "onFailure": "exit"
         }
      },
      {
         "action": "aws:runDocument",
         "name":"finalConfiguration",
         "inputs": {
            "documentType": "SSMDocument",
            "documentPath": "yourCustomFinalDocument",
            "finallyStep": true
         }
      }
   ]
}
```

------

## `aws:applications`
<a name="aws-applications"></a>

在 EC2 实例上安装、修复或卸载应用程序。此插件仅在 Windows Server 操作系统中运行。

### 语法
<a name="applications-syntax"></a>

#### Schema 2.2
<a name="applications-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:applications plugin
parameters:
  source:
    description: "(Required) Source of msi."
    type: String
mainSteps:
- action: aws:applications
  name: example
  inputs:
    action: Install
    source: "{{ source }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion":"2.2",
  "description":"aws:applications",
  "parameters":{
    "source":{
    "description":"(Required) Source of msi.",
    "type":"String"
    }
  },
  "mainSteps":[
    {
      "action":"aws:applications",
      "name":"example",
      "inputs":{
        "action":"Install",
        "source":"{{ source }}"
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="applications-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:applications:
    properties:
    - id: 0.aws:applications
      action: "{{ action }}"
      parameters: "{{ parameters }}"
      source: "{{ source }}"
      sourceHash: "{{ sourceHash }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:applications":{
         "properties":[
            {
               "id":"0.aws:applications",
               "action":"{{ action }}",
               "parameters":"{{ parameters }}",
               "source":"{{ source }}",
               "sourceHash":"{{ sourceHash }}"
            }
         ]
      }
   }
}
```

------

### 属性
<a name="applications-properties"></a>

**action**  
要执行的操作。  
类型：Enum  
有效值：`Install` \$1`Repair` \$1`Uninstall`  
是否必需：是

**参数**  
安装程序的参数。  
类型：字符串  
必需：否

**source**  
应用程序的 `.msi` 文件的 URL。  
类型：字符串  
是否必需：是

**sourceHash**  
`.msi` 文件的 SHA256 哈希值。  
类型：字符串  
必需：否

## `aws:cloudWatch`
<a name="aws-cloudWatch"></a>

从中导出数据 Windows Server 添加到 Amazon CloudWatch 视台或 Amazon CloudWatch Logs 中，并使用云监控指标监控数据。此插件仅在 Windows Server 操作系统中运行。要详细了解如何配置 CloudWatch 与 Amazon Elastic Compute Cloud（Amazon EC2）的集成，请参阅《Amazon CloudWatch 用户指南》**中的[使用 CloudWatch 代理收集指标、日志和跟踪信息](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)。

**重要**  
统一的 CloudWatch 代理已取代 SSM Agent，作为将日志数据发送到 Amazon CloudWatch Logs 的工具。不支持 SSM Agent aws:cloudWatch 插件。我们建议仅将统一的 CloudWatch 代理用于您的日志收集过程。有关更多信息，请参阅以下主题：  
[将节点日志发送到统一的 CloudWatch Logs（CloudWatch 代理）](monitoring-cloudwatch-agent.md)
[将 Windows Server 节点日志收集迁移到 CloudWatch 代理](monitoring-cloudwatch-agent.md#monitoring-cloudwatch-agent-migrate)
《Amazon CloudWatch 用户指南》**中的[使用 CloudWatch 代理收集指标、日志和跟踪信息](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/Install-CloudWatch-Agent.html)。

您可以导出和监视以下数据类型：

**ApplicationEventLog**  
将应用程序事件日志数据发送到 CloudWatch Logs。

**CustomLogs**  
将任何基于文本的日志文件发送到 Amazon CloudWatch Logs。CloudWatch 插件会为日志文件创建指纹。系统随后将数据偏移与每个指纹进行关联。该插件会在出现更改时上传文件，记录偏移，然后将该偏移与指纹关联。此方法用于避免出现这种情况：用户启用插件后，将服务与包含大量文件的目录关联，然后系统会上传所有文件。  
请注意，如果应用程序在轮询期间截断或尝试清除日志，为 `LogDirectoryPath` 指定的任何日志都可能丢失条目。例如，如果您要限制日志文件大小，请在达到此限制时创建新的日志文件，然后继续将数据写入新文件。

**ETW**  
将 Windows (ETW) 事件跟踪数据发送到 CloudWatch Logs。

**IIS**  
将 IIS 日志数据发送到 CloudWatch Logs

**PerformanceCounter**  
将 Windows 性能计数器发送到 CloudWatch。您可以选择不同类别作为指标上传到 CloudWatch。对于要上传的每个性能计数器，创建具有唯一 ID 的 **PerformanceCounter** 部分 (例如“PerformanceCounter2”、“PerformanceCounter3”等)，然后配置其属性。  
如果 AWS Systems Manager SSM Agent 或 CloudWatch 插件已停止，则性能计数器数据不再记录到 CloudWatch 中。此行为不同于自定义日志或 Windows 事件日志。自定义日志和 Windows 事件日志会保留性能计数器数据，并在 SSM Agent 后或 CloudWatch 插件可用时将其上传到 CloudWatch。

**SecurityEventLog**  
将安全日志数据发送到 CloudWatch Logs。

**SystemEventLog**  
将系统事件日志数据发送到 CloudWatch Logs。

可为数据定义以下目标：

**CloudWatch**  
发送性能计数器指标数据时所在的目标。可添加具有唯一 ID 的更多部分 (例如，“CloudWatch2”和“CloudWatch3”等)，并为每个新 ID 指定一个不同的区域，将相同数据发送到不同位置。

**CloudWatchLogs**  
发送日志数据时所在的目标。可添加具有唯一 ID 的更多部分 (例如，“CloudWatchLogs2”和“CloudWatchLogs3”等)，并为每个新 ID 指定一个不同的区域，将相同数据发送到不同位置。

### 语法
<a name="cloudWatch-syntax"></a>

```
"runtimeConfig":{
        "aws:cloudWatch":{
            "settings":{
                "startType":"{{ status }}"
            },
            "properties":"{{ properties }}"
        }
    }
```

### 设置和属性
<a name="cloudWatch-properties"></a>

**AccessKey**  
您的访问密钥 ID。如果未使用 IAM 角色启动实例，则必须指定此属性。此属性不能与 SSM 一起使用。  
类型：字符串  
必需：否

**CategoryName**  
性能监视器提供的性能计数器类别。  
类型：字符串  
是否必需：是

**CounterName**  
性能监视器提供的性能计数器名称。  
类型：字符串  
是否必需：是

**CultureName**  
记录时间戳的区域设置。如果 **CultureName** 为空，则它默认为您的 Windows Server 实例所使用的相同区域位置。  
类型：字符串  
有效值：有关支持的值的列表，请参阅 Microsoft 网站上的[国家语言支持 (NLS)](https://msdn.microsoft.com/en-us/library/cc233982.aspx)。不支持 **div**、**div-MV**、**hu** 和 **hu-HU** 值。  
必需：否

**DimensionName**  
Amazon CloudWatch 指标的维度。如果您要指定 `DimensionName`，则必须指定 `DimensionValue`。这些参数在列出指标时提供另一个视图。您可以对多个指标使用同一个维度，以便查看属于特定维度的所有指标。  
类型：字符串  
必需：否

**DimensionValue**  
Amazon CloudWatch 指标的维度值。  
类型：字符串  
必需：否

**编码**  
要使用的文件编码 (例如 UTF-8)。使用编码名称，而不是显示名称。  
类型：字符串  
有效值：有关支持的值的列表，请参阅 Microsoft Learn 库中的 [Encoding Class](https://learn.microsoft.com/en-us/dotnet/api/system.text.encoding?view=net-7.0)。  
是否必需：是

**筛选条件**  
日志名称的前缀。将此参数保留空白以监控所有文件。  
类型：字符串  
有效值：有关支持的值的列表，请参阅 MSDN 库中的 [FileSystemWatcherFilter 属性](http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.filter.aspx)主题。  
必需：否

**流**  
要上传的每个数据类型以及数据的目标（CloudWatch 或 CloudWatch Logs ）。例如，要将在 `"Id": "PerformanceCounter"` 下定义的性能计数器发送到在 `"Id": "CloudWatch"` 下定义的 CloudWatch 目标，请输入 **“PerformanceCounter,CloudWatch”**。同样，要将自定义日志、ETW 日志和系统日志发送到 `"Id": "ETW"` 下定义的 CloudWatch Logs 目标，请输入 **“(ETW),CloudWatchLogs”**。此外，还可以将相同性能计数器或日志文件发送到多个目标。例如，要将应用程序日志发送到在 `"Id": "CloudWatchLogs"` 和 `"Id": "CloudWatchLogs2"` 下定义的两个不同目标，请输入 **"ApplicationEventLog,(CloudWatchLogs, CloudWatchLogs2)"**。  
类型：字符串  
有效值 (源)：`ApplicationEventLog` \$1 `CustomLogs` \$1 `ETW` \$1 `PerformanceCounter` \$1 `SystemEventLog` \$1 `SecurityEventLog`   
有效值 (目标)：`CloudWatch` \$1 `CloudWatchLogs` \$1 `CloudWatch`*n* \$1 `CloudWatchLogs`*n*   
是否必需：是

**FullName**  
组件的完整名称。  
类型：字符串  
是否必需：是

**Id**  
标识数据源或目标。此标识符在配置文件中必须是唯一的。  
类型：字符串  
是否必需：是

**InstanceName**  
性能计数器实例的名称。请勿使用星号 (\$1) 标识所有实例，因为每个性能计数器组件仅支持一个指标。不过可以使用 **\$1Total**。  
类型：字符串  
是否必需：是

**级别**  
发送到 Amazon CloudWatch 的消息类型。  
类型：字符串  
有效值：  
+ **1** – 仅上传错误消息。
+ **2** – 仅上传警告消息。
+ **4** – 仅上传信息消息。
您可以将这些值加在一起以包含多种类型的消息。例如，**3** 表示将包含错误消息 (**1**) 和警告消息 (**2**)。值 **7** 表示将包含错误消息 (**1**)、警告消息 (**2**) 和说明性消息 (**4**)。  
是否必需：是  
应将 Windows 安全日志的级别设置为 7。

**LineCount**  
标识日志文件的标头中的行数。例如，IIS 日志文件拥有几乎相同的标头。您可以输入 **3**，系统会读取日志文件标头的前三行以进行识别。在 IIS 日志文件中，第三行是日期和时间戳，各日志文件的日期和时间戳互不相同。  
类型：整数  
必需：否

**LogDirectoryPath**  
对于 CustomLogs，这是日志在 EC2 实例上的存储路径。对于 IIS 日志，这是为单个站点存储 IIS 日志的文件夹 (例如 **C:\$1\$1inetpub\$1\$1logs\$1\$1LogFiles\$1\$1W3SVC*n***)。对于 IIS 日志，仅支持 W3C 日志格式。不支持 IIS、NCSA 和自定义格式。  
类型：字符串  
是否必需：是

**LogGroup**  
日志组的名称。此名称显示在 CloudWatch 控制台的 **Log Groups（日志组）**屏幕上。  
类型：字符串  
是否必需：是

**LogName**  
日志文件的名称。  

1. 要查找日志的名称，请在事件查看器的导航窗格中，选择 **Applications and Services Logs (应用程序和服务日志)**。

1. 在日志列表中，右键单击要上传的日志（例如 `Microsoft` > `Windows` > `Backup` > `Operational`），然后选择**创建自定义视图**。

1. 在 **Create Custom View (创建自定义视图)** 对话框中，选择 **XML** 选项卡。**LogName** 位于 <Select Path=> 标签中（例如 `Microsoft-Windows-Backup`）。将此文本复制到 **LogName** 参数。
类型：字符串  
有效值：`Application` \$1 `Security` \$1 `System` \$1 `Microsoft-Windows-WinINet/Analytic`  
是否必需：是

**LogStream**  
目标日志流。如果使用默认值 **\$1instance\$1id\$1**，则将该实例的实例 ID 用作日志流名称。  
类型：字符串  
有效值：`{instance_id}` \$1 `{hostname}` \$1 `{ip_address}` *<log\$1stream\$1name>*  
如果输入的日志流名称不存在，则 CloudWatch Logs 会自动创建该名称。可以使用文字字符串或预定义的变量（**\$1instance\$1id\$1**、**\$1hostname\$1**、**\$1ip\$1address\$1**），或所有这三个变量的组合来定义日志流名称。  
此参数中指定的日志流名称将在 CloudWatch 控制台中的 **Log Groups > Streams for *<YourLogStream>***（日志组 > <YourLogStream> 的流）屏幕上显示。  
是否必需：是

**MetricName**  
您希望性能数据包含在其下的 CloudWatch 指标。  
不要在名称中使用特殊字符。如果您这样做，指标和相关警报可能无法正常工作。
类型：字符串  
是否必需：是

**NameSpace**  
您希望将写入性能计数器数据的指标命名空间。  
类型：字符串  
是否必需：是

**PollInterval**  
必须在多少秒之后才能上传新性能计数器和日志数据。  
类型：整数  
有效值：将其设置为 5 秒或 5 秒以上。建议设置为十五秒 (00:00:15)。  
是否必需：是

**区域**  
要发送日志数据的 AWS 区域。虽然可以将性能计数器发送到与日志数据发送目标不同的区域，但是我们建议您将此参数设置为运行实例的区域。  
类型：字符串  
有效值：Systems Manager 和 CloudWatch Logs 都支持的 AWS 区域 区域ID，例如 `us-east-2`、`eu-west-1`, 和 `ap-southeast-1`。对于每个服务支持的 AWS 区域 的列表，请参阅**《Amazon Web Services 一般参考》中的 [Amazon CloudWatch Logs Service Endpoints](https://docs.aws.amazon.com/general/latest/gr/cwl_region.html#cwl_region) 和 [Systems Manager service endpoints](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region)。  
是否必需：是

**SecretKey**  
您的秘密访问密钥。如果未使用 IAM 角色启动实例，则必须指定此属性。  
类型：字符串  
必需：否

**startType**  
打开或关闭实例上的 CloudWatch 功能。  
类型：字符串  
有效值：`Enabled` \$1 `Disabled`  
是否必需：是

**TimestampFormat**  
要使用的时间戳格式。有关支持的值的列表，请参阅 MSDN 库中的[自定义日期和时间格式字符串](http://msdn.microsoft.com/en-us/library/8kb3ddd4.aspx)。  
类型：字符串  
是否必需：是

**TimeZoneKind**  
在日志时间戳中不包含时区信息时提供时区信息。如果此参数留空且时间戳不包括时区信息，则 CloudWatch Logs 默认为本地时区。如果时间戳已包含时区信息，则忽略此参数。  
类型：字符串  
有效值：`Local` \$1 `UTC`  
必需：否

**单位**  
适当的指标计量单位。  
类型：字符串  
有效值：秒 \$1 微秒 \$1 毫秒 \$1 字节 \$1 千字节 \$1 兆字节 \$1 千兆字节 \$1 太兆字节 \$1 位 \$1 千位 \$1 兆位 \$1 千兆位 \$1 太兆位 \$1 百分比 \$1 计数 \$1 字节/秒 \$1 千字节/秒 \$1 兆字节/秒 \$1 千兆字节/秒 \$1 太兆字节/秒 \$1 位/秒 \$1 千位/秒 \$1 兆位/秒 \$1 千兆位/秒 \$1 太兆位/秒 \$1 计数/秒 \$1 无  
是否必需：是

## `aws:configureDocker`
<a name="aws-configuredocker"></a>

(2.0 版或更高版本架构) 将实例配置为使用容器和 Docker。此插件在大多数 Linux 变体和 Windows Server 操作系统中受支持。

### 语法
<a name="configuredocker-syntax"></a>

#### Schema 2.2
<a name="configuredocker-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:configureDocker
parameters:
  action:
    description: "(Required) The type of action to perform."
    type: String
    default: Install
    allowedValues:
    - Install
    - Uninstall
mainSteps:
- action: aws:configureDocker
  name: configureDocker
  inputs:
    action: "{{ action }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:configureDocker plugin",
  "parameters": {
    "action": {
      "description": "(Required) The type of action to perform.",
      "type": "String",
      "default": "Install",
      "allowedValues": [
        "Install",
        "Uninstall"
      ]
    }
  },
  "mainSteps": [
    {
      "action": "aws:configureDocker",
      "name": "configureDocker",
      "inputs": {
        "action": "{{ action }}"
      }
    }
  ]
}
```

------

### 输入
<a name="configuredocker-properties"></a>

**action**  
要执行的操作类型。  
类型：Enum  
有效值：`Install` \$1 `Uninstall`  
是否必需：是

## `aws:configurePackage`
<a name="aws-configurepackage"></a>

（2.0 版或更高版本架构）安装或卸载 AWS Systems Manager Distributor 程序包。您可以安装所指定软件包的最新版本、默认版本或其中一个版本。AWS 提供的软件包也受支持。此插件可在 Windows Server 和 Linux 操作系统上运行，但 Linux 操作系统不支持所有可用的软件包。

Windows Server 的可用 AWS 程序包包括：`AWSPVDriver`、`AWSNVMe`、`AwsEnaNetworkDriver`、`AwsVssComponents`、`AmazonCloudWatchAgent`、`CodeDeployAgent`，和 `AWSSupport-EC2Rescue.`

适用于 Linux 操作系统的可用 AWS 软件包包括：`AmazonCloudWatchAgent`、`CodeDeployAgent`,和 `AWSSupport-EC2Rescue`。

### 语法
<a name="configurepackage-syntax"></a>

#### Schema 2.2
<a name="configurepackage-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:configurePackage
parameters:
  name:
    description: "(Required) The name of the AWS package to install or uninstall."
    type: String
  action:
    description: "(Required) The type of action to perform."
    type: String
    default: Install
    allowedValues:
    - Install
    - Uninstall
  ssmParameter:
    description: "(Required) Argument stored in Parameter Store."
    type: String
    default: "{{ ssm:parameter_store_arg }}"
mainSteps:
- action: aws:configurePackage
  name: configurePackage
  inputs:
    name: "{{ name }}"
    action: "{{ action }}"
    additionalArguments: 
      "{\"SSM_parameter_store_arg\": \"{{ ssmParameter }}\", \"SSM_custom_arg\": \"myValue\"}"
```

------
#### [ JSON ]

```
{
   "schemaVersion": "2.2",
   "description": "aws:configurePackage",
   "parameters": {
      "name": {
         "description": "(Required) The name of the AWS package to install or uninstall.",
         "type": "String"
      },
      "action": {
         "description": "(Required) The type of action to perform.",
         "type": "String",
         "default": "Install",
         "allowedValues": [
            "Install",
            "Uninstall"
         ]
      },
      "ssmParameter": {
         "description": "(Required) Argument stored in Parameter Store.",
         "type": "String",
         "default": "{{ ssm:parameter_store_arg }}"
      }
   },
   "mainSteps": [
      {
         "action": "aws:configurePackage",
         "name": "configurePackage",
         "inputs": {
            "name": "{{ name }}",
            "action": "{{ action }}",
            "additionalArguments": "{\"SSM_parameter_store_arg\": \"{{ ssmParameter }}\", \"SSM_custom_arg\": \"myValue\"}"
         }
      }
   ]
}
```

------

### 输入
<a name="configurepackage-properties"></a>

**name**  
要安装或卸载的 AWS 软件包名称。可用的软件包如下所述：`AWSPVDriver`、`AwsEnaNetworkDriver`、`AwsVssComponents`，和 `AmazonCloudWatchAgent`。  
类型：字符串  
是否必需：是

**action**  
安装或卸载软件包。  
类型：Enum  
有效值：`Install` \$1 `Uninstall`  
是否必需：是

**安装类型**  
要执行的安装类型。如果指定 `Uninstall and reinstall`，该软件包将完全卸载，然后重新安装。在重新安装完成之前，应用程序不可用。如果指定 `In-place update`，将根据您在更新脚本中提供的指令，仅将新文件或更改的文件添加到现有的安装中。应用程序在整个更新过程中保持可用。这些区域有:已发布的软件包 AWS 不支持 `In-place update` 选项。`Uninstall and reinstall` 为默认值。  
类型：Enum  
有效值：`Uninstall and reinstall` \$1 `In-place update`  
必需：否

**附加参数**  
为安装、卸载或更新脚本提供的其他参数的 JSON 字符串。每个参数的前缀必须为 `SSM_`。可以使用约定 `{{ssm:parameter-name}}` 在附加参数中引用 Parameter Store 参数。要在安装、卸载或更新脚本过程中使用附加参数，必须使用适合操作系统的语法将参数作为环境变量引用。例如，在 PowerShell 中，您引用 `SSM_arg` 参数为 `$Env:SSM_arg`。您定义的参数数量没有限制，但附加参数输入有 4096 个字符限制。此限制包括您定义的所有秘钥和值。  
类型：StringMap  
必需：否

**版本**  
要卸载或安装的特定版本的软件包。如果要安装，系统默认安装最新发布的版本。如果要卸载，系统默认卸载当前安装的版本。如果没有找到已安装的版本，则会下载最新发布的版本，然后运行卸载操作。  
类型：字符串  
必需：否

## `aws:domainJoin`
<a name="aws-domainJoin"></a>

将 EC2 实例加入域。此插件在 Linux 和 Windows Server 操作系统上运行。该插件会将 Linux 实例的主机名更改为 EC2AMAZ-*XXXXXXX* 格式。有关加入 EC2 实例的更多信息，请参阅* AWS Directory Service 管理指南*中的[将 EC2 实例加入到 AWS 托管 Microsoft AD 目录](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ms_ad_join_instance.html)。

### 语法
<a name="domainJoin-syntax"></a>

#### Schema 2.2
<a name="domainJoin-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:domainJoin
parameters:
  directoryId:
    description: "(Required) The ID of the directory."
    type: String
  directoryName:
    description: "(Required) The name of the domain."
    type: String
  directoryOU:
    description: "(Optional) The organizational unit to assign the computer object to."
    type: String
  dnsIpAddresses:
    description: "(Required) The IP addresses of the DNS servers for your directory."
    type: StringList
  hostname:
    description: "(Optional) The hostname you want to assign to the node."
    type: String
mainSteps:
- action: aws:domainJoin
  name: domainJoin
  inputs:
    directoryId: "{{ directoryId }}"
    directoryName: "{{ directoryName }}"
    directoryOU: "{{ directoryOU }}"
    dnsIpAddresses: "{{ dnsIpAddresses }}"
    hostname: "{{ hostname }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:domainJoin",
  "parameters": {
    "directoryId": {
      "description": "(Required) The ID of the directory.",
      "type": "String"
    },
    "directoryName": {
      "description": "(Required) The name of the domain.",
      "type": "String"
    },
    "directoryOU": {
        "description": "(Optional) The organizational unit to assign the computer object to.",
        "type": "String"
      },
    "dnsIpAddresses": {
      "description": "(Required) The IP addresses of the DNS servers for your directory.",
      "type": "StringList"
    },
    "hostname": {
        "description": "(Optional) The hostname you want to assign to the node.",
        "type": "String"
      }
  },
  "mainSteps": [
    {
      "action": "aws:domainJoin",
      "name": "domainJoin",
      "inputs": {
        "directoryId": "{{ directoryId }}",
        "directoryName": "{{ directoryName }}",
        "directoryOU":"{{ directoryOU }}",
        "dnsIpAddresses":"{{ dnsIpAddresses }}",
        "hostname":"{{ hostname }}"
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="domainJoin-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:domainJoin:
    properties:
      directoryId: "{{ directoryId }}"
      directoryName: "{{ directoryName }}"
      directoryOU: "{{ directoryOU }}"
      dnsIpAddresses: "{{ dnsIpAddresses }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:domainJoin":{
         "properties":{
            "directoryId":"{{ directoryId }}",
            "directoryName":"{{ directoryName }}",
            "directoryOU":"{{ directoryOU }}",
            "dnsIpAddresses":"{{ dnsIpAddresses }}"
         }
      }
   }
}
```

------

### 属性
<a name="domainJoin-properties"></a>

**directoryId**  
目录的 ID。  
类型：字符串  
是否必需：是  
示例："directoryId": "d-1234567890"

**directoryName**  
域的名称。  
类型：字符串  
是否必需：是  
示例："directoryName": "example.com"

**directoryOU**  
组织部门 (OU)。  
类型：字符串  
必需：否  
示例："directoryOU": "OU=test,DC=example,DC=com"

**dnsIpAddresses**  
DNS 服务器的 IP 地址。  
类型：StringList  
是否必需：是  
示例："dnsIpAddresses": ["198.51.100.1","198.51.100.2"]

**hostname**  
要分配给节点的主机名。如果未提供，则 Windows Server 实例的名称不会更改，而 Linux 实例将使用默认的命名模式。如果提供，Windows Server 实例将使用所提供的确切值，而 Linux 实例将以此为前缀（除非将 `keepHostName` 设置为“true”）。  
类型：字符串  
必需：否

**keepHostName**  
确定 Linux 实例在加入域时是否更改主机名。此参数仅适用于 Linux。默认情况下（`hostname`、`hostnameNumAppendDigits` 无输入，且 `keepHostName` 设置为“false”），Linux 主机将重命名为 EC2AMAZ-XXXXXX 模式。设置为“true”时，将会保留原始主机名并忽略 `hostname` 和 `hostnameNumAppendDigits` 的输入。  
类型：布尔值  
必需：否

**hostnameNumAppendDigits**  
定义要在主机名值之后附加的随机数值位数。此参数仅适用于 Linux，并且应与 `hostname` 参数结合使用。如果未提供 `hostname`，则会忽略此参数。  
类型：字符串  
允许的值：1 至 5  
必需：否

### 示例
<a name="domainJoin-examples"></a>

有关示例，请参阅《AWS Directory Service 管理指南》**中的[将 Amazon EC2 实例加入您的 AWS Managed Microsoft AD](https://docs.aws.amazon.com/directoryservice/latest/admin-guide/ec2-join-aws-domain.html)。

## `aws:downloadContent`
<a name="aws-downloadContent"></a>

（2.0 版或更高版本架构）从远程位置下载 SSM 文档和脚本。不支持 GitHub Enterprise 存储库。此插件在 Linux 和 Windows Server 操作系统中受支持。

### 语法
<a name="downloadContent-syntax"></a>

#### Schema 2.2
<a name="downloadContent-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:downloadContent
parameters:
  sourceType:
    description: "(Required) The download source."
    type: String
  sourceInfo:
    description: "(Required) The information required to retrieve the content from
      the required source."
    type: StringMap
mainSteps:
- action: aws:downloadContent
  name: downloadContent
  inputs:
    sourceType: "{{ sourceType }}"
    sourceInfo: "{{ sourceInfo }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:downloadContent",
  "parameters": {
    "sourceType": {
    "description": "(Required) The download source.",
    "type": "String"
  },
  "sourceInfo": {
    "description": "(Required) The information required to retrieve the content from the required source.",
    "type": "StringMap"
    }
  },
  "mainSteps": [
    {
      "action": "aws:downloadContent",
      "name": "downloadContent",
      "inputs": {
        "sourceType":"{{ sourceType }}",
        "sourceInfo":"{{ sourceInfo }}"
      }
    }
  ]
}
```

------

### 输入
<a name="downloadContent-inputs"></a>

**sourceType**  
下载源 Systems Manager 支持以下下载脚本和 SSM 文档的源类型：`GitHub`、`Git`、`HTTP`、`S3`，和`SSMDocument`。  
类型：字符串  
是否必需：是

**sourceInfo**  
从所需源检索内容所需的信息。  
类型：StringMap  
是否必需：是  
 **对于 sourceType `GitHub,`，请指定以下内容：**  
+ owner：存储库所有者。
+ repository：存储库的名称。
+ path：您要下载的文件或目录所在的路径。
+ getOptions：用于从分支（而非主分支）或存储库中的特定提交中检索内容的额外选项。如果您在主分支中使用最新提交，则可以省略 getOptions。如果您的存储库是在 2020 年 10 月 1 日之后创建的，则默认分支可能被命名为 main 而不是 master。在这种情况下，需要为 getOptions 参数指定值。

  此参数采用以下格式：
  + branch:refs/heads/*branch\$1name*

    默认值为 `master`。

    要指定非默认分支，请使用以下格式：

    branch:refs/heads/*branch\$1name*
  + commitID：*commitID*

    默认值为 `head`。

    要在最新提交以外的提交中使用 SSM 文档的版本，请指定完整的提交 ID。例如：

    ```
    "getOptions": "commitID:bbc1ddb94...b76d3bEXAMPLE",
    ```
+ tokenInfo：以 `{{ssm-secure:secure-string-token-name}}` 格式存储 GitHub 访问令牌信息的 Systems Manager 参数（SecureString 参数）。
**注意**  
该 `tokenInfo` 字段是唯一支持 SecureString 参数的 SSM 文档插件字段。任何其他字段和任何其他 SSM 文档插件都不支持 SecureString 参数。

```
{
    "owner":"TestUser",
    "repository":"GitHubTest",
    "path":"scripts/python/test-script",
    "getOptions":"branch:master",
    "tokenInfo":"{{ssm-secure:secure-string-token}}"
}
```
 **对于 sourceType `Git`，必须指定以下内容：**  
+ repository

  path：要下载的文件或目录的 Git repository URL。

  类型：字符串
此外，您可以指定以下任何可选参数：  
+ getOptions

  用于从分支（而非主分支）或存储库中的特定提交中检索内容的额外选项。如果您在主分支中使用最新提交，则可以省略 getOptions。

  类型：字符串

  此参数采用以下格式：
  + branch:refs/heads/*branch\$1name*

    默认值为 `master`。

    仅当您的 SSM 文档存储在 `master` 以外的分支中时， `"branch"` 才是必需的。例如：

    ```
    "getOptions": "branch:refs/heads/main"
    ```
  + commitID：*commitID*

    默认值为 `head`。

    要在最新提交以外的提交中使用 SSM 文档的版本，请指定完整的提交 ID。例如：

    ```
    "getOptions": "commitID:bbc1ddb94...b76d3bEXAMPLE",
    ```
+ privateSSHKey

  连接指定的`repository` 时要使用的 SSH 秘钥。可以使用以下格式为引用 SSH 密钥值 `SecureString` 参数：`{{ssm-secure:your-secure-string-parameter}}`。

  类型：字符串
+ 跳过主机键检查

  确定连接到您指定的 `repository` 时 StrictHostKeyChecking 选项的值。默认值为 `false`。

  类型：布尔值
+ username

  连接到使用 HTTP 指定的 `repository` 时使用的用户名。可以使用以下格式引用用户名值的 `SecureString` 参数：`{{ssm-secure:your-secure-string-parameter}}`。

  类型：字符串
+ password

  连接到使用 HTTP 指定的 `repository` 时使用的密码。可以使用以下格式为引用密码值 `SecureString` 参数：`{{ssm-secure:your-secure-string-parameter}}`。

  类型：字符串
 对于 **sourceType`HTTP`，必须指定以下内容：**  
+ url

  要下载的文件或目录的 URL。

  类型：字符串
此外，您可以指定以下任何可选参数：  
+ allowInsecureDownload

  确定是否可以通过未使用安全套接字层 (SSL) 或传输层安全 (TLS) 加密的连接执行下载。默认值为 `false`。我们建议您不要在未加密的情况下执行下载。如果您选择这样做，您将承担所有相关风险。安全性是 AWS 和您的共同责任。这被描述为责任共担共担模式。要了解更多信息，请参阅[责任共担模式](https://aws.amazon.com/compliance/shared-responsibility-model/)。

  类型：布尔值
+ authMethod

  确定在连接到指定的 `url` 时是否要使用用户名和密码。如果指定 `Basic` 或者 `Digest` 时，您必须为 `username` 和 `password` 参数提供值。使用 `Digest` 方法，3.0.1181.0 版本或更高版本的 SSM Agent 必须安装在实例上。`Digest` 方法支持 MD5 和 SHA256 加密。

  类型：字符串

  有效值：`None` \$1`Basic` \$1`Digest`
+ username

  连接到 `url` 您指定使用 `Basic` 身份验证。可以使用以下格式引用用户名值的 `SecureString` 参数：`{{ssm-secure:your-secure-string-parameter}}`。

  类型：字符串
+ password

  连接到您使用 `Basic` 身份验证指定的 `url` 时使用的密码。可以使用以下格式为引用密码值 `SecureString` 参数：`{{ssm-secure:your-secure-string-parameter}}`。

  类型：字符串
 **对于 sourceType `S3`，请指定以下内容：**  
+ 路径：要从 Amazon S3 下载的文件或目录的 URL。
从 S3 存储桶下载文件时，会在下载目录中生成 .etag 文件。

```
{
    "path": "https://s3.amazonaws.com/amzn-s3-demo-bucket/powershell/helloPowershell.ps1" 
}
```
 **对于 SourceType `SSMDocument`，请指定以下其中*一* 项：**  
+ 名称：采用以下格式的文档的名称和版本：`name:version`。版本为可选项。

  ```
  {
      "name": "Example-RunPowerShellScript:3" 
  }
  ```
+ name：采用以下格式的文档 ARN：`arn:aws:ssm:region:account_id:document/document_name`

  ```
  {
     "name":"arn:aws:ssm:us-east-2:3344556677:document/MySharedDoc"
  }
  ```

**destinationPath**  
实例上的可选本地路径，用于下载文件。如果不指定路径，内容将下载到命令 ID 的相对路径。  
类型：字符串  
必需：否

## `aws:psModule`
<a name="aws-psModule"></a>

在 Amazon EC2 实例上安装 PowerShell 模块。此插件仅在 Windows Server 操作系统中运行。

### 语法
<a name="psModule-syntax"></a>

#### Schema 2.2
<a name="psModule-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:psModule
parameters:
  source:
    description: "(Required) The URL or local path on the instance to the application
      .zip file."
    type: String
mainSteps:
- action: aws:psModule
  name: psModule
  inputs:
    source: "{{ source }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:psModule",
  "parameters": {
    "source": {
      "description": "(Required) The URL or local path on the instance to the application .zip file.",
      "type": "String"
    }
  },
  "mainSteps": [
    {
      "action": "aws:psModule",
      "name": "psModule",
      "inputs": {
        "source": "{{ source }}"
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="domainJoin-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:psModule:
    properties:
    - runCommand: "{{ commands }}"
      source: "{{ source }}"
      sourceHash: "{{ sourceHash }}"
      workingDirectory: "{{ workingDirectory }}"
      timeoutSeconds: "{{ executionTimeout }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:psModule":{
         "properties":[
            {
               "runCommand":"{{ commands }}",
               "source":"{{ source }}",
               "sourceHash":"{{ sourceHash }}",
               "workingDirectory":"{{ workingDirectory }}",
               "timeoutSeconds":"{{ executionTimeout }}"
            }
         ]
      }
   }
}
```

------

### 属性
<a name="psModule-properties"></a>

**runCommand**  
安装模块后要运行的 PowerShell 命令。  
类型：StringList  
必需：否

**source**  
访问实例上应用程序 `.zip` 文件的 URL 或本地路径。  
类型：字符串  
是否必需：是

**sourceHash**  
`.zip` 文件的 SHA256 哈希值。  
类型：字符串  
必需：否

**timeoutSeconds**  
在被视为已失败前命令将运行的时间 (以秒为单位)。  
类型：字符串  
必需：否

**workingDirectory**  
实例上工作目录的路径。  
类型：字符串  
必需：否

## `aws:refreshAssociation`
<a name="aws-refreshassociation"></a>

(2.0 版或更高版本架构) 按需刷新 (强制应用) 关联。此操作将根据所选关联或绑定到目标的所有关联中定义的内容来更改系统状态。此插件仅在 Linux 和 Windows Server 操作系统上运行。

### 语法
<a name="refreshassociation-syntax"></a>

#### Schema 2.2
<a name="refreshassociation-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:refreshAssociation
parameters:
  associationIds:
    description: "(Optional) List of association IDs. If empty, all associations bound
      to the specified target are applied."
    type: StringList
mainSteps:
- action: aws:refreshAssociation
  name: refreshAssociation
  inputs:
    associationIds:
    - "{{ associationIds }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:refreshAssociation",
  "parameters": {
    "associationIds": {
      "description": "(Optional) List of association IDs. If empty, all associations bound to the specified target are applied.",
      "type": "StringList"
    }
  },
  "mainSteps": [
    {
      "action": "aws:refreshAssociation",
      "name": "refreshAssociation",
      "inputs": {
        "associationIds": [
          "{{ associationIds }}"
        ]
      }
    }
  ]
}
```

------

### 输入
<a name="refreshassociation-properties"></a>

**associationIds**  
关联 ID 的列表。如果为空，则应用与指定目标绑定的所有关联。  
类型：StringList  
必需：否

## `aws:runDockerAction`
<a name="aws-rundockeraction"></a>

（2.0 版或更高版本架构）在容器上运行 Docker 操作。此插件仅在 Linux 和 Windows Server 操作系统上运行。

### 语法
<a name="rundockeraction-syntax"></a>

#### Schema 2.2
<a name="rundockeraction-syntax-2.2"></a>

------
#### [ YAML ]

```
---
mainSteps:
- action: aws:runDockerAction
  name: RunDockerAction
  inputs:
    action: "{{ action }}"
    container: "{{ container }}"
    image: "{{ image }}"
    memory: "{{ memory }}"
    cpuShares: "{{ cpuShares }}"
    volume: "{{ volume }}"
    cmd: "{{ cmd }}"
    env: "{{ env }}"
    user: "{{ user }}"
    publish: "{{ publish }}"
    workingDirectory: "{{ workingDirectory }}"
    timeoutSeconds: "{{ timeoutSeconds }}"
```

------
#### [ JSON ]

```
{
   "mainSteps":[
      {
         "action":"aws:runDockerAction",
         "name":"RunDockerAction",
         "inputs":{
            "action":"{{ action }}",
            "container":"{{ container }}",
            "image":"{{ image }}",
            "memory":"{{ memory }}",
            "cpuShares":"{{ cpuShares }}",
            "volume":"{{ volume }}",
            "cmd":"{{ cmd }}",
            "env":"{{ env }}",
            "user":"{{ user }}",
            "publish":"{{ publish }}",
            "workingDirectory": "{{ workingDirectory }}",
            "timeoutSeconds": "{{ timeoutSeconds }}"
         }
      }
   ]
}
```

------

### 输入
<a name="rundockeraction-properties"></a>

**action**  
要执行的操作类型。  
类型：字符串  
是否必需：是

**容器**  
Docker 容器 ID。  
类型：字符串  
必需：否

**image**  
Docker 映像名称。  
类型：字符串  
必需：否

**cmd**  
容器命令。  
类型：字符串  
必需：否

**memory**  
容器内存限制。  
类型：字符串  
必需：否

**cpuShares**  
容器 CPU 份额 (相对权重)。  
类型：字符串  
必需：否

**volume**  
容器卷挂载。  
类型：StringList  
必需：否

**env**  
容器的环境变量。  
类型：字符串  
必需：否

**用户**  
容器的用户名。  
类型：字符串  
必需：否

**发布**  
容器已发布端口。  
类型：字符串  
必需：否

**workingDirectory**  
您的托管节点上的工作目录的路径。  
类型：字符串  
必需：否

**timeoutSeconds**  
在被视为已失败前命令将运行的时间 (以秒为单位)。  
类型：字符串  
必需：否

## `aws:runDocument`
<a name="aws-rundocument"></a>

（2.0 版或更高版本架构）运行存储在 Systems Manager 或本地共享存储中的 SSM 文档。您可以将此插件与 [`aws:downloadContent`](#aws-downloadContent) 插件配合使用，以将远程位置的 SSM 文档下载到本地共享存储，然后运行该文档。此插件在 Linux 和 Windows Server 操作系统中受支持。此插件不支持运行 `AWS-UpdateSSMAgent` 文档或使用 `aws:updateSsmAgent` 插件的任何文档。

### 语法
<a name="rundocument-syntax"></a>

#### Schema 2.2
<a name="aws-rundocument-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:runDocument
parameters:
  documentType:
    description: "(Required) The document type to run."
    type: String
    allowedValues:
    - LocalPath
    - SSMDocument
mainSteps:
- action: aws:runDocument
  name: runDocument
  inputs:
    documentType: "{{ documentType }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:runDocument",
  "parameters": {
    "documentType": {
      "description": "(Required) The document type to run.",
      "type": "String",
      "allowedValues": [
        "LocalPath",
        "SSMDocument"
      ]
    }
  },
  "mainSteps": [
    {
      "action": "aws:runDocument",
      "name": "runDocument",
      "inputs": {
        "documentType": "{{ documentType }}"
      }
    }
  ]
}
```

------

### 输入
<a name="rundocument-properties"></a>

**documentType**  
要运行的文档类型。您可以运行本地文档 (`LocalPath`) 或存储在 Systems Manager (`SSMDocument`) 中的文档。  
类型：字符串  
是否必需：是

**documentPath**  
文档的路径。如果 `documentType` 是 `LocalPath`，则指定本地共享存储上文档的路径。如果 `documentType` 是 `SSMDocument`，则指定文档的名称。  
类型：字符串  
必需：否

**documentParameters**  
文档的参数。  
类型：StringMap  
必需：否

## `aws:runPowerShellScript`
<a name="aws-runPowerShellScript"></a>

运行 PowerShell 脚本或者指定要运行的脚本的路径。此插件在 Microsoft Windows Server 和 Linux 操作系统上运行。

### 语法
<a name="runPowerShellScript-syntax"></a>

#### Schema 2.2
<a name="runPowerShellScript-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:runPowerShellScript
parameters:
  commands:
    type: String
    description: "(Required) The commands to run or the path to an existing script
      on the instance."
    default: Write-Host "Hello World"
mainSteps:
- action: aws:runPowerShellScript
  name: runPowerShellScript
  inputs:
    timeoutSeconds: '60'
    runCommand:
    - "{{ commands }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:runPowerShellScript",
  "parameters": {
    "commands": {
      "type": "String",
      "description": "(Required) The commands to run or the path to an existing script on the instance.",
      "default": "Write-Host \"Hello World\""
    }
  },
  "mainSteps": [
    {
      "action": "aws:runPowerShellScript",
      "name": "runPowerShellScript",
      "inputs": {
        "timeoutSeconds": "60",
        "runCommand": [
          "{{ commands }}"
        ]
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="runPowerShellScript-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:runPowerShellScript:
    properties:
    - id: 0.aws:runPowerShellScript
      runCommand: "{{ commands }}"
      workingDirectory: "{{ workingDirectory }}"
      timeoutSeconds: "{{ executionTimeout }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:runPowerShellScript":{
         "properties":[
            {
               "id":"0.aws:runPowerShellScript",
               "runCommand":"{{ commands }}",
               "workingDirectory":"{{ workingDirectory }}",
               "timeoutSeconds":"{{ executionTimeout }}"
            }
         ]
      }
   }
}
```

------

### 属性
<a name="runPowerShellScript-properties"></a>

**runCommand**  
指定要运行的命令或实例上现有脚本的路径。  
类型：StringList  
是否必需：是

**timeoutSeconds**  
在被视为已失败前命令将运行的时间（以秒为单位）。如果达到超时，Systems Manager 停止命令执行。  
类型：字符串  
必需：否

**workingDirectory**  
实例上工作目录的路径。  
类型：字符串  
必需：否

## `aws:runShellScript`
<a name="aws-runShellScript"></a>

运行 Linux shell 脚本或者指定要运行的脚本的路径。此插件仅在 Linux 操作系统中运行。

### 语法
<a name="runShellScript-syntax"></a>

#### Schema 2.2
<a name="runShellScript-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:runShellScript
parameters:
  commands:
    type: String
    description: "(Required) The commands to run or the path to an existing script
      on the instance."
    default: echo Hello World
mainSteps:
- action: aws:runShellScript
  name: runShellScript
  inputs:
    timeoutSeconds: '60'
    runCommand:
    - "{{ commands }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:runShellScript",
  "parameters": {
    "commands": {
      "type": "String",
      "description": "(Required) The commands to run or the path to an existing script on the instance.",
      "default": "echo Hello World"
    }
  },
  "mainSteps": [
    {
      "action": "aws:runShellScript",
      "name": "runShellScript",
      "inputs": {
        "timeoutSeconds": "60",
        "runCommand": [
          "{{ commands }}"
        ]
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="runShellScript-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:runShellScript:
    properties:
    - runCommand: "{{ commands }}"
      workingDirectory: "{{ workingDirectory }}"
      timeoutSeconds: "{{ executionTimeout }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:runShellScript":{
         "properties":[
            {
               "runCommand":"{{ commands }}",
               "workingDirectory":"{{ workingDirectory }}",
               "timeoutSeconds":"{{ executionTimeout }}"
            }
         ]
      }
   }
}
```

------

### 属性
<a name="runShellScript-properties"></a>

**runCommand**  
指定要运行的命令或实例上现有脚本的路径。  
类型：StringList  
是否必需：是

**timeoutSeconds**  
在被视为已失败前命令将运行的时间（以秒为单位）。如果达到超时，Systems Manager 停止命令执行。  
类型：字符串  
必需：否

**workingDirectory**  
实例上工作目录的路径。  
类型：字符串  
必需：否

## `aws:softwareInventory`
<a name="aws-softwareinventory"></a>

（2.0 版或更高版本架构）收集有关托管实例上应用程序、文件和配置的元数据。此插件仅在 Linux 和 Windows Server 操作系统上运行。在配置清单收集时，应该首先创建 AWS Systems Manager State Manager 关联。Systems Manager 会在关联运行时收集清单数据。如果您不先创建关联，并试图调用 `aws:softwareInventory` 插件，则系统会返回以下错误：

```
The aws:softwareInventory plugin can only be invoked via ssm-associate.
```

一个实例一次只能配置一个清单关联。如果您为一个实例配置了两个或更多关联，则清单关联不会运行，而且系统不会收集清单数据。有关收集文件清单的更多信息，请参阅 [AWS Systems Manager 清单](systems-manager-inventory.md)。

### 语法
<a name="softwareinventory-syntax"></a>

#### Schema 2.2
<a name="softwareinventory-syntax-2.2"></a>

------
#### [ YAML ]

```
---
mainSteps:
- action: aws:softwareInventory
  name: collectSoftwareInventoryItems
  inputs:
    applications: "{{ applications }}"
    awsComponents: "{{ awsComponents }}"
    networkConfig: "{{ networkConfig }}"
    files: "{{ files }}"
    services: "{{ services }}"
    windowsRoles: "{{ windowsRoles }}"
    windowsRegistry: "{{ windowsRegistry}}"
    windowsUpdates: "{{ windowsUpdates }}"
    instanceDetailedInformation: "{{ instanceDetailedInformation }}"
    customInventory: "{{ customInventory }}"
```

------
#### [ JSON ]

```
{
   "mainSteps":[
      {
         "action":"aws:softwareInventory",
         "name":"collectSoftwareInventoryItems",
         "inputs":{
            "applications":"{{ applications }}",
            "awsComponents":"{{ awsComponents }}",
            "networkConfig":"{{ networkConfig }}",
            "files":"{{ files }}",
            "services":"{{ services }}",
            "windowsRoles":"{{ windowsRoles }}",
            "windowsRegistry":"{{ windowsRegistry}}",
            "windowsUpdates":"{{ windowsUpdates }}",
            "instanceDetailedInformation":"{{ instanceDetailedInformation }}",
            "customInventory":"{{ customInventory }}"
         }
      }
   ]
}
```

------

### 输入
<a name="softwareinventory-properties"></a>

**应用程序**  
（可选）收集已安装应用程序的元数据。  
类型：字符串  
必需：否

**awsComponents**  
（可选）收集AWS 组件（例如 amazon-ssm-agent）的元数据。  
类型：字符串  
必需：否

**文件**  
（可选，需要 2.2.64.0 版本或更高版本的 SSM Agent ）收集文件的元数据，包括文件名称、文件创建时间、文件上次修改和访问时间以及文件大小等等。有关收集文件清单的更多信息，请参阅 [使用文件和 Windows 注册表清单](inventory-file-and-registry.md)。  
类型：字符串  
必需：否

**networkConfig**  
（可选）收集网络配置的元数据。  
类型：字符串  
必需：否

**billingInfo**  
（可选）收集与 AMI 账单代码关联的平台详细信息的元数据。  
类型：字符串  
必需：否

**windowsUpdates**  
（可选）收集所有 Windows 更新的元数据。  
类型：字符串  
必需：否

**instanceDetailedInformation**  
（可选）收集多于默认清单插件 （`aws:instanceInformation`）提供的信息的实例信息，包括 CPU 型号、速度和核心数量，等等。  
类型：字符串  
必需：否

**务**  
（可选，仅限 Windows 操作系统，需要 2.2.64.0 版本或更高版本的SSM Agent ）收集服务配置的元数据。  
类型：字符串  
必需：否

**windowsRegistry**  
（可选，仅限 Windows 操作系统，需要 2.2.64.0 版本或更高版本的SSM Agent）收集 Windows 注册表项和值。您可以选择一个键路径并以递归方式收集所有键和值。您还可以收集特定路径的特定注册表项及其值。清单会收集键路径、名称、类型和值。有关收集 Windows 注册表清单的更多信息，请参阅 [使用文件和 Windows 注册表清单](inventory-file-and-registry.md)。  
类型：字符串  
必需：否

**windowsRoles**  
（可选，仅限 Windows 操作系统，需要 2.2.64.0 版本或更高版本的 SSM Agent ）收集 Microsoft Windows 角色配置的元数据。  
类型：字符串  
必需：否

**customInventory**  
（可选）收集自定义清单数据。有关自定义清单的更多信息，请参阅 [使用自定义清单](inventory-custom.md)  
类型：字符串  
必需：否

**customInventoryDirectory**  
（可选）从指定目录收集自定义清单数据。有关自定义清单的更多信息，请参阅 [使用自定义清单](inventory-custom.md)  
类型：字符串  
必需：否

## `aws:updateAgent`
<a name="aws-updateagent"></a>

此命令可将 EC2Config 服务更新为最新版本或指定较旧版本。此插件仅在 Microsoft Windows Server 操作系统上运行。有关 EC2Config 服务的更多信息，请参阅《Amazon EC2 用户指南》**中的[使用 EC2Config 服务配置 Windows 实例（旧版）](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2config-service.html)。

### 语法
<a name="updateagent-syntax"></a>

#### Schema 2.2
<a name="updateagent-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:updateAgent
mainSteps:
- action: aws:updateAgent
  name: updateAgent
  inputs:
    agentName: Ec2Config
    source: https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:updateAgent",
  "mainSteps": [
    {
      "action": "aws:updateAgent",
      "name": "updateAgent",
      "inputs": {
        "agentName": "Ec2Config",
        "source": "https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json"
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="updateagent-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:updateAgent:
    properties:
      agentName: Ec2Config
      source: https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json
      allowDowngrade: "{{ allowDowngrade }}"
      targetVersion: "{{ version }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:updateAgent":{
         "properties":{
            "agentName":"Ec2Config",
            "source":"https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json",
            "allowDowngrade":"{{ allowDowngrade }}",
            "targetVersion":"{{ version }}"
         }
      }
   }
}
```

------

### 属性
<a name="updateagent-properties"></a>

**agentName**  
EC2Config。这是运行 EC2Config 服务的代理的名称。  
类型：字符串  
是否必需：是

**allowDowngrade**  
允许将 EC2Config 服务降级为早期版本。如果设置为 False，则只能将该服务升级为更新的版本 (默认)。如果设置为 True，则指定早期版本。  
类型：布尔值  
必需：否

**source**  
Systems Manager 复制要安装的 EC2Config 版本的位置。您无法更改此位置。  
类型：字符串  
是否必需：是

**targetVersion**  
要安装的特定版本的 EC2Config 服务。如果未指定，服务将更新到最新版本。  
类型：字符串  
必需：否

## `aws:updateSsmAgent`
<a name="aws-updatessmagent"></a>

将 SSM Agent 更新到最新版本或指定较旧版本。此插件在 Linux 和 Windows Server 操作系统上运行。有关更多信息，请参阅 [使用 SSM Agent](ssm-agent.md)。

### 语法
<a name="updateSSMagent-syntax"></a>

#### Schema 2.2
<a name="updateaSSMgent-syntax-2.2"></a>

------
#### [ YAML ]

```
---
schemaVersion: '2.2'
description: aws:updateSsmAgent
parameters:
  allowDowngrade:
    default: 'false'
    description: "(Optional) Allow the Amazon SSM Agent service to be downgraded to
      an earlier version. If set to false, the service can be upgraded to newer versions
      only (default). If set to true, specify the earlier version."
    type: String
    allowedValues:
    - 'true'
    - 'false'
mainSteps:
- action: aws:updateSsmAgent
  name: updateSSMAgent
  inputs:
    agentName: amazon-ssm-agent
    source: https://s3.{Region}.amazonaws.com/amazon-ssm-{Region}/ssm-agent-manifest.json
    allowDowngrade: "{{ allowDowngrade }}"
```

------
#### [ JSON ]

```
{
  "schemaVersion": "2.2",
  "description": "aws:updateSsmAgent",
  "parameters": {
    "allowDowngrade": {
      "default": "false",
      "description": "(Required) Allow the Amazon SSM Agent service to be downgraded to an earlier version. If set to false, the service can be upgraded to newer versions only (default). If set to true, specify the earlier version.",
      "type": "String",
      "allowedValues": [
        "true",
        "false"
      ]
    }
  },
  "mainSteps": [
    {
      "action": "aws:updateSsmAgent",
      "name": "awsupdateSsmAgent",
      "inputs": {
        "agentName": "amazon-ssm-agent",
        "source": "https://s3.{Region}.amazonaws.com/amazon-ssm-{Region}/ssm-agent-manifest.json",
        "allowDowngrade": "{{ allowDowngrade }}"
      }
    }
  ]
}
```

------

#### Schema 1.2
<a name="updateaSSMgent-syntax-1.2"></a>

------
#### [ YAML ]

```
---
runtimeConfig:
  aws:updateSsmAgent:
    properties:
    - agentName: amazon-ssm-agent
      source: https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json
      allowDowngrade: "{{ allowDowngrade }}"
```

------
#### [ JSON ]

```
{
   "runtimeConfig":{
      "aws:updateSsmAgent":{
         "properties":[
            {
               "agentName":"amazon-ssm-agent",
               "source":"https://s3.{Region}.amazonaws.com/aws-ssm-{Region}/manifest.json",
               "allowDowngrade":"{{ allowDowngrade }}"
            }
         ]
      }
   }
}
```

------

### 属性
<a name="updateSSMagent-properties"></a>

**agentName**  
amazon-ssm-agent。这是在实例上处理请求并运行命令的 Systems Manager agent 的名称。  
类型：字符串  
是否必需：是

**allowDowngrade**  
允许将 SSM Agent 降级为早期版本。如果设置为 False，则只能将该代理升级为更新的版本 (默认)。如果设置为 True，则指定早期版本。  
类型：布尔值  
是否必需：是

**source**  
复制 Systems Manager 要安装的 SSM Agent 版本的位置。您无法更改此位置。  
类型：字符串  
是否必需：是

**targetVersion**  
要安装的特定版本的 SSM Agent。如果未指定，代理将更新到最新版本。  
类型：字符串  
必需：否

# 创建 SSM 文档内容
<a name="documents-creating-content"></a>

如果 AWS Systems Manager 公有文档不执行要对 AWS 资源执行的所有操作，您可以创建自己的 SSM 文档。您还可以使用控制台克隆 SSM 文档。克隆文档将内容从现有文档复制到可以修改的新文档。创建或克隆文档时，文档的内容不得超过 64KB。此配额还包括在运行时指定的输入参数内容。创建新的 `Command` 或 `Policy` 文档时，我们建议您使用版本 2.2 或更高版本的架构，以便利用最新功能，例如文档编辑、自动版本控制、排序等。

## 编写 SSM 文档内容
<a name="writing-ssm-doc-content"></a>

要创建您自己的 SSM 文档内容，请务必了解可用于 SSM 文档的不同架构、功能、插件和语法。我们建议您熟悉以下资源。
+  [编写您自己的 AWS Systems Manager 文档](https://aws.amazon.com/blogs//mt/writing-your-own-aws-systems-manager-documents/) 
+  [数据元素和参数](documents-syntax-data-elements-parameters.md) 
+  [架构、功能和示例](documents-schemas-features.md) 
+  [命令文档插件参考](documents-command-ssm-plugin-reference.md) 
+  [Systems Manager 自动化操作参考](automation-actions.md) 
+  [自动化系统变量](automation-variables.md) 
+  [其他运行手册示例](automation-document-examples.md) 
+  使用AWS Toolkit for Visual Studio Code [处理 Systems Manager 自动化运行手册](https://docs.aws.amazon.com/toolkit-for-vscode/latest/userguide/systems-manager-automation-docs.html) 
+  [自动化运行手册的视觉对象设计体验](automation-visual-designer.md) 
+  [在运行手册中使用脚本](automation-document-script-considerations.md) 

AWS 预定义的 SSM 文档可能会执行您所需的一些操作。您可以通过在自定义 SSM 文档中使用 `aws:runDocument`、`aws:runCommand` 或 `aws:executeAutomation` 插件来调用这些文档，具体取决于文档类型。您还可以将这些文档的某些部分复制到自定义的 SSM 文档中，并编辑内容以满足您的要求。

**提示**  
创建 SSM 文档内容时，您可能会在测试时多次更改内容并更新 SSM 文档。以下命令使用最新内容更新 SSM 文档，并将文档的默认版本更新为文档的最新版本。  
Linux 和 Windows 命令使用 `jq` 命令行工具筛选 JSON 响应数据。

```
latestDocVersion=$(aws ssm update-document \
    --content file://path/to/file/documentContent.json \
    --name "ExampleDocument" \
    --document-format JSON \
    --document-version '$LATEST' \
    | jq -r '.DocumentDescription.LatestVersion')

aws ssm update-document-default-version \
    --name "ExampleDocument" \
    --document-version $latestDocVersion
```

```
latestDocVersion=$(aws ssm update-document ^
    --content file://C:\path\to\file\documentContent.json ^
    --name "ExampleDocument" ^
    --document-format JSON ^
    --document-version "$LATEST" ^
    | jq -r '.DocumentDescription.LatestVersion')

aws ssm update-document-default-version ^
    --name "ExampleDocument" ^
    --document-version $latestDocVersion
```

```
$content = Get-Content -Path "C:\path\to\file\documentContent.json" | Out-String
$latestDocVersion = Update-SSMDocument `
    -Content $content `
    -Name "ExampleDocument" `
    -DocumentFormat "JSON" `
    -DocumentVersion '$LATEST' `
    | Select-Object -ExpandProperty LatestVersion

Update-SSMDocumentDefaultVersion `
    -Name "ExampleDocument" `
    -DocumentVersion $latestDocVersion
```

### SSM 文档的安全最佳实践
<a name="ssm-document-security-practices"></a>

创建 SSM 文档时，请遵循以下安全最佳实践，以帮助防范命令注入攻击并确保安全处理参数：
+ 对将用于命令或脚本的字符串参数使用环境变量插值。为字符串参数添加值为 `ENV_VAR` 的 `interpolationType` 属性：

  ```
  {
      "command": {
          "type": "String",
          "description": "Command to execute",
          "interpolationType": "ENV_VAR"
      }
  }
  ```

  您可以指定插值生成的值不接受双引号，从而进一步增强 SSM 文档的安全性：

  ```
  {
      "command": {
          "type": "String",
          "description": "Command to execute",
          "interpolationType": "ENV_VAR",
              "allowedPattern": "^[^"]*$"
      }
  }
  ```
+ 在使用 Python、Ruby 或 Node.js 等解释性语言时，请使用恰当的环境变量语法来引用参数：

  ```
  # Python example
  import os
  command = os.environ['SSM_Message']
  ```
+ 为了向后兼容旧版 SSM Agent（3.3.2746.0 版之前），请为环境变量添加回退逻辑：

  ```
  if [ -z "${SSM_command+x}" ]; then
      export SSM_command="{{command}}"
  fi
  ```
+ 将环境变量插值与 `allowedPattern` 相结合，提供额外的输入验证。在以下示例中，`allowedPattern` 的值 `^[^"]*$` 专门用于防止在字符串值中使用双引号：

  ```
  {
      "command": {
          "type": "String",
          "interpolationType": "ENV_VAR",
          "allowedPattern": "^[a-zA-Z0-9_-]+$"
      }
  }
  ```
+ 在实现 SSM 文档之前，请确认以下安全注意事项：
  + 适用时，所有接受用户输入的字符串参数均使用环境变量插值。
  + 尽可能使用 `allowedPattern` 来实现输入验证。
  + 该文档包含了处理参数的恰当错误处理方法。
  + 对使用旧版 SSM Agent 的环境保持了向后兼容性。

有关 Systems Manager 访问的 AWS 服务自有资源以及如何配置数据边界策略的信息，请参阅 [AWS Systems Manager 中的数据边界](data-perimeters.md)。

## 克隆 SSM 文档
<a name="cloning-ssm-document"></a>

您可以克隆 AWS Systems Manager 文档，使用 Systems Manager 文档控制台创建 SSM 文档。克隆 SSM 文档将内容从现有文档复制到可以修改的新文档中。无法克隆大于 64KB 的文档。

**克隆 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在搜索框中，输入要克隆的文档的名称。

1. 选择要克隆的文档的名称，然后选择**操作**下拉菜单中的**克隆文档**。

1. 根据需要修改文档，然后选择**创建文档**保存文档。

编写 SSM 文档内容后，您可以通过以下方法之一使用您的内容创建 SSM 文档。

**Topics**
+ [编写 SSM 文档内容](#writing-ssm-doc-content)
+ [克隆 SSM 文档](#cloning-ssm-document)
+ [创建复合文档](#documents-creating-composite)

## 创建复合文档
<a name="documents-creating-composite"></a>

*复合* AWS Systems Manager (SSM) 文档是自定义文档，可通过运行一个或多个次要 SSM 文档执行一系列操作。复合文档允许您为常见任务（例如引导软件或域加入实例）创建一组标准 SSM 文档，从而升级*基础设施代码*。您随后可以在同一个 AWS 区域 中跨 AWS 账户 共享这些文档，从而减少 SSM 文档的维护工作并确保文档一致性。

例如，您可以创建执行以下操作的复合文档：

1. 安装允许列表中的所有修补程序。

1. 安装防病毒软件。

1. 从 GitHub 下载脚本并运行这些脚本。

在本例中，您的自定义 SSM 文档包含执行下面这些操作的以下插件：

1. 用于运行 `AWS-RunPatchBaseline` 文档的 `aws:runDocument` 插件，它将安装所有允许列出的补丁。

1. 可运行 `AWS-InstallApplication` 文档的 `aws:runDocument` 插件，这会安装防病毒软件。

1. 可从 GitHub 下载脚本并运行这些脚本的 `aws:downloadContent` 插件。

复合和次要文档可存储在 Systems Manager、GitHub（公有和私有存储库）或 Amazon S3 中。可创建 JSON 或 YAML 格式的复合文档和次要文档。

**注意**  
复合文档只能运行三个文档的最大文档深度。这意味着复合文档可以调用子文档；该子文档可调用最后一个文档。

要创建复合文档，请在自定义 SSM 文档中添加 [`aws:runDocument`](documents-command-ssm-plugin-reference.md#aws-rundocument) 插件并指定必需的输入。下面是可执行以下操作的复合文档示例：

1. 运行 [`aws:downloadContent`](documents-command-ssm-plugin-reference.md#aws-downloadContent) 插件，可从 GitHub 公有存储库将 SSM 文档下载到名为 bootstrap 的本地目录。SSM 文档称为 StateManagerBootstrap.yml (YAML 文档)。

1. 运行 `aws:runDocument` 插件可运行 StateManagerBootstrap.yml 文档。未指定任何参数。

1. 运行 `aws:runDocument` 插件以运行 `AWS-ConfigureDocker pre-defined` SSM 文档。指定的参数会在实例上安装 Docker。

```
{
  "schemaVersion": "2.2",
  "description": "My composite document for bootstrapping software and installing Docker.",
  "parameters": {
  },
  "mainSteps": [
    {
      "action": "aws:downloadContent",
      "name": "downloadContent",
      "inputs": {
        "sourceType": "GitHub",
        "sourceInfo": "{\"owner\":\"TestUser1\",\"repository\":\"TestPublic\", \"path\":\"documents/bootstrap/StateManagerBootstrap.yml\"}",
        "destinationPath": "bootstrap"
      }
    },
    {
      "action": "aws:runDocument",
      "name": "runDocument",
      "inputs": {
        "documentType": "LocalPath",
        "documentPath": "bootstrap",
        "documentParameters": "{}"
      }
    },
    {
      "action": "aws:runDocument",
      "name": "configureDocker",
      "inputs": {
        "documentType": "SSMDocument",
        "documentPath": "AWS-ConfigureDocker",
        "documentParameters": "{\"action\":\"Install\"}"
      }
    }
  ]
}
```

**更多信息**  
+ 有关在使用 Run Command 调用脚本时重启服务器和实例的信息，请参阅 [运行命令时处理重启问题](send-commands-reboot.md)。
+ 有关可添加到自定义 SSM 文档的插件的更多信息，请参阅 [命令文档插件参考](documents-command-ssm-plugin-reference.md)。
+ 如果只想从远程位置运行文档 (无需创建复合文档)，请参阅 [从远程位置运行文档](documents-running-remote-github-s3.md)。

# 使用文档
<a name="documents-using"></a>

本节包含有关如何使用 SSM 文档的信息。

**Topics**
+ [比较 SSM 文档版本](comparing-versions.md)
+ [创建 SSM 文档](create-ssm-console.md)
+ [删除自定义 SSM 文档](deleting-documents.md)
+ [从远程位置运行文档](documents-running-remote-github-s3.md)
+ [共享 SSM 文档](documents-ssm-sharing.md)
+ [搜索 SSM 文档](ssm-documents-searching.md)

# 比较 SSM 文档版本
<a name="comparing-versions"></a>

您可以在 Systems Manager 文档控制台中比较 AWS Systems Manager (SSM) 文档版本之间的内容差异。比较 SSM 文档的版本时，会突出显示版本内容之间的差异。

**比较 SSM 文档内容（控制台）**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在文档列表中，选择要比较其内容的文档。

1. 在存储库的**内容**选项卡上，选择**比较版本**，然后选择要将内容与其进行比较的文档版本。

# 创建 SSM 文档
<a name="create-ssm-console"></a>

如 [编写 SSM 文档内容](documents-creating-content.md#writing-ssm-doc-content) 中所述，为自定义 SSM 文档创建内容后，您可以通过 Systems Manager 控制台使用您的内容创建 SSM 文档。

**要创建 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择 **Create command or session (创建命令或会话)**。

1. 输入文档的描述性名称。

1. （可选）对于 **Target type (目标类型)**，指定可以运行文档的资源类型。

1. 在**文档类型**列表中，选择您要创建的文档类型。

1. 删除 **Content (内容)** 字段中的方括号，然后将您之前创建的文档内容粘贴到这里。

1. （可选）在 **Document tags (文档标签)** 部分，将一个或多个标签键名称/值对应用于文档。

   标签是您分配给资源的可选元数据。标签可让您按各种标准（如用途、所有者或环境）对资源进行分类。例如，您可能希望标记文档以标识它运行的任务类型、它指向的操作系统的类型以及它在其中运行的环境。在这种情况下，您可以指定以下键名/键值对：
   + `Key=TaskType,Value=MyConfigurationUpdate`
   + `Key=OS,Value=AMAZON_LINUX_2`
   + `Key=Environment,Value=Production`

1. 选择**创建文档**以保存文档。

# 删除自定义 SSM 文档
<a name="deleting-documents"></a>

如果您不再想使用自定义 SSM 文档，则可以使用 AWS Systems Manager 控制台来删除它。

**要删除 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择要删除的角色。

1. 选择**删除**。在提示删除文档时，选择**删除**。

有关使用命令行工具或 SDK 删除 SSM 文档的示例，请参阅 [将 `DeleteDocument` 与 AWS SDK 或 CLI 配合使用](example_ssm_DeleteDocument_section.md)。

# 从远程位置运行文档
<a name="documents-running-remote-github-s3"></a>

您可以使用 `AWS-RunDocument` 预定义的 SSM 文档从远程位置运行 AWS Systems Manager (SSM) 文档。此文档支持运行存储在以下位置的 SSM 文档：
+ 公共和私有 GitHub 存储库（不支持 GitHub Enterprise）
+ Amazon S3 存储桶
+ Systems Manager

虽然您也可以使用State Manager或 Automation（都是 AWS Systems Manager 中的工具）运行远程文档，下面的过程仅介绍了如何在 Systems Manager 控制台中使用 AWS Systems Manager Run Command 运行远程 SSM 文档。

**注意**  
`AWS-RunDocument` 仅可用于运行命令类型的 SSM 文档，而不是其他类型（如自动化运行手册）。`AWS-RunDocument` 使用 `aws:downloadContent` 插件。有关 `aws:downloadContent` 插件的更多信息，请参阅 [`aws:downloadContent`](documents-command-ssm-plugin-reference.md#aws-downloadContent)。

**警告**  
`AWS-RunDocument` 可以执行来自各种来源（SSM 文档、GitHub、S3、URL）的文档内容。执行远程文档时，评估的 IAM 权限适用于远程文档中的 `ssm:GetDocument` 和 `AWS-RunDocument` 中的 `ssm:SendCommand`。如果您的 IAM 策略拒绝访问特定 SSM 文档，则拥有 `AWS-RunDocument` 权限的用户仍然可以通过将文档内容作为参数传递来执行这些被拒绝的文档，这些参数可能不受相同的特定于文档的 IAM 限制的约束。  
要正确限制文档执行，请使用以下方法之一：  
**允许名单批准的来源**：如果您需要使用嵌套文档执行，请使用对每种来源类型的适当控制来限制仅允许访问已批准的来源：用于控制 SSM 文档来源的 `ssm:GetDocument` 的 IAM 策略、Amazon S3 来源的 IAM 和 Amazon S3 存储桶策略以及公共互联网来源的网络设置（例如 VPC 端点或安全组）。
**限制访问 AWS-RunDocument**：拒绝 `AWS-RunDocument` 中的 `ssm:SendCommand` 以及在您的 IAM 策略中使用 `aws:runDocument` 插件的任何其他文档，进而防止嵌套文档执行。
**使用权限边界**：实施 IAM 权限边界为用户设置最大权限，防止他们执行未经授权的文档，无论执行方法如何。
有关 IAM 最佳实践和权限边界的更多信息，请参阅《AWS Identity and Access Management 用户指南》**中的 [IAM 身份的权限边界](https://docs.aws.amazon.com/IAM/latest/UserGuide/access_policies_boundaries.html)。

**开始前的准备工作**  
必须先完成以下任务才能运行远程文档。
+ 创建 SSM 命令文档并在远程位置保存该文档。有关更多信息，请参阅 [创建 SSM 文档内容](documents-creating-content.md)。
+ 如果打算运行存储在私有 GitHub 存储库中的远程文档，则必须为 GitHub 安全访问令牌创建 Systems Manager `SecureString` 参数。通过 SSH 手动传递令牌无法访问私有 GitHub 存储库中的远程文档。该访问令牌必须作为 Systems Manager `SecureString` 参数传递。有关创建 `SecureString` 参数的更多信息，请参阅 [在 Systems Manager 中创建 Parameter Store 参数](sysman-paramstore-su-create.md)。

## 运行远程文档（控制台）
<a name="documents-running-remote-github-s3-console"></a>

**运行远程文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Run Command**。

1. 选择 **Run command（运行命令）**。

1. 在 **文档**列表中，选择 **`AWS-RunDocument`**。

1. 在 **命令参数** 中，对于 **源类型**，请选择一个选项。
   + 如果选择 **GitHub**，则采用以下格式指定**源信息**信息：

     ```
     {
         "owner": "owner_name",
         "repository": "repository_name",
         "path": "path_to_document",
         "getOptions":"branch:branch_name",
         "tokenInfo": "{{ssm-secure:secure-string-token}}"
     }
     ```

     例如：

     ```
     {
         "owner":"TestUser",
         "repository":"GitHubTestExamples",
         "path":"scripts/python/test-script",
         "getOptions":"branch:exampleBranch",
         "tokenInfo":"{{ssm-secure:my-secure-string-token}}"
     }
     ```
**注意**  
`getOptions` 是用于从分支（而非主分支）或存储库中的特定提交中检索内容的额外选项。如果您在主分支中使用最新提交，则可以省略 `getOptions`。仅当您的 SSM 文档存储在 `master` 以外的分支中时，`branch` 参数才是必需的。  
要使用存储库中特定*提交* 中的 SSM 文档版本，请使用 `commitID` 和 `getOptions`，而不是 `branch`。例如：  

     ```
     "getOptions": "commitID:bbc1ddb94...b76d3bEXAMPLE",
     ```
   + 如果选择 **S3**，则采用以下格式指定**源信息**信息：

     ```
     {"path":"URL_to_document_in_S3"}
     ```

     例如：

     ```
     {"path":"https://s3.amazonaws.com/amzn-s3-demo-bucket/scripts/ruby/mySSMdoc.json"}
     ```
   + 如果选择 **SSMDocument**，则采用以下格式指定**源信息**信息：

     ```
     {"name": "document_name"}
     ```

     例如：

     ```
     {"name": "mySSMdoc"}
     ```

1. 在 **文档参数** 字段中，输入远程 SSM 文档的参数。例如，如果运行 `AWS-RunPowerShell` 文档，则可指定：

   ```
   {"commands": ["date", "echo \"Hello World\""]}
   ```

   如果运行 `AWS-ConfigureAWSPack` 文档中，则可指定：

   ```
   {
      "action":"Install",
      "name":"AWSPVDriver"
   }
   ```

1. 在 **Targets**（目标）部分中，通过指定标签、手动选择实例或边缘设备或指定资源组，选择要在其上运行此操作的托管式节点。
**提示**  
如果未列出您希望看到的托管式节点，请参阅 [排除托管式节点可用性的问题](fleet-manager-troubleshooting-managed-nodes.md) 以获取故障排除技巧。

1. 对于 **Other parameters（其他参数）**：
   + 对于 **Comment（注释）**，请输入有关此命令的信息。
   + 对于 **Timeout (seconds) (超时 (秒))**，请指定在整个命令执行失败之前系统等待的秒数。

1. 对于 **Rate control（速率控制）**：
   + 对于 **Concurrency**（并发），请指定要同时运行该命令的托管式节点的数量或百分比。
**注意**  
如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标，但不确定有多少个托管式节点已被设为目标，则可通过指定百分比来限制可同时运行该文档的目标的数量。
   + 对于 **Error threshold**（错误阈值），请指定当命令在一定数量或百分比的节点上失败后，何时在其他托管式节点上停止运行该命令。例如，如果您指定三个错误，Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。

1. （可选）对于 **输出选项**，要将命令输出保存到文件，请选中 **将命令输出写入 S3 存储桶** 框。在输入框中输入存储桶和前缀（文件夹）名称。
**注意**  
授予将数据写入 S3 存储桶的能力的 S3 权限，是分配给实例的实例配置文件（适用于 EC2 实例）或 IAM 服务角色（混合激活的计算机）的权限，而不是执行此任务的 IAM 用户的权限。有关更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)或[为混合环境创建 IAM 服务角色](hybrid-multicloud-service-role.md)。此外，如果指定的 S3 存储桶位于不同的 AWS 账户 中，请确保与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

1. 在 **SNS 通知**部分，如果需要发送有关命令执行状态的通知，请选中 **Enable SNS notifications（启用 SNS 通知）**复选框。

   有关为 Run Command 配置 Amazon SNS 通知的更多信息，请参阅 [使用 Amazon SNS 通知监控 Systems Manager 状态更改](monitoring-sns-notifications.md)。

1. 选择 **Run（运行）**。

**注意**  
有关在使用 Run Command 调用脚本时重启服务器和实例的信息，请参阅 [运行命令时处理重启问题](send-commands-reboot.md)。

# 共享 SSM 文档
<a name="documents-ssm-sharing"></a>

您可以与同一个 AWS 区域 中的账户私下或公开共享 AWS Systems Manager (SSM) 文档。要私下共享文档，请修改文档权限并允许特定个人根据其 AWS 账户 ID 访问文档。要公开共享 SSM 文档，请修改文档权限并指定 `All` 。不能同时公开和私下共享文档。

**警告**  
请仅使用从可信来源获取的共享 SSM 文档。使用任何共享文档时，请务必在使用前仔细查看文件内容，了解它会如何更改您的实例配置。有关共享文档最佳实践的更多信息，请参阅 [共享 SSM 文档的最佳做法](#best-practices-shared)。

**限制**  
在开始使用 SSM 文档时，请注意下列限制。
+ 仅所有者可共享文档。
+ 您必须先停止共享文档，然后才能删除它。有关更多信息，请参阅 [修改共享 SSM 文档的权限](#modify-permissions-shared)。
+ 您最多可与 1000 个 AWS 账户 共享一个文档。您可以在 [支持 中心](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)中请求提高该限制。对于**限制类型**，选择 *EC2 Systems Manager * 并描述您的请求理由。
+ 您可公开共享最多 5 个 SSM 文档。您可以在 [支持支持中心](https://console.aws.amazon.com/support/home#/case/create?issueType=service-limit-increase)中请求提高该限制。对于**限制类型**，选择 *EC2 Systems Manager* 并描述您的请求理由。
+ 文档只能与同一个 AWS 区域 中的其他账户共享。不支持跨区域共享。

**重要**  
在 Systems Manager 中，*Amazon 拥有的* SSM 文档是由 Amazon Web Services 自己创建和管理的文档。*Amazon 拥有的*文档在文档名称中包含 `AWS-*` 之类的前缀。文档的所有者被视为 Amazon，而不是 AWS 内的特定用户账户。这些文档可供所有人公开使用。

有关 Systems Manager Service Quotas 的更多信息，请参阅 [AWS Systems ManagerService Quotas ](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。

**Topics**
+ [共享 SSM 文档的最佳做法](#best-practices-shared)
+ [阻止 SSM 文档的公开共享](#block-public-access)
+ [共享 SSM 文档](#ssm-how-to-share)
+ [修改共享 SSM 文档的权限](#modify-permissions-shared)
+ [使用共享 SSM 文档](#using-shared-documents)

## 共享 SSM 文档的最佳做法
<a name="best-practices-shared"></a>

在共享或使用共享文档之前，请阅读以下指南。

**删除敏感信息**  
请仔细审查您的 AWS Systems Manager (SSM) 文档并删除任何敏感信息。例如，请确保文档不包含您的 AWS 凭证。如果您与特定个人共享文档，这些用户可查看文档中的信息。如果您公开共享文档，则任何人都可查看文档中的信息。

**阻止文档的公开共享**  
查看您账户中所有公开共享的 SSM 文档，并确认是否要继续共享这些文档。要停止与公众共享文档，必须按照本主题 [修改共享 SSM 文档的权限](#modify-permissions-shared) 部分所述来修改文档权限设置。启用“阻止公开共享”设置不会影响您当前与公众共享的任何文档。除非您的应用场景需要您与公众共享文档，否则建议在 Systems Manager 文档控制台的**首选项**部分，为您的 SSM 文档开启阻止公开共享设置。启用此设置可防止对 SSM 文档进行不需要的访问。阻止公开共享设置是一个帐户级别设置，每个 AWS 区域 的设置可能不同。

**使用 IAM 信任策略限制 Run Command 操作**  
为将有权访问该文档的用户创建限制性 AWS Identity and Access Management（IAM）policy。IAM policy 确定用户可在 Amazon Elastic Compute Cloud（Amazon EC2）控制台中或通过使用 AWS Command Line Interface（AWS CLI）或 AWS Tools for Windows PowerShell 调用 `ListDocuments` 查看哪些 SSM 文档。该策略还限制用户可使用 SSM 文档执行的操作。您可创建限制性策略，以便用户只能使用特定文档。有关更多信息，请参阅 [客户管理型策略示例](security_iam_id-based-policy-examples.md#customer-managed-policies)。

**使用共享 SSM 文档时要小心**  
审查与您共享的每个文档（特别是公开文档）的内容，以了解将在您的实例上运行的命令。一个文档在运行后可能会有意或无意具有负面影响。如果文档引用外部网络，请在使用文档前审查外部源。

**使用文档哈希发送命令**  
在共享文档时，系统将创建 Sha-256 哈希并将其分配给文档。系统还将保存文档内容的快照。使用共享文档发送命令时，您可在命令中指定哈希以确保下列条件为 true：  
+ 您正在从正确的 Systems Manager 文档运行命令
+ 在与您共享之后文档内容未更改。
如果哈希与指定文档不匹配，或者共享文档的内容已更改，则命令将返回 `InvalidDocument` 异常。哈希无法验证来自外部位置的文档内容。

**使用插值参数来增强安全性**  
对于 SSM 文档中的 `String` 类型参数，可使用参数和值 `interpolationType": "ENV_VAR` 增强对命令注入攻击的防御能力，方法是将参数输入视为字符串文本值，而非可能的可执行命令。在这种情况下，代理会创建一个包含参数值的环境变量 `SSM_parameter-name`。我们建议对现有所有包含 `String` 类型参数的 SSM 文档进行更新，以纳入 `"interpolationType": "ENV_VAR"`。有关更多信息，请参阅 [编写 SSM 文档内容](documents-creating-content.md#writing-ssm-doc-content)。

## 阻止 SSM 文档的公开共享
<a name="block-public-access"></a>

开始前，请查看您 AWS 账户 中所有公开共享的 SSM 文档，并确认是否要继续共享它们。要停止与公众共享 SSM 文档，必须按照本主题 [修改共享 SSM 文档的权限](#modify-permissions-shared) 部分所述修改文档权限设置。启用“阻止公开共享”设置不会影响您当前与公众共享的任何 SSM 文档。启用“阻止公开共享”设置后，您将无法与公众共享任何其他 SSM 文档。

除非您的应用场景需要您与公众共享文档，否则我们建议为您的 SSM 文档开启阻止公开共享设置。启用此设置可防止对 SSM 文档进行不需要的访问。阻止公开共享设置是一个帐户级别设置，每个 AWS 区域 的设置可能不同。完成以下任务以阻止您目前正在共享的任何 SSM 文档的公开共享。

### 阻止公开共享（控制台）
<a name="block-public-access-console"></a>

**要阻止 SSM 文档的公开共享**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择**首选项**，然后在**阻止公开共享**部分中选择**编辑**。

1. 选择**阻止公开共享**复选框，然后选择**保存**。

### 阻止公开共享（命令行）
<a name="block-public-access-cli"></a>

打开 AWS Command Line Interface (AWS CLI）或 AWS Tools for Windows PowerShell 并运行以下命令以阻止 SSM 文档的公开共享。

------
#### [ Linux & macOS ]

```
aws ssm update-service-setting  \
    --setting-id /ssm/documents/console/public-sharing-permission \
    --setting-value Disable \
    --region 'The AWS 区域 you want to block public sharing in'
```

------
#### [ Windows ]

```
aws ssm update-service-setting ^
    --setting-id /ssm/documents/console/public-sharing-permission ^
    --setting-value Disable ^
    --region "The AWS 区域 you want to block public sharing in"
```

------
#### [ PowerShell ]

```
Update-SSMServiceSetting `
    -SettingId /ssm/documents/console/public-sharing-permission `
    -SettingValue Disable `
    –Region The AWS 区域 you want to block public sharing in
```

------

使用以下命令确认设置值已更新。

------
#### [ Linux & macOS ]

```
aws ssm get-service-setting   \
    --setting-id /ssm/documents/console/public-sharing-permission \
    --region The AWS 区域 you blocked public sharing in
```

------
#### [ Windows ]

```
aws ssm get-service-setting  ^
    --setting-id /ssm/documents/console/public-sharing-permission ^
    --region "The AWS 区域 you blocked public sharing in"
```

------
#### [ PowerShell ]

```
Get-SSMServiceSetting `
    -SettingId /ssm/documents/console/public-sharing-permission `
    -Region The AWS 区域 you blocked public sharing in
```

------

### 使用 IAM 限制访问阻止公开共享
<a name="block-public-access-changes-iam"></a>

您可以创建 AWS Identity and Access Management (IAM) 策略，这些策略限制用户修改阻止公开共享设置。这可以防止用户允许对 SSM 文档进行不需要的访问。

以下是一个 IAM policy 示例，该策略阻止用户更新阻止公开共享设置。要使用此示例，您必须将示例 Amazon Web Services 账户 ID 替换为您自己的账户 ID。

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Deny",
            "Action": "ssm:UpdateServiceSetting",
            "Resource": "arn:aws:ssm:*:444455556666:servicesetting/ssm/documents/console/public-sharing-permission"
        }
    ]
}
```

------

## 共享 SSM 文档
<a name="ssm-how-to-share"></a>

您可以通过 Systems Manager 控制台共享 AWS Systems Manager (SSM) 文档。从控制台共享文档时，只能共享文档的默认版本。您还可以通过使用 AWS Command Line Interface (AWS CLI)、 AWS Tools for Windows PowerShell 或 AWS SDK 调用 `ModifyDocumentPermission` API 操作，以编程方式共享 SSM 文档。在共享文档之前，获取要与之共享文档的人的 AWS 账户 账户 ID。您将在共享文档时指定这些账户 ID。

### 共享文档（控制台）
<a name="share-using-console"></a>

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在文档列表中，选择要共享的文档，然后选择**查看详细信息**。在**权限**选项卡中，确保您是文档所有者。只有文档所有者才可共享文档。

1. 选择**编辑**。

1. 要公开共享命令，请选择**公开**，然后选择**保存**。要私下共享命令，请选择**私有**，输入 AWS 账户 ID，选**择添加权限**，然后选择**保存**。

### 共享文档（命令行）
<a name="share-using-cli"></a>

以下过程要求您为命令行会话指定 AWS 区域。

1. 在本地计算机上打开 AWS CLI 或 AWS Tools for Windows PowerShell 并运行以下命令来指定凭证。

   在下面的命令中，将 *region* 替换为您自己的信息。有关支持的 *region* 值的列表，请参阅《Amazon Web Services 一般参考》**中的 [Systems Manager service endpoints](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region) 的 **Region** 列。

------
#### [ Linux & macOS ]

   ```
   aws config
   
   AWS Access Key ID: [your key]
   AWS Secret Access Key: [your key]
   Default region name: region
   Default output format [None]:
   ```

------
#### [ Windows ]

   ```
   aws config
   
   AWS Access Key ID: [your key]
   AWS Secret Access Key: [your key]
   Default region name: region
   Default output format [None]:
   ```

------
#### [ PowerShell ]

   ```
   Set-AWSCredentials –AccessKey your key –SecretKey your key
   Set-DefaultAWSRegion -Region region
   ```

------

1. 使用以下命令列出可供您使用的所有 SSM 文档。此列表包括您已创建的文档和与您共享的文档。

------
#### [ Linux & macOS ]

   ```
   aws ssm list-documents
   ```

------
#### [ Windows ]

   ```
   aws ssm list-documents
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentList
   ```

------

1. 使用以下命令获取特定文档。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-document \
       --name document name
   ```

------
#### [ Windows ]

   ```
   aws ssm get-document ^
       --name document name
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocument `
       –Name document name
   ```

------

1. 使用以下命令获取文档的描述。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-document \
       --name document name
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-document ^
       --name document name
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentDescription `
       –Name document name
   ```

------

1. 使用以下命令查看文档的权限。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-document-permission \
       --name document name \
       --permission-type Share
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-document-permission ^
       --name document name ^
       --permission-type Share
   ```

------
#### [ PowerShell ]

   ```
   Get-SSMDocumentPermission `
       –Name document name `
       -PermissionType Share
   ```

------

1. 使用以下命令修改文档的权限并共享文档。您必须是文档的所有者才能编辑权限。或者，对于与特定 AWS 账户 ID 共享的文档，您可以使用 `--shared-document-version` 参数指定要共享的文档的版本。如果您不指定版本，系统将共享文档的`Default`版本。如果您公开（与 `all`）共享文档，则默认共享指定文档的所有版本。以下示例命令根据特定个人的 AWS 账户 ID 与该个人私下共享文档。

------
#### [ Linux & macOS ]

   ```
   aws ssm modify-document-permission \
       --name document name \
       --permission-type Share \
       --account-ids-to-add AWS 账户 ID
   ```

------
#### [ Windows ]

   ```
   aws ssm modify-document-permission ^
       --name document name ^
       --permission-type Share ^
       --account-ids-to-add AWS 账户 ID
   ```

------
#### [ PowerShell ]

   ```
   Edit-SSMDocumentPermission `
       –Name document name `
       -PermissionType Share `
       -AccountIdsToAdd AWS 账户 ID
   ```

------

1. 使用以下命令公开共享文档。
**注意**  
如果您公开（与 `all`）共享文档，则默认共享指定文档的所有版本。

------
#### [ Linux & macOS ]

   ```
   aws ssm modify-document-permission \
       --name document name \
       --permission-type Share \
       --account-ids-to-add 'all'
   ```

------
#### [ Windows ]

   ```
   aws ssm modify-document-permission ^
       --name document name ^
       --permission-type Share ^
       --account-ids-to-add "all"
   ```

------
#### [ PowerShell ]

   ```
   Edit-SSMDocumentPermission `
       -Name document name `
       -PermissionType Share `
       -AccountIdsToAdd ('all')
   ```

------

## 修改共享 SSM 文档的权限
<a name="modify-permissions-shared"></a>

如果您共享一条命令，则在您删除对 AWS Systems Manager (SSM) 文档的访问权限或删除 SSM 文档之前，用户可查看和使用该命令。但是，只要文档已共享，您就无法删除它。您必须先停止共享，然后再删除它。

### 停止共享文档（控制台）
<a name="unshare-using-console"></a>

**停止共享文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在文档列表中，选择要停止共享的文档，然后选择**详细信息**。在**权限**部分中，确认自己是文档所有者。只有文档所有者才可停止共享文档。

1. 选择**编辑**。

1. 选择 **X** 以删除不应再具有此命令的访问权限的 AWS 账户 ID，然后选择**保存**。

### 停止共享文档（命令行）
<a name="unshare-using-cli"></a>

在本地计算机上打开 AWS CLI 或 AWS Tools for Windows PowerShell，然后运行以下命令停止共享命令。

------
#### [ Linux & macOS ]

```
aws ssm modify-document-permission \
    --name document name \
    --permission-type Share \
    --account-ids-to-remove 'AWS 账户 ID'
```

------
#### [ Windows ]

```
aws ssm modify-document-permission ^
    --name document name ^
    --permission-type Share ^
    --account-ids-to-remove "AWS 账户 ID"
```

------
#### [ PowerShell ]

```
Edit-SSMDocumentPermission `
    -Name document name `
    -PermissionType Share `
    –AccountIdsToRemove AWS 账户 ID
```

------

## 使用共享 SSM 文档
<a name="using-shared-documents"></a>

共享 AWS Systems Manager (SSM) 文档时，系统将生成一个 Amazon Resource Name (ARN) 并将其分配给命令。如果您从 Systems Manager 控制台选择并运行某个共享文档，则不会看到此 ARN。但如果您要使用 Systems Manager 控制台以外的方法运行共享 SSM 文档，则必须在 `DocumentName` 请求参数中指定文档的完整 ARN。当您运行列出文档的命令时，将为您显示 SSM 文档的完整 ARN。

**注意**  
您无需为 AWS 公有文档（以 `AWS-*` 开头的文档）或您拥有的文档指定 ARN。

### 使用共享 SSM 文档（命令行）
<a name="using-shared-documents-cli"></a>

 **列出所有公有 SSM 文档** 

------
#### [ Linux & macOS ]

```
aws ssm list-documents \
    --filters Key=Owner,Values=Public
```

------
#### [ Windows ]

```
aws ssm list-documents ^
    --filters Key=Owner,Values=Public
```

------
#### [ PowerShell ]

```
$filter = New-Object Amazon.SimpleSystemsManagement.Model.DocumentKeyValuesFilter
$filter.Key = "Owner"
$filter.Values = "Public"

Get-SSMDocumentList `
    -Filters @($filter)
```

------

 **列出已与您共享的私有 SSM 文档** 

------
#### [ Linux & macOS ]

```
aws ssm list-documents \
    --filters Key=Owner,Values=Private
```

------
#### [ Windows ]

```
aws ssm list-documents ^
    --filters Key=Owner,Values=Private
```

------
#### [ PowerShell ]

```
$filter = New-Object Amazon.SimpleSystemsManagement.Model.DocumentKeyValuesFilter
$filter.Key = "Owner"
$filter.Values = "Private"

Get-SSMDocumentList `
    -Filters @($filter)
```

------

 **列出可供您使用的所有 SSM 文档** 

------
#### [ Linux & macOS ]

```
aws ssm list-documents
```

------
#### [ Windows ]

```
aws ssm list-documents
```

------
#### [ PowerShell ]

```
Get-SSMDocumentList
```

------

 **获取有关已与您共享的 SSM 文档的信息** 

------
#### [ Linux & macOS ]

```
aws ssm describe-document \
    --name arn:aws:ssm:us-east-2:12345678912:document/documentName
```

------
#### [ Windows ]

```
aws ssm describe-document ^
    --name arn:aws:ssm:us-east-2:12345678912:document/documentName
```

------
#### [ PowerShell ]

```
Get-SSMDocumentDescription `
    –Name arn:aws:ssm:us-east-2:12345678912:document/documentName
```

------

 **运行共享的 SSM 文档** 

------
#### [ Linux & macOS ]

```
aws ssm send-command \
    --document-name arn:aws:ssm:us-east-2:12345678912:document/documentName \
    --instance-ids ID
```

------
#### [ Windows ]

```
aws ssm send-command ^
    --document-name arn:aws:ssm:us-east-2:12345678912:document/documentName ^
    --instance-ids ID
```

------
#### [ PowerShell ]

```
Send-SSMCommand `
    –DocumentName arn:aws:ssm:us-east-2:12345678912:document/documentName `
    –InstanceIds ID
```

------

# 搜索 SSM 文档
<a name="ssm-documents-searching"></a>

您可以使用自由文本搜索或基于筛选器的搜索在 AWS Systems Manager (SSM) 文档存储中搜索 SSM 文档。您还可以收藏文档，以帮助您查找常用 SSM 文档。以下部分介绍如何使用这些功能。

## 使用自由文本搜索
<a name="ssm-documents-searching-free-text"></a>

Systems Manager **文档**页面上的搜索框支持自由文本搜索。自由文本搜索会将您输入的一个或多个搜索词与每个 SSM 文档中的文档名称进行比较。如果输入单个搜索词，例如 **ansible**，然后 Systems Manager 返回发现此术语的所有 SSM 文档。如果输入多个搜索词，Systems Manager 将使用 `OR` 网页。例如，如果指定 **ansible** 和 **linux**，然后搜索将返回名称中包含*任一*关键字的所有文档。

如果输入自由文本搜索词并选择搜索选项（例如**平台类型**），则搜索将使用 `AND` 语句，并返回所有名称中包含关键字和指定平台类型的文档。

**注意**  
请注意以下有关自由文本搜索的详细信息。  
搜索*不*区分大小写。
搜索词至少需要三个字符，且最多包含 20 个字符。
自由文本搜索最多可接受五个搜索词。
如果在搜索词之间输入空格，系统会在搜索时包含空格。
您可以将自由文本搜索与其他搜索选项，如：**文档类型**或者**平台类型**结合使用。
**文档名称前缀**过滤器和自由文本搜索不能一起使用，它们是相互排斥的。

**搜索 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 在搜索框中输入搜索词，然后按输入。

### 使用 AWS CLI 执行自由文本文档搜索
<a name="ssm-documents-searching-free-text-cli"></a>

**使用 CLI 执行自由文本文档搜索**

1. 安装并配置 AWS Command Line Interface（AWS CLI）（如果尚未执行该操作）。

   有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)。

1. 要使用单个术语执行自由文本文档搜索，请运行以下命令。在此命令中，用自己的信息替换*搜索术语*。

   ```
   aws ssm list-documents --filters Key="SearchKeyword",Values="search_term"
   ```

   以下为示例。

   ```
   aws ssm list-documents --filters Key="SearchKeyword",Values="aws-asg" --region us-east-2
   ```

   要使用多个术语进行搜索，可创建 `AND` 语句，运行以下命令。在此命令中，用自己的信息替换*搜索术语 1* 和*搜索术语 2*。

   ```
   aws ssm list-documents --filters Key="SearchKeyword",Values="search_term_1","search_term_2","search_term_3" --region us-east-2
   ```

   以下为示例。

   ```
   aws ssm list-documents --filters Key="SearchKeyword",Values="aws-asg","aws-ec2","restart" --region us-east-2
   ```

## 使用筛选条件
<a name="ssm-documents-searching-filters"></a>

Systems Manager **文档**页面会在您选择搜索框时自动显示以下筛选条件。
+ 文档名称前缀
+ 平台类型
+ 文档类型
+ 标签键

![\[“SSM 文档”页面上的筛选选项。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/ssm-documents-filters-1.png)


您可以使用单个筛选条件搜索 SSM 文档。如果要返回一组更具体的 SSM 文档，可以应用多个筛选条件。下面是一个搜索示例，使用**平台类型**和**文档名称前缀**筛选条件。

![\[在 “SSM 文档” 页面上应用多个筛选器选项。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/ssm-documents-filters-2.png)


如果应用多个筛选条件，Systems Manager 会根据您选择的筛选条件创建不同的搜索语句：
+ 如果您多次应用*相同*的筛选条件，例如**文档名称前缀**，然后 Systems Manager 将使用 `OR` 语句进行搜索。例如，如果您指定一个**文档名称前缀**=**AWS** 和第二个筛选条件**文档名称前缀**=**Lambda**，然后搜索将返回带有前缀 “`AWS`” 的所有文档以及带有前缀 “`Lambda`” 的所有文档。
+ 如果您应用*其他*筛选条件，例如 **Document name prefix**（文档名称前缀）和 **Platform types**（平台类型），则 Systems Manager 将使用 `AND` 语句进行搜索。例如，如果指定 **Document name prefix**（文档名称前缀）=**AWS** 筛选条件和 **Platform types**（平台类型）=**Linux** 筛选条件，则搜索会返回特定于 Linux 平台的带有前缀“`AWS`”的所有文档。

**注意**  
使用筛选条件区分大小写。

## 将文档添加到您的收藏夹
<a name="favorite-documents"></a>

为帮助您查找常用 SSM 文档，可将文档添加到您的收藏夹。每种文档类型、每种 AWS 账户 和 AWS 区域 最多可以收藏 20 份文档。您可以从文档 AWS 管理控制台 中选择、修改和查看您的收藏夹。以下过程介绍如何选择、修改和查看您的收藏夹。

**收藏 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择您要收藏的文档名称旁边的星形图标。

**从您的收藏夹中移除 SSM 文档**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 取消选择要从您的收藏中移除的文档名称旁边的星形图标。

**从文档 AWS 管理控制台 中查看您的收藏夹**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择**文档**。

1. 选择**收藏夹**选项卡。

# 参数处理问题的疑难解答
<a name="parameter-troubleshooting"></a>

## 常见参数处理问题
<a name="common-parameter-issues"></a>

**执行期间环境变量不可用**  
**问题：**找不到环境变量 (`SSM_parameter-name`)，命令失败。  
**可能的原因：**  
+ SSM Agent 版本不支持环境变量插值
+ `interpolationType` 未设置为 `ENV_VAR`
+ 参数名称与预期的环境变量名称不匹配
**解决方案：**  
+ 验证 SSM Agent 版本是否为 3.3.2746.0 或更高
+ 为旧版代理添加回退逻辑：

  ```
  if [ -z "${SSM_parameterName+x}" ]; then
      export SSM_parameterName="{{parameterName}}"
  fi
  ```

**参数值包含特殊字符**  
**问题：**参数值包含空格、引号或其他特殊字符时会导致命令失败。  
**解决方案：**  
+ 引用环境变量时，请使用正确的引号：

  ```
  # Correct
  echo "$SSM_parameter-name"
  
  # Incorrect
  echo $SSM_parameter-name
  ```
+ 添加输入验证，使用 `allowedPattern` 来限制特殊字符

**跨平台行为不一致**  
**问题：**在 Linux 和 Windows Server 系统中，参数处理方式有所不同。  
**解决方案：**  
+ 请使用特定平台的环境变量语法：

  ```
  # PowerShell
  $env:SSM_parameter-name
  
  # Bash
  $SSM_parameter-name
  ```
+ 在文档中使用特定平台的前提条件检查

**参数值未正确转义**  
**问题：**尽管使用了环境变量插值，但仍存在命令注入的漏洞。  
**解决方案：**  
+ 在命令中包含参数值时，务必使用正确的转义：

  ```
  # Correct
  mysql_command="mysql -u \"$SSM_username\" -p\"$SSM_password\""
  
  # Incorrect
  mysql_command="mysql -u $SSM_username -p$SSM_password"
  ```

## 参数验证提示
<a name="parameter-validation"></a>

使用这些方法验证参数处理：

1. 测试环境变量的可用性：

   ```
   #!/bin/bash
   # Print all SSM_ environment variables
   env | grep ^SSM_
   
   # Test specific parameter
   if [ -n "$SSM_parameter" ]; then
       echo "Parameter is available"
   else
       echo "Parameter is not available"
   fi
   ```

1. 验证参数模式：

   ```
   parameters:
     myParameter:
       type: String
       allowedPattern: "^[a-zA-Z0-9_-]+$"
       description: "Test this pattern with sample inputs"
   ```

1. 包含错误处理：

   ```
   if [[ ! "$SSM_parameter" =~ ^[a-zA-Z0-9_-]+$ ]]; then
       echo "Parameter validation failed"
       exit 1
   fi
   ```

# AWS Systems Manager Maintenance Windows
<a name="maintenance-windows"></a>

Maintenance Windows（AWS Systems Manager 中的一项工具）可帮助您制定计划，规定何时在节点上执行可能造成中断的操作，例如修补操作系统、更新驱动程序或者安装软件或补丁。

**注意**  
State Manager 和 Maintenance Windows 可在托管式节点上执行一些相似类型的更新。您选择哪一项取决于您是需要自动执行系统合规性，还是在指定的时间段内执行高优先级、时效性强的任务。  
有关更多信息，请参阅 [在 State Manager 和 Maintenance Windows 之间选择](state-manager-vs-maintenance-windows.md)。

借助 Maintenance Windows，您可以为许多其他类型的 AWS 资源（例如 Amazon Simple Storage Service (Amazon S3) 存储桶、Amazon Simple Queue Service (Amazon SQS) 队列、AWS Key Management Service (AWS KMS) 键等等）上的操作制定计划。

有关可以包含在维护时段目标中的受支持资源类型的完整列表，请参阅 *AWS Resource Groups 用户指南*中的[可与 AWS Resource Groups 和标签编辑器结合使用的资源](https://docs.aws.amazon.com/ARG/latest/userguide/supported-resources.html#supported-resources-console)。要开始使用 Maintenance Windows，请打开 [Systems Manager 控制台](https://console.aws.amazon.com//systems-manager/maintenance-windows)。在导航窗格中，请选择 **Maintenance Windows**。

每个维护时段都有一个计划、一段最大持续时间、一组已注册的目标（要对其执行操作的托管式节点或其他 AWS 资源）和一组已注册的任务。在创建或更新维护时段时，您可以向其添加标签。（标签是帮助您在组织中识别和排序资源的键。） 您还可以指定维护时段在某天之前或之后不应运行，以及维护时段计划所基于的国际时区。

有关维护时段的各种计划相关选项如何相互关联的说明，请参阅 [维护时段计划和活动期间选项](maintenance-windows-schedule-options.md)。

有关使用 `--schedule` 选项的更多信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

**受支持的任务类型**  
对于维护时段，可运行四种类型的任务：
+ Run Command（Systems Manager 中的一项工具）中的命令

  有关 Run Command的更多信息，请参阅[AWS Systems Manager Run Command](run-command.md)。
+ Automation（Systems Manager 中的一项工具）中的工作流

  有关 自动化 工作流的更多信息，请参阅 [AWS Systems Manager 自动化](systems-manager-automation.md)。
+ AWS Lambda 中的函数

  有关 Lambda 函数的更多信息，请参阅 *AWS Lambda 开发人员指南*中的 [Lambda 入门](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html)。
+ AWS Step Functions 中的任务
**注意**  
维护时段任务仅支持 Step Functions 标准状态机工作流。它们不支持快速状态机工作流。有关状态机工作流类型的信息，请参阅《AWS Step Functions 开发人员指南》**中的[标准与快速工作流](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html)。

  有关 Step Functions 的更多信息，请参阅*《[AWS Step Functions 开发人员指南》](https://docs.aws.amazon.com/step-functions/latest/dg/)*。

这意味着，您可以使用维护时段在选定目标上执行类似以下内容的任务。
+ 安装或更新应用程序。
+ 应用补丁。
+ 安装或更新 SSM Agent。
+ 使用 Systems Manager Run Command 任务运行 PowerShell 命令和 Linux Shell 脚本。
+ 使用 Systems Manager 自动化任务构建 Amazon Machine Images (AMIs)、引导软件，以及配置节点。
+ 运行调用其他操作（例如扫描您的节点是否有补丁更新）的 AWS Lambda 函数。
+ 运行 AWS Step Functions 状态机以执行多项任务，例如删除 Elastic Load Balancing 环境中的某个节点，修补该节点，然后再将该节点添加回 Elastic Load Balancing 环境。
+ 通过将 AWS 资源组指定为目标，将离线节点设为目标。

**注意**  
必须为维护时段 Run Command 类型的任务指定一个或多个目标。根据任务的不同，目标对于其他维护时段任务类型（自动化、AWS Lambda 和 AWS Step Functions）是可选的。有关运行未指定目标的任务的更多信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

**EventBridge 支持**  
支持此 Systems Manager 工具作为 Amazon EventBridge 规则中的一个*事件*类型。有关信息，请参阅 [使用 Amazon EventBridge 监控 Systems Manager 事件](monitoring-eventbridge-events.md)和 [引用：Amazon EventBridge 事件模式和 Systems Manager 类型](reference-eventbridge-events.md)。

**Topics**
+ [设置 Maintenance Windows](setting-up-maintenance-windows.md)
+ [使用控制台创建和管理维护时段](sysman-maintenance-working.md)
+ [教程](maintenance-windows-tutorials.md)
+ [注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)
+ [维护时段计划和活动期间选项](maintenance-windows-schedule-options.md)
+ [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)
+ [对维护时段进行故障排除](troubleshooting-maintenance-windows.md)

# 设置 Maintenance Windows
<a name="setting-up-maintenance-windows"></a>

您 AWS 账户中的用户必须先获得必要权限，然后才能使用 Maintenance Windows（AWS Systems Manager 中的一项工具）创建和计划维护时段任务。此外，您必须为维护时段创建 IAM 服务角色，以及要附加到该角色的 IAM 策略。

**开始前的准备工作**  
除了您在本部分中配置的权限外，将在维护时段中使用的 IAM 实体（用户、角色或组）应该已经拥有常规维护时段权限。您可以通过将 IAM 策略 `AmazonSSMFullAccess` 分配给实体，或者分配一个自定义 IAM 策略来授予这些权限，自定义 IAM 策略可为处理维护时段任务的 Systems Manager 提供一组较小的访问权限集。

**Topics**
+ [使用控制台控制对维护时段的访问权限](configuring-maintenance-window-permissions-console.md)
+ [使用 AWS CLI 控制对维护时段的访问权限](configuring-maintenance-window-permissions-cli.md)

# 使用控制台控制对维护时段的访问权限
<a name="configuring-maintenance-window-permissions-console"></a>

以下过程介绍如何使用 AWS Systems Manager 控制台为维护时段创建所需的权限和角色。

**Topics**
+ [任务 1：使用控制台为维护时段服务角色创建自定义策略](#create-custom-policy-console)
+ [任务 2：使用控制台为维护时段创建自定义服务角色](#create-custom-role-console)
+ [任务 3：使用控制台向注册维护时段任务的特定用户授予权限](#allow-maintenance-window-access-console)
+ [任务 4：使用控制台阻止指定用户注册维护时段任务](#deny-maintenance-window-access-console)

## 任务 1：使用控制台为维护时段服务角色创建自定义策略
<a name="create-custom-policy-console"></a>

维护时段任务需要一个 IAM 角色才能提供在目标资源上运行所需的权限。通过附加到角色的 IAM 策略提供权限。您运行的任务类型和其他操作要求决定了此策略的内容。我们提供了一个基本策略，您可以根据需要进行调整。根据维护时段运行的任务和任务类型，您可能不需要此策略中的所有权限，并且可能需要包含额外的权限。您需要将此策略附加到您稍后在[任务 2：使用控制台为维护时段创建自定义服务角色](#create-custom-role-console)中创建的角色。

**要使用控制台创建自定义策略**

1. 访问：[https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/)，打开 IAM 控制台。

1. 在导航窗格中，选择 **Policies (策略)**，然后选择 **Create policy (创建策略)**。

1. 在**策略编辑器**区域中，选择 **JSON**。

1. 将默认内容替换为以下内容：

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:SendCommand",
                   "ssm:CancelCommand",
                   "ssm:ListCommands",
                   "ssm:ListCommandInvocations",
                   "ssm:GetCommandInvocation",
                   "ssm:GetAutomationExecution",
                   "ssm:StartAutomationExecution",
                   "ssm:ListTagsForResource",
                   "ssm:DescribeInstanceInformation",
                   "ssm:GetParameters"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "states:DescribeExecution",
                   "states:StartExecution"
               ],
               "Resource": [
                   "arn:aws:states:*:*:execution:*:*",
                   "arn:aws:states:*:*:stateMachine:*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": [
                   "arn:aws:lambda:*:*:function:*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "resource-groups:ListGroups",
                   "resource-groups:ListGroupResources"
               ],
               "Resource": [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "tag:GetResources"
               ],
               "Resource": [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::111122223333:role/maintenance-window-role-name",
               "Condition": {
                   "StringEquals": {
                       "iam:PassedToService": [
                           "ssm.amazonaws.com"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 根据需要为您在账户中运行的维护任务修改 JSON 内容。您做出的更改是特定于所计划操作的。

   例如：
   + 您可以提供特定功能和状态机的 Amazon 资源名称（ARN），而不是使用通配符（\$1）。
   + 如果您不计划运行 AWS Step Functions 任务，则可以移除 `states` 权限和 ARN。
   + 如果您不计划运行 AWS Lambda 任务，则可以移除 `lambda` 权限和 ARN。
   + 如果您不计划运行自动化任务，则可以移除 `ssm:GetAutomationExecution` 和 `ssm:StartAutomationExecution` 权限。
   + 添加要运行的任务可能需要的其他权限。例如，一些 自动化 操作使用 AWS CloudFormation 堆栈。因此，权限 `cloudformation:CreateStack`、`cloudformation:DescribeStacks` 和 `cloudformation:DeleteStack` 是必需的。

     另一个示例：自动化运行手册 `AWS-CopySnapshot` 需要权限来创建 Amazon Elastic Block Store（Amazon EBS）快照，因此，服务角色需要权限 `ec2:CreateSnapshot`。

     有关自动化运行手册所需角色权限的信息，请参阅 [AWS Systems Manager 自动化运行手册参考](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-runbook-reference.html)中的运行手册描述。

1. 完成策略修订后，选择**下一步**。

1. 对于**策略名称**，输入一个名称以将此标识为您创建的服务角色所附加的策略。例如：**my-maintenance-window-role-policy**。

1. （可选）在**添加标签**区域中，添加一个或多个标签键值对，以组织、跟踪或控制此策略的访问权限。

1. 选择**创建策略**。

   记下为此策略指定的名称。您将在下一过程[任务 2：使用控制台为维护时段创建自定义服务角色](#create-custom-role-console)中引用它。

## 任务 2：使用控制台为维护时段创建自定义服务角色
<a name="create-custom-role-console"></a>

您在上一个任务中创建的策略将附加到您在此任务中创建的维护时段服务角色。当用户注册维护时段任务时，他们需要在任务配置中指定此 IAM 角色。此角色中的权限将允许 Systems Manager 代表您运行维护时段中的任务。

**重要**  
以前，Systems Manager 控制台允许您选择 AWS 托管式 IAM 服务相关角色 `AWSServiceRoleForAmazonSSM`，以用作任务的维护角色。现在不再建议将此角色及其相关策略 `AmazonSSMServiceRolePolicy` 用于维护时段任务。如果您目前在将此角色用于维护时段任务，我们建议您停止使用它。而应创建您自己的 IAM 角色，以便您的维护时段任务运行时在 Systems Manager 与其他 AWS 服务之间进行通信。

使用以下过程为 Maintenance Windows 创建自定义服务角色，以便 Systems Manager 可以代表您运行 Maintenance Windows 任务。您会将您在上一任务中创建的策略附加到您创建的自定义服务角色。

**要使用控制台为维护时段创建自定义服务角色**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**角色**，然后选择**创建角色**。

1. 对于 **Select trusted entity**（选择可信实体），完成以下选择：

   1. 在**可信实体类型**中选择 **AWS 服务**。

   1. 对于**应用场景**，选择 **Systems Manager**

   1. 选择 **Systems Manager**。

      下图突出显示了 Systems Manager 选项的位置。  
![\[Systems Manager 是用例的选项之一。\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/images/iam_use_cases_for_MWs.png)

1. 选择**下一步**。

1. 在**权限策略**区域中的搜索框中，输入您在 [任务 1：使用控制台为维护时段服务角色创建自定义策略](#create-custom-policy-console) 中创建的策略的名称，选中其名称旁边的复选框，然后选择**下一步**。

1. 对于 **Role name**（角色名称），输入用于将此角色标识为 Maintenance Windows 角色的名称。例如：**my-maintenance-window-role**。

1. （可选）更改默认角色描述，以反映此角色的用途。例如：**Performs maintenance window tasks on your behalf**。

1. 对于**步骤 1：选择可信实体**，请确认**可信策略**框中显示了以下策略。

------
#### [ JSON ]

****  

   ```
   {
     "Version":"2012-10-17",		 	 	 
     "Statement": [
       {
         "Sid": "",
         "Effect": "Allow",
         "Principal": {
           "Service": "ssm.amazonaws.com"
         },
         "Action": "sts:AssumeRole"
       }
     ]
   }
   ```

------

1. 对于**步骤 2：添加权限**，请验证您在 [任务 1：使用控制台为维护时段服务角色创建自定义策略](#create-custom-policy-console) 中创建的策略是否已存在。

1. （可选）在**步骤 3：添加标签**中，添加一个或多个标签键值对，以组织、跟踪或控制此角色的访问权限。

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

1. 选择刚才创建的 IAM 角色的名称。

1. 复制或记下在 **Summary**（摘要）区域显示的角色名称和 **ARN** 值。您账户中的用户在创建维护时段时需要指定此信息。

## 任务 3：使用控制台向注册维护时段任务的特定用户授予权限
<a name="allow-maintenance-window-access-console"></a>

为用户提供访问自定义维护时段服务角色的权限，使他们可以将该角色用于维护时段任务。这是对已授予权限的补充，以便与适用于 Maintenance Windows 工具的 Systems Manager API 命令结合使用。此 IAM 角色传递了运行维护时段任务所需的权限。因此，如果无法传递这些 IAM 权限，用户将无法使用您的自定义服务角色向维护时段注册任务。

在将任务注册到维护时段时，您可以指定服务角色来运行实际任务操作。这是代表您运行任务时服务要代入的角色。在此之前，要注册任务本身，请将 IAM `PassRole` 策略分配给 IAM 实体（如用户或组）。这将允许 IAM 实体指定运行任务时应使用的角色，作为将这些任务注册到维护时段的一部分。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予将角色传递给 AWS 服务 的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**要配置权限以允许用户注册维护时段任务**

如果将 IAM 实体（用户、角色或组）设置为拥有管理员权限，则 IAM 用户或角色将有权访问维护时段。对于没有管理员权限的 IAM 实体，管理员必须向 IAM 实体授予以下权限。以下是将任务注册到维护时段所需的最低权限：
+ `AmazonSSMFullAccess` 托管策略，或提供类似权限的策略。
+ 以下 `iam:PassRole` 和 `iam:ListRoles` 权限。

------
#### [ JSON ]

****  

  ```
  {
      "Version":"2012-10-17",		 	 	 
      "Statement": [
          {
              "Effect": "Allow",
              "Action": "iam:PassRole",
              "Resource": "arn:aws:iam::111122223333:role/my-maintenance-window-role"
          },
          {
              "Effect": "Allow",
              "Action": "iam:ListRoles",
              "Resource": "arn:aws:iam::111122223333:role/"
          },
          {
              "Effect": "Allow",
              "Action": "iam:ListRoles",
              "Resource": "arn:aws:iam::111122223333:role/aws-service-role/ssm.amazonaws.com/"
          }
      ]
  }
  ```

------

  *my-maintenance-window-role* 表示您之前创建的自定义维护时段服务角色的名称。

  *account-id* 表示 AWS 账户 的 ID。为资源 `arn:aws:iam::account-id:role/` 添加此权限允许用户在创建维护时段任务时在控制台中查看和选择客户角色。为 `arn:aws:iam::account-id:role/aws-service-role/ssm.amazonaws.com/` 添加此权限允许用户在创建维护时段任务时在控制台中选择 Systems Manager 服务相关角色。

  要提供访问权限，请为您的用户、组或角色添加权限：
  + AWS IAM Identity Center 中的用户和群组：

    创建权限集合。按照《AWS IAM Identity Center 用户指南》**中[创建权限集](https://docs.aws.amazon.com//singlesignon/latest/userguide/howtocreatepermissionset.html)的说明进行操作。
  + 通过身份提供者在 IAM 中托管的用户：

    创建适用于身份联合验证的角色。按照《IAM 用户指南》**中[针对第三方身份提供者创建角色（联合身份验证）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-idp.html)的说明进行操作。
  + IAM 用户：
    + 创建您的用户可以担任的角色。按照《IAM 用户指南》**中[为 IAM 用户创建角色](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_roles_create_for-user.html)的说明进行操作。
    + （不推荐使用）将策略直接附加到用户或将用户添加到用户组。按照《IAM 用户指南》**中[向用户添加权限（控制台）](https://docs.aws.amazon.com//IAM/latest/UserGuide/id_users_change-permissions.html#users_change_permissions-add-console)中的说明进行操作。

**要使用控制台为已获允许注册维护时段任务的组配置权限**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户组**。

1. 在组列表中，选择要将 `iam:PassRole` 权限分配到的组的名称，或在需要时先创建一个新组 

1. 在 **Permissions**（权限）选项卡上，请选择 **Add permissions, Create inline policy**（添加权限、创建内联策略）。

1. 在**策略编辑器**区域中，选择 **JSON**，然后将方框的默认内容替换为以下内容。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::111122223333:role/my-maintenance-window-role"
           },
           {
               "Effect": "Allow",
               "Action": "iam:ListRoles",
               "Resource": "arn:aws:iam::111122223333:role/"
           },
           {
               "Effect": "Allow",
               "Action": "iam:ListRoles",
               "Resource": "arn:aws:iam::111122223333:role/aws-service-role/ssm.amazonaws.com/"
           }
       ]
   }
   ```

------

   *my-maintenance-window-role* 表示您之前创建的自定义维护时段角色的名称。

   *account-id* 表示 AWS 账户 的 ID。为资源 `arn:aws:iam::account-id:role/` 添加此权限允许用户在创建维护时段任务时在控制台中查看和选择客户角色。为 `arn:aws:iam::account-id:role/aws-service-role/ssm.amazonaws.com/` 添加此权限允许用户在创建维护时段任务时在控制台中选择 Systems Manager 服务相关角色。

1. 选择**下一步**。

1. 在**查看和创建**页面上的**策略名称**框中，输入名称以标识此 `PassRole` 策略，例如 **my-group-iam-passrole-policy**，然后选择**创建策略**。

## 任务 4：使用控制台阻止指定用户注册维护时段任务
<a name="deny-maintenance-window-access-console"></a>

对于您的 AWS 账户中您不希望其将任务注册到维护时段的用户，您可以拒绝向其授予 `ssm:RegisterTaskWithMaintenanceWindow` 权限。这将提供额外的防护，从而阻止不应注册维护时段任务的用户。

**要使用控制台为不允许注册维护时段任务的组配置权限**

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中，选择**用户组**。

1. 在组列表中，选择要从中拒绝 `ssm:RegisterTaskWithMaintenanceWindow` 权限的组的名称，或在需要时先创建一个新组。

1. 在 **Permissions**（权限）选项卡上，请选择 **Add permissions, Create inline policy**（添加权限、创建内联策略）。

1. 在**策略编辑器**区域中，选择 **JSON**，然后将方框的默认内容替换为以下内容。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": "ssm:RegisterTaskWithMaintenanceWindow",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 选择**下一步**。

1. 在**查看和创建**页面上，对于**策略名称**，输入名称以标识此策略，例如 **my-groups-deny-mw-tasks-policy**，然后选择**创建策略**。

# 使用 AWS CLI 控制对维护时段的访问权限
<a name="configuring-maintenance-window-permissions-cli"></a>

以下过程介绍如何使用 AWS Command Line Interface（AWS CLI）为 Maintenance Windows（AWS Systems Manager 中的一项工具）创建所需的角色和权限。

**Topics**
+ [任务 1：以 JSON 格式创建信任策略和客户管理型策略](#create-custom-policy-json-files-cli)
+ [任务 2：使用 AWS CLI 为维护时段创建和验证自定义服务角色](#create-custom-role-cli)
+ [任务 3：使用 AWS CLI 向注册维护时段任务的特定用户授予权限](#allow-maintenance-window-access-cli)
+ [任务 4：使用 AWS CLI 阻止指定用户注册维护时段任务](#deny-maintenance-window-access-cli)

## 任务 1：以 JSON 格式创建信任策略和客户管理型策略
<a name="create-custom-policy-json-files-cli"></a>

维护时段任务需要一个 IAM 角色才能提供在目标资源上运行所需的权限。通过附加到角色的 IAM 策略提供权限。您运行的任务类型和其他操作要求决定了此策略的内容。我们提供了一个基本策略，您可以根据需要进行调整。根据维护时段运行的任务和任务类型，您可能不需要此策略中的所有权限，并且可能需要包含额外的权限。

在此任务中，您可以在一对 JSON 文件中指定自定义维护时段角色所需的权限。您需要将此策略附加到您稍后在[任务 2：使用 AWS CLI 为维护时段创建和验证自定义服务角色](#create-custom-role-cli)中创建的角色。

**要创建信任策略和客户管理型策略文件**

1. 将以下信任策略复制并粘贴到文本文件中。使用以下名称和文件扩展名保存此文件：**mw-role-trust-policy.json**。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "ssm.amazonaws.com"
               },
               "Action": "sts:AssumeRole"
           }
       ]
   }
   ```

------

1. 将以下 JSON 策略复制并粘贴到另一个文本文件中。在您创建第一个文件的同一目录中，使用以下名称和文件扩展名保存此文件：**mw-role-custom-policy.json**。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ssm:SendCommand",
                   "ssm:CancelCommand",
                   "ssm:ListCommands",
                   "ssm:ListCommandInvocations",
                   "ssm:GetCommandInvocation",
                   "ssm:GetAutomationExecution",
                   "ssm:StartAutomationExecution",
                   "ssm:ListTagsForResource",
                   "ssm:GetParameters"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "states:DescribeExecution",
                   "states:StartExecution"
               ],
               "Resource": [
                   "arn:aws:states:*:*:execution:*:*",
                   "arn:aws:states:*:*:stateMachine:*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "lambda:InvokeFunction"
               ],
               "Resource": [
                   "arn:aws:lambda:*:*:function:*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "resource-groups:ListGroups",
                   "resource-groups:ListGroupResources"
               ],
               "Resource": [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": [
                   "tag:GetResources"
               ],
               "Resource": [
                   "*"
               ]
           },
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::111122223333:role/maintenance-window-role-name",
               "Condition": {
                   "StringEquals": {
                       "iam:PassedToService": [
                           "ssm.amazonaws.com"
                       ]
                   }
               }
           }
       ]
   }
   ```

------

1. 根据需要为您在账户中运行的维护任务修改 `mw-role-custom-policy.json` 的内容。您做出的更改是特定于所计划操作的。

   例如：
   + 您可以提供特定功能和状态机的 Amazon 资源名称（ARN），而不是使用通配符（\$1）。
   + 如果您不计划运行 AWS Step Functions 任务，则可以移除 `states` 权限和 ARN。
   + 如果您不计划运行 AWS Lambda 任务，则可以移除 `lambda` 权限和 ARN。
   + 如果您不计划运行自动化任务，则可以移除 `ssm:GetAutomationExecution` 和 `ssm:StartAutomationExecution` 权限。
   + 添加要运行的任务可能需要的其他权限。例如，一些 自动化 操作使用 AWS CloudFormation 堆栈。因此，权限 `cloudformation:CreateStack`、`cloudformation:DescribeStacks` 和 `cloudformation:DeleteStack` 是必需的。

     另一个示例：自动化运行手册 `AWS-CopySnapshot` 需要权限来创建 Amazon Elastic Block Store（Amazon EBS）快照，因此，服务角色需要权限 `ec2:CreateSnapshot`。

     有关自动化运行手册所需角色权限的信息，请参阅 [AWS Systems Manager 自动化运行手册参考](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-runbook-reference.html)中的运行手册描述。

   进行任何需要的更改后，请再次保存该文件。

## 任务 2：使用 AWS CLI 为维护时段创建和验证自定义服务角色
<a name="create-custom-role-cli"></a>

您在上一个任务中创建的策略将附加到您在此任务中创建的维护时段服务角色。当用户注册维护时段任务时，他们需要在任务配置中指定此 IAM 角色。此角色中的权限将允许 Systems Manager 代表您运行维护时段中的任务。

**重要**  
以前，Systems Manager 控制台允许您选择 AWS 托管式 IAM 服务相关角色 `AWSServiceRoleForAmazonSSM`，以用作任务的维护角色。现在不再建议将此角色及其相关策略 `AmazonSSMServiceRolePolicy` 用于维护时段任务。如果您目前在将此角色用于维护时段任务，我们建议您停止使用它。而应创建您自己的 IAM 角色，以便您的维护时段任务运行时在 Systems Manager 与其他 AWS 服务之间进行通信。

在此任务中，您将运行 CLI 命令来创建维护窗口服务角色，以添加您创建的 JSON 文件中的策略内容。

**使用 AWS CLI 为维护时段创建自定义服务角色**

1. 打开 AWS CLI 并在放置 `mw-role-custom-policy.json` 和 `mw-role-trust-policy.json` 文件的目录中运行以下命令。该命令创建一个名为 `my-maintenance-window-role` 的维护时段服务角色，并将*信任策略*附加到该角色上。

------
#### [ Linux & macOS ]

   ```
   aws iam create-role \
       --role-name "my-maintenance-window-role" \
       --assume-role-policy-document file://mw-role-trust-policy.json
   ```

------
#### [ Windows ]

   ```
   aws iam create-role ^
       --role-name "my-maintenance-window-role" ^
       --assume-role-policy-document file://mw-role-trust-policy.json
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "Role": {
           "AssumeRolePolicyDocument": {
               "Version": "2012-10-17", 		 	 	 		 	 	 
               "Statement": [
                   {
                       "Action": "sts:AssumeRole",
                       "Effect": "Allow",
                       "Principal": {
                           "Service": "ssm.amazonaws.com"
                       }
                   }
               ]
           },
           "RoleId": "AROAIIZKPBKS2LEXAMPLE",
           "CreateDate": "2024-08-19T03:40:17.373Z",
           "RoleName": "my-maintenance-window-role",
           "Path": "/",
           "Arn": "arn:aws:iam::123456789012:role/my-maintenance-window-role"
       }
   }
   ```
**注意**  
记下 `RoleName` 和 `Arn` 值。您将在下一命令中包含这些值。

1. 运行以下命令以将*客户管理型策略*附加到角色。请将 *account-id* 占位符替换为您自己的 AWS 账户 ID

------
#### [ Linux & macOS ]

   ```
   aws iam attach-role-policy \
       --role-name "my-maintenance-window-role" \
       --policy-arn "arn:aws:iam::account-id:policy/mw-role-custom-policy.json"
   ```

------
#### [ Windows ]

   ```
   aws iam attach-role-policy ^
       --role-name "my-maintenance-window-role" ^
       --policy-arn "arn:aws:iam::account-id:policy/mw-role-custom-policy.json"
   ```

------

1. 运行以下命令验证您的角色是否已创建，且已附加信任策略。

   ```
   aws iam get-role --role-name my-maintenance-window-role
   ```

   命令返回类似于下文的信息：

   ```
   {
       "Role": {
           "Path": "/",
           "RoleName": "my-maintenance-window-role",
           "RoleId": "AROA123456789EXAMPLE",
           "Arn": "arn:aws:iam::123456789012:role/my-maintenance-window-role",
           "CreateDate": "2024-08-19T14:13:32+00:00",
           "AssumeRolePolicyDocument": {
               "Version": "2012-10-17", 		 	 	 		 	 	 
               "Statement": [
                   {
                       "Effect": "Allow",
                       "Principal": {
                           "Service": "ssm.amazonaws.com"
                       },
                       "Action": "sts:AssumeRole"
                   }
               ]
           },
           "MaxSessionDuration": 3600,
           "RoleLastUsed": {
               "LastUsedDate": "2024-08-19T14:30:44+00:00",
               "Region": "us-east-2"
           }
       }
   }
   ```

1. 运行以下命令以验证客户管理型策略是否已附加到角色。

   ```
   aws iam list-attached-role-policies --role-name my-maintenance-window-role
   ```

   命令返回类似于下文的信息：

   ```
   {
       "AttachedPolicies": [
           {
               "PolicyName": "mw-role-custom-policy",
               "PolicyArn": "arn:aws:iam::123456789012:policy/mw-role-custom-policy"
           }
       ]
   }
   ```

## 任务 3：使用 AWS CLI 向注册维护时段任务的特定用户授予权限
<a name="allow-maintenance-window-access-cli"></a>

为用户提供访问自定义维护时段服务角色的权限，使他们可以将该角色用于维护时段任务。这是对已授予权限的补充，以便与适用于 Maintenance Windows 工具的 Systems Manager API 命令结合使用。此 IAM 角色传递了运行维护时段任务所需的权限。因此，如果无法传递这些 IAM 权限，用户将无法使用您的自定义服务角色向维护时段注册任务。

在将任务注册到维护时段时，您可以指定服务角色来运行实际任务操作。这是代表您运行任务时服务要代入的角色。在此之前，要注册任务本身，请将 IAM `PassRole` 策略分配给 IAM 实体（如用户或组）。这将允许 IAM 实体指定运行任务时应使用的角色，作为将这些任务注册到维护时段的一部分。有关更多信息，请参阅《IAM 用户指南》**中的[向用户授予将角色传递给 AWS 服务 的权限](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_use_passrole.html)。

**使用 AWS CLI 为已获允许注册维护时段任务的用户配置权限**

1. 将以下 AWS Identity and Access Management IAM 策略复制并粘贴到文本编辑器中，然后使用以下名称和文件扩展名保存：`mw-passrole-policy.json`。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": "iam:PassRole",
               "Resource": "arn:aws:iam::111122223333:role/my-maintenance-window-role"
           },
           {
               "Effect": "Allow",
               "Action": "iam:ListRoles",
               "Resource": "arn:aws:iam::111122223333:role/"
           },
           {
               "Effect": "Allow",
               "Action": "iam:ListRoles",
               "Resource": "arn:aws:iam::111122223333:role/aws-service-role/ssm.amazonaws.com/"
           }
       ]
   }
   ```

------

   将 *my-maintenance-window-role* 替换为您之前创建的自定义维护时段角色的名称。

   将 *account-id* 替换为 AWS 账户 的 ID。为资源 `arn:aws:iam::account-id:role/` 添加此权限允许组中的用户在创建维护时段任务时在控制台中查看和选择客户角色。为 `arn:aws:iam::account-id:role/aws-service-role/ssm.amazonaws.com/` 添加此权限允许组中的用户在创建维护时段任务时在控制台中选择 Systems Manager 服务相关角色。

1. 打开 AWS CLI。

1. 根据您是否要将权限分配到 IAM 实体（用户或组），运行以下命令之一。
   + **对于 IAM 实体：**

------
#### [ Linux & macOS ]

     ```
     aws iam put-user-policy \
         --user-name "user-name" \
         --policy-name "policy-name" \
         --policy-document file://path-to-document
     ```

------
#### [ Windows ]

     ```
     aws iam put-user-policy ^
         --user-name "user-name" ^
         --policy-name "policy-name" ^
         --policy-document file://path-to-document
     ```

------

     对于 *user-name*，请指定将向维护时段分配任务的用户。对于 *policy-name*，请指定要用于标识策略的名称，如 **my-iam-passrole-policy**。对于 *path-to-document*，请指定步骤 1 中保存文件的路径。例如：`file://C:\Temp\mw-passrole-policy.json`
**注意**  
要授予用户使用 Systems Manager 控制台为维护时段注册任务的访问权限，您还必须将 `AmazonSSMFullAccess` 策略分配给您的用户（或为涵盖维护时段任务的 Systems Manager 提供较小访问权限集的 IAM 策略）。运行以下命令将 `AmazonSSMFullAccess` 策略分配给您的用户。  

     ```
     aws iam attach-user-policy \
         --policy-arn "arn:aws:iam::aws:policy/AmazonSSMFullAccess" \
         --user-name "user-name"
     ```

     ```
     aws iam attach-user-policy ^
         --policy-arn "arn:aws:iam::aws:policy/AmazonSSMFullAccess" ^
         --user-name "user-name"
     ```
   + **对于 IAM 组**：

------
#### [ Linux & macOS ]

     ```
     aws iam put-group-policy \
         --group-name "group-name" \
         --policy-name "policy-name" \
         --policy-document file://path-to-document
     ```

------
#### [ Windows ]

     ```
     aws iam put-group-policy ^
         --group-name "group-name" ^
         --policy-name "policy-name" ^
         --policy-document file://path-to-document
     ```

------

     对于 *group-name*，指定其成员将向维护时段分配任务的组。对于 *policy-name*，请指定要用于标识策略的名称，如 **my-iam-passrole-policy**。对于 *path-to-document*，请指定步骤 1 中保存文件的路径。例如：`file://C:\Temp\mw-passrole-policy.json`。
**注意**  
要授予组成员使用 Systems Manager 控制台为维护时段注册任务的访问权限，还必须将 `AmazonSSMFullAccess` 策略分配给组。运行以下命令将此策略分配给您的组。  

     ```
     aws iam attach-group-policy \
         --policy-arn "arn:aws:iam::aws:policy/AmazonSSMFullAccess" \
         --group-name "group-name"
     ```

     ```
     aws iam attach-group-policy ^
         --policy-arn "arn:aws:iam::aws:policy/AmazonSSMFullAccess" ^
         --group-name "group-name"
     ```

1. 运行以下命令验证策略是否已分配给该组。

------
#### [ Linux & macOS ]

   ```
   aws iam list-group-policies \
       --group-name "group-name"
   ```

------
#### [ Windows ]

   ```
   aws iam list-group-policies ^
       --group-name "group-name"
   ```

------

## 任务 4：使用 AWS CLI 阻止指定用户注册维护时段任务
<a name="deny-maintenance-window-access-cli"></a>

对于您的 AWS 账户中您不希望其将任务注册到维护时段的用户，您可以拒绝向其授予 `ssm:RegisterTaskWithMaintenanceWindow` 权限。这将提供额外的防护，从而阻止不应注册维护时段任务的用户。

根据您是拒绝向单个用户还是组授予 `ssm:RegisterTaskWithMaintenanceWindow` 权限，使用以下过程之一，阻止用户将任务注册到维护时段。

**要使用 AWS CLI 为不允许注册维护时段任务的用户配置权限**

1. 将以下 IAM 策略复制并粘贴到文本编辑器中，然后使用以下名称和文件扩展名保存：**deny-mw-tasks-policy.json**。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Deny",
               "Action": "ssm:RegisterTaskWithMaintenanceWindow",
               "Resource": "*"
           }
       ]
   }
   ```

------

1. 打开 AWS CLI。

1. 根据您是否要将权限分配到 IAM 实体（用户或组），运行以下命令之一。
   + **对于用户：**

------
#### [ Linux & macOS ]

     ```
     aws iam put-user-policy \
         --user-name "user-name" \
         --policy-name "policy-name" \
         --policy-document file://path-to-document
     ```

------
#### [ Windows ]

     ```
     aws iam put-user-policy ^
         --user-name "user-name" ^
         --policy-name "policy-name" ^
         --policy-document file://path-to-document
     ```

------

     对于 *user-name*，请指定要阻止其向维护时段分配任务的用户。对于 *policy-name*，请指定要用于标识策略的名称，如 **my-deny-mw-tasks-policy**。对于 *path-to-document*，请指定步骤 1 中保存文件的路径。例如：`file://C:\Temp\deny-mw-tasks-policy.json`
   + **对于组：**

------
#### [ Linux & macOS ]

     ```
     aws iam put-group-policy \
         --group-name "group-name" \
         --policy-name "policy-name" \
         --policy-document file://path-to-document
     ```

------
#### [ Windows ]

     ```
     aws iam put-group-policy ^
         --group-name "group-name" ^
         --policy-name "policy-name" ^
         --policy-document file://path-to-document
     ```

------

     对于 *group-name*，请指定要阻止其成员向维护时段分配任务的组。对于 *policy-name*，请指定要用于标识策略的名称，如 **my-deny-mw-tasks-policy**。对于 *path-to-document*，请指定步骤 1 中保存文件的路径。例如：`file://C:\Temp\deny-mw-tasks-policy.json`

1. 运行以下命令验证策略是否已分配给该组。

------
#### [ Linux & macOS ]

   ```
   aws iam list-group-policies \
       --group-name "group-name"
   ```

------
#### [ Windows ]

   ```
   aws iam list-group-policies ^
       --group-name "group-name"
   ```

------

# 使用控制台创建和管理维护时段
<a name="sysman-maintenance-working"></a>

本节介绍如何使用 AWS Systems Manager 控制台创建、配置、更新和删除维护时段。此外，本节还提供有关管理维护时段的目标和任务的信息。

**重要**  
我们建议您一开始在测试环境中创建和配置维护时段。

**开始前的准备工作**  
在创建维护时段之前，必须先配置对 Maintenance Windows（AWS Systems Manager 中的一项工具）的访问权限。有关更多信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。

**Topics**
+ [使用控制台创建维护时段](sysman-maintenance-create-mw.md)
+ [使用控制台为维护时段分配目标](sysman-maintenance-assign-targets.md)
+ [使用控制台为维护时段分配任务](sysman-maintenance-assign-tasks.md)
+ [使用控制台禁用或启用维护时段](sysman-maintenance-disable.md)
+ [使用控制台更新或删除维护时段资源](sysman-maintenance-update.md)

# 使用控制台创建维护时段
<a name="sysman-maintenance-create-mw"></a>

在此过程中，您需要在 Maintenance Windows（AWS Systems Manager 中的一项工具）中创建维护时段。您可以指定其基本选项，例如名称、计划和持续时间。在后面的步骤中，您将选择它更新的目标或资源，以及在维护时段运行时运行的任务。

**注意**  
有关维护时段的各种计划相关选项如何相互关联的说明，请参阅 [维护时段计划和活动期间选项](maintenance-windows-schedule-options.md)。  
有关使用 `--schedule` 选项的更多信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

**要使用控制台创建维护时段**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Maintenance Windows**。

1. 选择**创建维护时段**。

1. 对于 **Name (名称)**，请输入描述性名称，以帮助您标识此维护时段。

1. （可选）对于 **Description**（说明），输入说明以确定将如何使用此维护时段。

1. （可选）如果您希望即便没有将托管式节点注册为目标，也允许维护时段任务在这些节点上运行，则选择 **Allow unregistered targets**（允许未注册的目标）。

   如果选择了此选项，您在将任务注册到维护时段时便可以选择已注销节点（按节点 ID）。

   如果未选择此选项，则在将任务注册到维护时段时就必须选择之前注册的目标。

1. 使用三个计划选项之一为维护时段指定计划。

   有关构建 cron/rate 表达式的信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

1. 对于 **Duration (持续时间)**，输入维护时段将运行的小时数。您指定的值根据维护时段的开始时间确定维护时段的具体结束时间。在最终结束时间减去您在下一步中为 **Stop initiating tasks (停止启动任务)** 指定的小时数后，不允许启动维护时段任务。

   例如，如果维护时段从下午 3 点开始，持续时间是 3 个小时，并且 **Stop initiating tasks (停止启动任务)** 值是 1 个小时，则下午 5 点之后将无法启动维护时段任务。

1. 在**停止启动任务**中，输入系统应该在维护时段结束前几小时停止计划要运行的新任务。

1. （可选）对于 **Window start date**（时段开始日期），请以 ISO-8601 扩展格式指定您希望维护时段变为活动状态的日期和时间。这让您可以将维护时段的激活时间推迟到指定的将来日期。
**注意**  
您无法指定过去发生的开始日期和时间。

1. （可选）对于 **Window end date**（时段结束日期），请以 ISO-8601 扩展格式指定您希望维护时段变为不活动状态的日期和时间。这样可以设置在某个未来的日期和时间后不再运行维护时段。

1. （可选）对于 **Schedule timezone**（计划时区），请以互联网编号分配机构 (IANA) 格式指定时区，用作计划的维护时段运行时的依据。例如：“America/Los\$1Angeles”、“etc/UTC”或“Asia/Seoul”。

   有关有效格式的更多信息，请参阅 IANA 网站上的 [Time Zone Database](https://www.iana.org/time-zones)。

1. （可选）对于 **Schedule offset**（计划偏移），输入在运行维护时段之前但在 cron 或 rate 表达式指定的日期和时间之后等待的天数。您可以指定一到六天之间。
**注意**  
仅当您通过手动输入 cron 或 rate 表达式来指定计划时，此选项才可用。

1. （可选）在**管理标签**区域，将一个或多个标签键名称/值对应用到维护时段。

   标签是您分配给资源的可选元数据。标签运行您按各种标准（如用途、所有者或环境）对资源进行分类。例如，您可能需要标记维护时段来标识它所运行的任务的类型、目标类型和它所运行的环境。在这种情况下，您可以指定以下键名/键值对：
   + `Key=TaskType,Value=AgentUpdate`
   + `Key=OS,Value=Windows`
   + `Key=Environment,Value=Production`

1. 选择**创建维护时段**。系统将返回维护时段页面。您刚刚创建的维护时段的状态是**已启用**。

# 使用控制台为维护时段分配目标
<a name="sysman-maintenance-assign-targets"></a>

在本过程中，您将向维护时段注册目标。换言之，您指定维护时段对其执行操作的资源。

**注意**  
如果将单个维护时段任务注册到多个目标，则其任务调用将按顺序进行，而不是并行发生。如果您的任务必须同时在多个目标上运行，请为每个目标分别注册一个任务，并为每个任务分配相同的优先级。

**要使用控制台为维护时段分配目标**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Maintenance Windows**。

1. 在维护时段列表中，选择您要向其中添加目标的维护时段。

1. 选择 **Actions**，然后选择 **Register targets**。

1. （可选）对于 **Target Name (目标名称)**，输入目标的名称。

1. （可选）对于**描述**，输入描述。

1. （可选）对于 **Owner information (所有者信息)**，请指定在此维护时段内对这些目标运行任务时引发的任何 Amazon EventBridge 事件中要包含的信息。

   有关使用 EventBridge 监控 Systems Manager 事件的信息，请参阅 [使用 Amazon EventBridge 监控 Systems Manager 事件](monitoring-eventbridge-events.md)。

1. 在**目标**区域中，选择下表中所述的选项之一。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/sysman-maintenance-assign-targets.html)

1. 选择**注册目标**。

如果您想将更多目标分配到此维护时段，请选择**目标**选项卡，然后选择**注册目标**。利用此选项，您可以选择不同的目标设定方式。例如，如果您之前按节点 ID 将节点设为目标，则可以注册新目标并通过指定应用于托管式节点的标签或从资源组中选择资源类型来将节点设为目标。

# 使用控制台为维护时段分配任务
<a name="sysman-maintenance-assign-tasks"></a>

在此过程中，您向维护时段添加任务。任务是在维护时段运行时执行的操作。

以下四种类型的任务可以添加到维护时段：
+ AWS Systems Manager Run Command 命令
+ Systems Manager 自动化 工作流
+ AWS Step Functions 任务
+ AWS Lambda 函数
**重要**  
Maintenance Windows 的 IAM policy 要求您将前缀 `SSM` 添加到 Lambda 函数（或别名）名称。继续注册此类型的任务之前，请在 AWS Lambda 中更新其名称，以包含 `SSM`。例如，如果您的 Lambda 函数名称为 `MyLambdaFunction`，请将其更改为 `SSMMyLambdaFunction`。

**为维护时段分配任务**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Maintenance Windows**。

1. 在维护时段列表中，选择一个维护时段。

1. 选择 **Actions (操作)**，然后选择您要注册到维护时段的任务的类型对应的选项。
   + 选择**注册 Run command 任务**。
   + **选择注册 自动化 任务**
   + **注册 Lambda 任务**
   + **注册 Step Functions 任务**
**注意**  
维护时段任务仅支持 Step Functions 标准状态机工作流。它们不支持快速状态机工作流。有关状态机工作流类型的信息，请参阅《AWS Step Functions 开发人员指南》**中的[标准与快速工作流](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html)。

1. （可选）对于 **Name (名称)**，请输入任务的名称。

1. （可选）对于**描述**，输入描述。

1. 对于 **New task invocation cutoff**（新任务调用截止），如果您不希望在到达维护时段截止时间后开始任何新任务调用，请选择 **Enabled**（已启用）。

   如果*未*启用此选项，任务会在到达截止时间后继续运行，并会开始新的任务调用直至完成。
**注意**  
启用此选项后，未完成任务的状态为 `TIMED_OUT`。

1. 在此步骤中，请为所选任务类型选择选项卡。

------
#### [ Run Command ]

   1. 在**命令文档**列表中，选择定义待运行任务的 Systems Manager 命令文档（SSM 文档）。

   1. 对于 **Document Version (文档版本)**，选择要使用的文档版本。

   1. 对于 **Task priority (任务优先级)**，指定此任务的优先级。零 (`0`) 表示最高优先级。维护时段中的任务按优先级顺序计划，具有相同优先级的任务则并行计划。

------
#### [ Automation ]

   1.  在**自动化文档**列表中，选择定义待运行任务的 Automation 运行手册。

   1. 对于**文档版本**，选择要使用的运行手册版本。

   1. 对于 **Task priority (任务优先级)**，指定此任务的优先级。零 (`0`) 表示最高优先级。维护时段中的任务按优先级顺序计划，具有相同优先级的任务则并行计划。

------
#### [ Lambda ]

   1. 在 **Lambda 参数**区域中，从列表中选择 Lambda 函数。

   1. （可选）提供您想要包括的 **Payload**（有效负载）、**Client Context**（客户端上下文）或 **Qualifier**（限定词）的任何内容。
**注意**  
在某些情况下，您可以使用*伪参数*作为 `Payload` 值的一部分。待维护时段任务运行时，该函数会传递正确的值而不是伪参数占位符。有关信息，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

   1. 对于 **Task priority (任务优先级)**，指定此任务的优先级。零 (`0`) 表示最高优先级。维护时段中的任务按优先级顺序计划，具有相同优先级的任务则并行计划。

------
#### [ Step Functions ]

   1. 在 **Step Functions 参数**区域中，从列表中选择状态机。

   1. （可选）提供状态机执行的名称以及您想要包括的 **Input**（输入）的任何内容。
**注意**  
在某些情况下，您可以使用*伪参数*作为 `Input` 值的一部分。待维护时段任务运行时，该函数会传递正确的值而不是伪参数占位符。有关信息，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

   1. 对于 **Task priority (任务优先级)**，指定此任务的优先级。零 (`0`) 表示最高优先级。维护时段中的任务按优先级顺序计划，具有相同优先级的任务则并行计划。

------

1. 在 **Targets (目标)** 区域中，选择以下选项之一：
   + **Selecting registered target groups (选择已注册的目标群)**：选择已注册到当前维护时段的一个或多个维护时段目标。
   + **Selecting unregistered targets (选择未注册的目标)**：逐个选择可用资源作为任务的目标。

     如果未列出您希望看到的托管式节点，请参阅 [排除托管式节点可用性的问题](fleet-manager-troubleshooting-managed-nodes.md) 以获取故障排除技巧。
   + **Task target not required (不需要任务目标)**：可能已在其他函数中为除 Run Command 类型以外的所有其他任务指定了任务的目标。

     为维护时段 Run Command 类型任务指定一个或多个目标。根据任务的不同，目标对于其他维护时段任务类型（自动化、AWS Lambda 和 AWS Step Functions）是可选的。有关运行未指定目标的任务的更多信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。
**注意**  
在许多情况下，您无需为自动化任务明确指定目标。例如，假设您要创建 自动化 类型的任务，以使用 `AWS-UpdateLinuxAmi` 运行手册为 Linux 更新 Amazon Machine Image (AMI)。在该任务运行时，已使用最新可用的 Linux 分发版本的程序包和 Amazon 软件更新了 AMI。从 AMI 创建的新实例已经安装了这些更新。由于要更新的 AMI 的 ID 是在运行手册的输入参数中指定的，因此无需在维护时段任务中再次指定目标。

1. *仅限 Automation 任务：*

   在 **Input parameters**（输入参数）区域中，为运行任务所需的任何必需或可选的参数提供值。
**注意**  
在某些情况下，您可以为某些输入参数值使用*伪参数*。待维护时段任务运行时，该函数会传递正确的值而不是伪参数占位符。有关信息，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

1. 对于 **Rate control（速率控制）**：
   + 对于 **Concurrency**（并发），请指定要同时运行该命令的托管式节点的数量或百分比。
**注意**  
如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标，但不确定有多少个托管式节点已被设为目标，则可通过指定百分比来限制可同时运行该文档的目标的数量。
   + 对于 **Error threshold**（错误阈值），请指定当命令在一定数量或百分比的节点上失败后，何时在其他托管式节点上停止运行该命令。例如，如果您指定三个错误，Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。

1. （可选）对于 **IAM 服务角色**，选择一个角色以向 Systems Manager 提供运行维护时段任务时所承担的权限。

   如果您未指定服务角色 ARN，Systems Manager 将使用您账户中的服务相关角色。下拉菜单中未列出此角色。如果您的账户中没有适用于 Systems Manager 的适当服务相关角色，则将在成功注册任务后创建该角色。
**注意**  
为了改善安全状况，强烈建议您创建自定义策略和自定义服务角色来运行维护时段任务。可以精心设计该策略，只提供特定维护时段任务所需的权限。有关更多信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。

1. *仅限 Run Command 任务：*

   （可选）对于 **Output options**（输出选项），请执行以下操作：
   + 选中 **Enable writing to S3 (启用写入到 S3)** 复选框，将命令输出保存到文件。在输入框中输入存储桶和前缀（文件夹）名称。
   + 选中 **CloudWatch output (CloudWatch 输出)** 复选框，将完整的输出写入到 Amazon CloudWatch Logs。输入 CloudWatch Logs 日志组的名称。
**注意**  
授予将数据写入 S3 存储桶或 CloudWatch Logs 的能力的权限，是分配给节点的实例配置文件的权限，而不是执行此任务的 IAM 用户的权限。有关更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)。此外，如果指定的 S3 存储桶或日志组位于不同的 AWS 账户 中，请确认与该节点关联的实例配置文件具有写入该存储桶的所需权限。

1. *仅限 Run Command 任务：*

   在 **SNS 通知**部分，如果需要发送有关命令执行状态的通知，请选中 **Enable SNS notifications（启用 SNS 通知）**复选框。

   有关为 Run Command 配置 Amazon SNS 通知的更多信息，请参阅 [使用 Amazon SNS 通知监控 Systems Manager 状态更改](monitoring-sns-notifications.md)。

1. *仅限 Run Command 任务：*

   在 **Parameters (参数)** 部分中，为文档指定参数。
**注意**  
在某些情况下，您可以为某些输入参数值使用*伪参数*。待维护时段任务运行时，该函数会传递正确的值而不是伪参数占位符。有关信息，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

1. *仅限 Run Command 和 Automation 任务：*

   （可选）在 **CloudWatch 警报**区域中，为**警报名称**选择现有的 CloudWatch 警报来应用到任务，以便进行监控。

   如果警报激活，任务将停止。
**注意**  
要将 CloudWatch 警报附加到任务，运行任务的 IAM 主体必须具有 `iam:createServiceLinkedRole` 操作的权限。有关 CloudWatch 警报的更多信息，请参阅[使用 Amazon CloudWatch 警报](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/AlarmThatSendsEmail.html)。

1. 根据您的任务类型，选择以下选项之一：
   + 选择**注册 Run command 任务**。
   + **选择注册 自动化 任务**
   + **注册 Lambda 任务**
   + **注册 Step Functions 任务**

# 使用控制台禁用或启用维护时段
<a name="sysman-maintenance-disable"></a>

您可以在 Maintenance Windows（ AWS Systems Manager 中的一项工具）中禁用或启用维护时段。您可以一次选择一个维护时段，以禁用或启用维护时段的运行。您也可以选择多个或所有维护时段来启用和禁用。

本节介绍如何使用 Systems Manager 控制台禁用或启用维护时段。有关如何使用 AWS Command Line Interface (AWS CLI) 执行此操作的示例，请参阅 [教程：使用 AWS CLI 更新维护时段](maintenance-windows-cli-tutorials-update.md)。

**Topics**
+ [使用控制台禁用维护时段](#sysman-maintenance-disable-mw)
+ [使用控制台启用维护时段](#sysman-maintenance-enable-mw)

## 使用控制台禁用维护时段
<a name="sysman-maintenance-disable-mw"></a>

您可以禁用维护时段以便在指定时间内暂停任务，并且该维护时段将保持可用状态，稍后可以再次启用。

**禁用维护时段**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Maintenance Windows**。

1. 使用要禁用的维护时段旁边的复选框，选择一个或多个维护时段。

1. 在**操作**菜单上，选择**禁用维护时段**。系统将提示您确认操作。

## 使用控制台启用维护时段
<a name="sysman-maintenance-enable-mw"></a>

您可以启用维护时段来恢复任务。

**注意**  
如果维护时段使用 Rate 计划，并且起始日期当前设置为过去的日期和时间，则使用当前日期和时间作为维护时段的起始日期。您可以在启用维护时段之前或之后更改其起始日期。有关信息，请参阅[使用控制台更新或删除维护时段资源](sysman-maintenance-update.md)。

**启用维护时段**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Maintenance Windows**。

1. 选中维护时段旁边的复选框即可启用。

1. 选择**操作，选择启用维护时段**。系统将提示您确认操作。

# 使用控制台更新或删除维护时段资源
<a name="sysman-maintenance-update"></a>

您可以在 Maintenance Windows（AWS Systems Manager 中的一项工具）中更新或删除维护时段。也可以更新或删除维护时段的目标或任务。如果要编辑维护时段的详细信息，您可以更改计划、目标和任务。您还可以指定时段、目标和任务的名称和描述，从而可以更好地理解它们的用途和更轻松地管理您的时段队列。

本节介绍如何使用 Systems Manager 控制台更新或删除维护时段、目标和任务。有关如何使用 AWS Command Line Interface (AWS CLI) 执行此操作的示例，请参阅 [教程：使用 AWS CLI 更新维护时段](maintenance-windows-cli-tutorials-update.md)。

**Topics**
+ [使用控制台更新或删除维护时段](#sysman-maintenance-update-mw)
+ [使用控制台更新或注销维护时段目标](#sysman-maintenance-update-target)
+ [使用控制台更新或注销维护时段任务](#sysman-maintenance-update-tasks)

## 使用控制台更新或删除维护时段
<a name="sysman-maintenance-update-mw"></a>

您可以更新维护时段以更改其名称、描述和计划，以及该维护时段是否应允许已注销目标。

**更新或删除维护时段**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Maintenance Windows**。

1. 选择要更新或删除的维护时段旁边的按钮，然后执行以下操作之一：
   + 选择**删除**。系统将提示您确认操作。
   + 选择**编辑**。在 **Edit maintenance window**（编辑维护时段）页面中，更改所需的值和选项，然后选择 **Save changes**（保存更改）。

     有关您可以进行的配置选择的信息，请参阅 [使用控制台创建维护时段](sysman-maintenance-create-mw.md)。

## 使用控制台更新或注销维护时段目标
<a name="sysman-maintenance-update-target"></a>

您可以更新或注销维护时段的目标。如果您选择更新维护时段目标，则可以指定新的目标名称、描述和所有者。您也可以选择不同的目标。

**更新或删除维护时段目标**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Maintenance Windows**。

1. 请选择要更新的维护时段的名称，选择 **Targets**（目标）选项卡，然后执行以下操作之一：
   + 要更新目标，请选择要更新的目标旁边的按钮，然后选择 **Edit**（编辑）。
   + 要取消注册目标，请选择要注销的目标旁边的按钮，然后选择 **Deregister target**（注销目标）。在 **Deregister maintenance windows target (注销维护时段目标)** 对话框中，选择 **Deregister (注销)**。

## 使用控制台更新或注销维护时段任务
<a name="sysman-maintenance-update-tasks"></a>

您可以更新或注销维护时段的任务。如果您选择更新，则可以指定新的任务名称、描述和所有者。对于 Run Command 和 自动化 任务，可以为任务选择其他 SSM 文档。但是，您无法编辑任务以更改其类型。例如，如果您创建了一个 自动化 任务，则无法编辑该任务并将其更改为 Run Command 任务。

**要使用控制台更新或删除维护时段的任务**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Maintenance Windows**。

1. 请选择要更新的维护时段的名称。

1. 请选择 **Tasks**（任务）选项卡，然后选择要更新的任务旁边的按钮。

1. 请执行以下操作之一：
   + 要注销任务，请选择 **Deregister task**（注销任务）。
   + 要编辑任务，请选择 **Edit (编辑)**。更改所需的值和选项，然后选择 **Edit task**（编辑任务）。

# 教程
<a name="maintenance-windows-tutorials"></a>

本部分中的教程说明如何在使用维护时段时执行常见任务。

**满足先决条件**  
在尝试这些教程介绍的内容之前，请满足以下先决条件：
+ **在本地计算机上配置 AWS CLI** - 您必须先在本地计算机上安装和配置 CLI，然后才能运行 AWS CLI 命令。有关信息，请参阅[安装或更新 AWS CLI 的最新版本](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)以及[安装 AWS Tools for PowerShell](https://docs.aws.amazon.com/powershell/latest/userguide/pstools-getting-set-up.html)。
+ **验证维护时段角色和权限** - 您账户中的 AWS 管理员必须授予您使用 CLI 管理维护时段所需的 AWS Identity and Access Management（IAM）权限。有关信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。
+ **创建或配置与 Systems Manager 兼容的实例** - 您需要至少一个配置为与 Systems Manager 配合使用的 Amazon Elastic Compute Cloud（Amazon EC2）实例，以完成教程。这意味着 SSM Agent 已安装在该实例上，并且该实例上附加了适用于 Systems Manager 的 IAM 实例配置文件。

  我们建议从一个预安装了代理的 AWS 托管式 Amazon Machine Image（AMI）中启动实例。有关更多信息，请参阅 [查找预装了 SSM Agent 的 AMIs](ami-preinstalled-agent.md)。

  有关在实例上安装 SSM Agent 的更多信息，请参阅以下主题：
  + [在适用于 Windows Server 的 EC2 实例上手动安装和卸载 SSM Agent](manually-install-ssm-agent-windows.md)
  + [在适用于 Linux 的 EC2 实例上手动安装和卸载 SSM Agent](manually-install-ssm-agent-linux.md)

  有关为 Systems Manager 配置实例的 IAM 权限的信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)。
+ **根据需要创建其他资源**：Run Command（Systems Manager 中的一项工具）包含很多任务，除了本先决条件主题中列出的资源，这些任务不需要您创建其他资源。因此，我们提供了一个简单的 Run Command 任务，供您在首次学习教程时使用。您还需要一个配置为与 Systems Manager 配合使用的 EC2 实例，如本主题前面所述。配置该实例之后，您可以注册简单 Run Command 任务。

  Systems Manager Maintenance Windows 工具支持运行以下四种类型的任务：
  + Run Command 命令
  + Systems Manager 自动化 工作流
  + AWS Lambda 函数
  + AWS Step Functions 任务

  通常而言，如果您要运行的维护时段任务需要额外的资源，您应该先创建这些资源。例如，如果您需要一个运行 AWS Lambda 函数的维护时段，则在开始之前，请创建 Lambda 函数；对于 Run Command 任务，创建您可将命令输出保存到其中的 S3 存储桶（如果您计划这样做）；等等。

**Topics**
+ [教程：使用 AWS CLI 创建和管理维护时段](maintenance-window-tutorial-cli.md)
+ [教程：使用控制台创建修补的维护时段](maintenance-window-tutorial-patching.md)

# 教程：使用 AWS CLI 创建和管理维护时段
<a name="maintenance-window-tutorial-cli"></a>

此部分包含的教程可帮助您了解如何使用 AWS Command Line Interface (AWS CLI) 来执行以下操作：
+ 创建和配置维护时段
+ 查看有关维护时段的信息
+ 查看有关维护时段任务和任务执行的信息
+ 更新维护时段
+ 删除维护时段

**跟踪资源 ID**  
在您完成这些 AWS CLI 教程中的任务之后，跟踪您运行的命令生成的资源 ID。您可以将其用作后续命令的输入。例如，当您创建维护时段时，系统会向您提供以下格式的维护时段 ID。

```
{
   "WindowId":"mw-0c50858d01EXAMPLE"
}
```

记下以下系统生成的 ID，因为本节中的教程会使用它们：
+ `WindowId`
+ `WindowTargetId`
+ `WindowTaskId`
+ `WindowExecutionId`
+ `TaskExecutionId`
+ `InvocationId`
+ `ExecutionId`

您还需要计划在这些教程中使用的 EC2 实例的 ID。例如：`i-02573cafcfEXAMPLE`

**Topics**
+ [教程：使用 AWS CLI 创建和配置维护时段](maintenance-windows-cli-tutorials-create.md)
+ [教程：使用 AWS CLI 查看有关维护时段的信息](maintenance-windows-cli-tutorials-describe.md)
+ [教程：查看有关任务和使用 AWS CLI 执行任务的信息](mw-cli-tutorial-task-info.md)
+ [教程：使用 AWS CLI 更新维护时段](maintenance-windows-cli-tutorials-update.md)
+ [教程：使用 AWS CLI 删除维护时段](mw-cli-tutorial-delete-mw.md)

# 教程：使用 AWS CLI 创建和配置维护时段
<a name="maintenance-windows-cli-tutorials-create"></a>

本教程演示如何使用 AWS Command Line Interface (AWS CLI) 创建和配置维护时段、其目标和任务。完成教程的主要路径由几个简单步骤组成。您可以创建单个维护时段，确定单个目标，并为要运行的维护时段建立一个简单任务。在此过程中，我们提供了您可用于尝试更为复杂场景的信息。

在按照本教程中的步骤操作时，请将以斜体*红色*文本显示的值替换为您自己的选项和 ID。例如，请将维护时段 ID *mw-0c50858d01EXAMPLE* 和实例 ID *i-02573cafcfEXAMPLE* 替换为您创建的资源的 ID。

**Topics**
+ [步骤 1：使用 AWS CLI 创建维护时段](mw-cli-tutorial-create-mw.md)
+ [步骤 2：使用 AWS CLI 将目标节点注册到维护时段](mw-cli-tutorial-targets.md)
+ [步骤 3：使用 AWS CLI 向维护时段注册任务](mw-cli-tutorial-tasks.md)

# 步骤 1：使用 AWS CLI 创建维护时段
<a name="mw-cli-tutorial-create-mw"></a>

在此步骤中，您将创建维护时段并指定其基本选项，如名称、计划和持续时间。在后面的步骤中，您选择它将更新的实例和运行的任务。

在我们的示例中，您将创建一个每 5 分钟运行的维护时段。通常您不会如此频繁地运行维护时段。不过，此速率可让您快速看到教程的结果。在任务成功运行之后，我们将向您展示如何改为较低频率的速率。

**注意**  
有关维护时段的各种计划相关选项如何相互关联的说明，请参阅 [维护时段计划和活动期间选项](maintenance-windows-schedule-options.md)。  
有关使用 `--schedule` 选项的更多信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

**要使用 AWS CLI 创建维护时段**

1. 在您的本地计算机上打开 AWS Command Line Interface (AWS CLI) 并运行以下命令，创建执行以下任务的维护时段：
   + 每五分钟运行一次，持续时间最长两小时（根据需要）。
   + 在维护时段运行结束后的一小时内，阻止新任务启动。
   + 允许无关联的目标（您未注册到维护时段的实例）。
   + 通过使用自定义标签指示其创建方计划在本教程中使用它。

------
#### [ Linux & macOS ]

   ```
   aws ssm create-maintenance-window \
       --name "My-First-Maintenance-Window" \
       --schedule "rate(5 minutes)" \
       --duration 2 \
       --cutoff 1 \
       --allow-unassociated-targets \
       --tags "Key=Purpose,Value=Tutorial"
   ```

------
#### [ Windows ]

   ```
   aws ssm create-maintenance-window ^
       --name "My-First-Maintenance-Window" ^
       --schedule "rate(5 minutes)" ^
       --duration 2 ^
       --cutoff 1 ^
       --allow-unassociated-targets ^
       --tags "Key"="Purpose","Value"="Tutorial"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
      "WindowId":"mw-0c50858d01EXAMPLE"
   }
   ```

1. 现在，运行以下命令来查看有关此维护时段以及您的账户中已有的任何其他维护时段的详细信息。

   ```
   aws ssm describe-maintenance-windows
   ```

   系统返回类似于以下内容的信息。

   ```
   {
      "WindowIdentities":[
         {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "Name": "My-First-Maintenance-Window",
               "Enabled": true,
               "Duration": 2,
               "Cutoff": 1,
               "NextExecutionTime": "2019-05-11T16:46:16.991Z"
         }
      ]
   }
   ```

继续[步骤 2：使用 AWS CLI 将目标节点注册到维护时段](mw-cli-tutorial-targets.md)。

# 步骤 2：使用 AWS CLI 将目标节点注册到维护时段
<a name="mw-cli-tutorial-targets"></a>

在此步骤中，您使用新的维护时段注册目标。在这种情况下，您需指定维护时段运行时要更新的节点。

有关使用节点 ID 一次注册多个节点的示例、使用标签来标识多个节点的示例，以及将资源组指定为目标的示例，请参阅 [示例：向维护时段注册目标](mw-cli-tutorial-targets-examples.md)。

**注意**  
您应该已经创建了要在此步骤中使用的 Amazon Elastic Compute Cloud (Amazon EC2) 实例，如 [Maintenance Windows 教程先决条件](maintenance-windows-tutorials.md)中所述。

**要使用 AWS CLI 将目标节点注册到维护时段**

1. 在本地计算机上运行以下命令。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm register-target-with-maintenance-window \
       --window-id "mw-0c50858d01EXAMPLE" \
       --resource-type "INSTANCE" \
       --target "Key=InstanceIds,Values=i-02573cafcfEXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm register-target-with-maintenance-window ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --resource-type "INSTANCE" ^
       --target "Key=InstanceIds,Values=i-02573cafcfEXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
      "WindowTargetId":"e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
   }
   ```

1. 现在，在本地计算机上运行以下命令，查看有关您的维护时段目标的详细信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-targets \
       --window-id "mw-0c50858d01EXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-targets ^
       --window-id "mw-0c50858d01EXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "Targets": [
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowTargetId": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE",
               "ResourceType": "INSTANCE",
               "Targets": [
                   {
                       "Key": "InstanceIds",
                       "Values": [
                           "i-02573cafcfEXAMPLE"
                       ]
                   }
               ]
           }
       ]
   }
   ```

继续[步骤 3：使用 AWS CLI 向维护时段注册任务](mw-cli-tutorial-tasks.md)。

# 示例：向维护时段注册目标
<a name="mw-cli-tutorial-targets-examples"></a>

您可以使用节点 ID 将单个节点注册为目标，如 [步骤 2：使用 AWS CLI 将目标节点注册到维护时段](mw-cli-tutorial-targets.md) 中所示。您还可以使用此页面的命令格式将一个或多个节点注册为目标。

一般情况下，有两种方法用于标识您要用作维护时段目标的节点：指定各个节点和使用资源标签。资源标签方法提供了更多选项，如示例 2-3 中所示。

您也可以指定一个或多个资源组作为维护时段的目标。资源组可包含节点和许多其他类型的受支持的 AWS 资源。接下来的示例 4 和 5 演示如何将资源组添加到您的维护时段目标。

**注意**  
如果将单个维护时段任务注册到多个目标，则其任务调用将按顺序进行，而不是并行发生。如果您的任务必须同时在多个目标上运行，请为每个目标分别注册一个任务，并为每个任务分配相同的优先级。

有关创建和管理资源组的更多信息，请参阅 *AWS Resource Groups 用户指南*中的[什么是资源组？](https://docs.aws.amazon.com/ARG/latest/userguide/resource-groups.html)，以及 *AWS 新闻博客*中的 [AWS 的资源组和标记](https://aws.amazon.com/blogs/aws/resource-groups-and-tagging/)。

有关 Maintenance Windows（AWS Systems Manager 中的一项工具）配额的信息，除了以下示例中指定的内容，另请参阅《Amazon Web Services 一般参考》**中的 [Systems Manager service quotas](https://docs.aws.amazon.com/general/latest/gr/ssm.html#limits_ssm)。

## 示例 1：使用节点 ID 注册多个目标
<a name="mw-target-example-1"></a>

在本地计算机上运行以下命令，使用多个节点的节点 ID 将它们注册为目标。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

```
aws ssm register-target-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --resource-type "INSTANCE" \
    --target "Key=InstanceIds,Values=i-02573cafcfEXAMPLE,i-0471e04240EXAMPLE,i-07782c72faEXAMPLE"
```

------
#### [ Windows ]

```
aws ssm register-target-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE ^
    --resource-type "INSTANCE" ^
    --target "Key=InstanceIds,Values=i-02573cafcfEXAMPLE,i-0471e04240EXAMPLE,i-07782c72faEXAMPLE
```

------

**建议使用**：在首次将唯一一组节点注册到任何维护时段，并且这些节点*不*共享公用节点标签时最有用。

**配额：**您总共可以为每个维护时段目标指定最多 50 个节点。

## 示例 2：使用应用到节点的资源标签注册目标
<a name="mw-target-example-2"></a>

在本地计算机上运行以下命令，注册所有已使用您分配的键值对标记的节点。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

```
aws ssm register-target-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --resource-type "INSTANCE" \
    --target "Key=tag:Region,Values=East"
```

------
#### [ Windows ]

```
aws ssm register-target-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --resource-type "INSTANCE" ^
    --target "Key=tag:Region,Values=East"
```

------

**建议使用**：在首次将唯一一组节点注册到任何维护时段，并且这些节点*共享*公用节点标签时最有用。

**配额：**您总共可以为每个目标指定最多 5 个键/值对。如果您指定了多个键/值对，则必须使用您指定的*所有* 标签键和值来标记节点，才能将该节点包含在目标组中。

**注意**  
您可以使用标签键`Patch Group`或`PatchGroup`来标记一组节点并向节点分配通用键值，例如 `my-patch-group`。（如果[在 EC2 实例元数据中允许使用标签](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#allow-access-to-tags-in-IMDS)，则必须使用 `PatchGroup`，且不能使用空格。）Patch Manager是 Systems Manager 中的一项工具，用于评估节点上的 `Patch Group` 或 `PatchGroup` 键，以便确定适用的补丁基准。如果您的任务将运行 `AWS-RunPatchBaseline` SSM 文档（或传统 `AWS-ApplyPatchBaseline` SSM 文档），则在将目标注册到维护时段时，可以指定相同的`Patch Group`或`PatchGroup`键值对。例如：`--target "Key=tag:PatchGroup,Values=my-patch-group`。这样做可让您使用维护时段，在已经与相同补丁基准关联的一组节点上更新补丁。有关更多信息，请参阅 [补丁组](patch-manager-patch-groups.md)。

## 示例 3：使用一组标签键（无标签值）注册目标
<a name="mw-target-example-3"></a>

在本地计算机上运行以下命令，注册所有已分配有一个或多个标签键的节点（不考虑其键值）。将每个*示例资源占位符*替换为您自己的信息。

------
#### [ Linux & macOS ]

```
aws ssm register-target-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --resource-type "INSTANCE" \
    --target "Key=tag-key,Values=Name,Instance-Type,CostCenter"
```

------
#### [ Windows ]

```
aws ssm register-target-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --resource-type "INSTANCE" ^
    --target "Key=tag-key,Values=Name,Instance-Type,CostCenter"
```

------

**建议使用**：当您想要通过指定多个标签*键*（无值），而非仅指定一个标签键或标签键值对来将节点设为目标时很有用。

**配额：**您总共可以为每个目标指定最多 5 个标签键。如果您指定了多个标签键，则必须使用您指定的*所有*标签键来标记节点，才能将该节点包含在目标组中。

## 示例 4：使用资源组名称注册目标
<a name="mw-target-example-4"></a>

在本地计算机上运行以下命令，注册指定的资源组，而不管其包含的资源类型。将 *mw-0c50858d01EXAMPLE* 替换为您自己的信息。如果分配给维护时段的任务不会在此资源组中包含的某资源类型上执行操作，则系统可能会报告错误。尽管存在这些错误，但找到了支持的资源类型的任务仍会继续运行。

------
#### [ Linux & macOS ]

```
aws ssm register-target-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --resource-type "RESOURCE_GROUP" \
    --target "Key=resource-groups:Name,Values=MyResourceGroup"
```

------
#### [ Windows ]

```
aws ssm register-target-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --resource-type "RESOURCE_GROUP" ^
    --target "Key=resource-groups:Name,Values=MyResourceGroup"
```

------

**建议使用**：当您想要将资源组快速指定为目标而不评估维护时段是否将其所有资源类型设为目标时，或者当您知道资源组仅包含任务对其执行操作的资源类型时，此选项很有用。

**限额：**您只能将一个资源组指定为目标。

## 示例 5：通过筛选资源组中的资源类型来注册目标
<a name="mw-target-example-5"></a>

在本地计算机上运行以下命令，只注册属于您所指定的资源组的某些资源类型。将 *mw-0c50858d01EXAMPLE* 替换为您自己的信息。使用此选项，即使您为属于资源组的资源类型添加任务，但如果尚未将资源类型显式添加到筛选器，则任务也不会运行。

------
#### [ Linux & macOS ]

```
aws ssm register-target-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --resource-type "RESOURCE_GROUP" \
    --target "Key=resource-groups:Name,Values=MyResourceGroup" \
    "Key=resource-groups:ResourceTypeFilters,Values=AWS::EC2::Instance,AWS::ECS::Cluster"
```

------
#### [ Windows ]

```
aws ssm register-target-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --resource-type "RESOURCE_GROUP" ^
    --target "Key=resource-groups:Name,Values=MyResourceGroup" ^
    "Key=resource-groups:ResourceTypeFilters,Values=AWS::EC2::Instance,AWS::ECS::Cluster"
```

------

**建议使用**：当您希望严格控制维护时段可在其上运行操作的 AWS 资源的类型时，或者当您的资源组包含大量资源类型而您希望在维护时段日志中避免不必要的错误报告时，这非常有用。

**限额：**您只能将一个资源组指定为目标。

# 步骤 3：使用 AWS CLI 向维护时段注册任务
<a name="mw-cli-tutorial-tasks"></a>

在教程的此步骤中，您将注册 AWS Systems Manager Run Command 任务，该任务将在适用于 Linux 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例上运行 `df` 命令。此标准 Linux 命令的结果显示实例的磁盘文件系统上的空闲空间数量和已用空间数量。

–或者–

如果您设定的目标是适用于 Windows Server 而不是 Linux 的 Amazon EC2 实例，请将以下命令中的 **df** 替换为 **ipconfig**。此命令的输出列出了有关目标实例上适配器的 IP 地址、子网掩码和默认网关等详细信息。

当您准备好注册其他任务类型，或使用更多可用 Systems Manager Run Command 选项时，请参阅 [示例：向维护时段注册任务](mw-cli-register-tasks-examples.md)。我们在这里提供了有关全部四种任务类型的更多信息，以及它们最重要的一些选项，以帮助您针对更广泛的真实情况制定计划。

**向维护时段注册任务**

1. 在本地计算机上运行以下命令。将每个*示例资源占位符*替换为您自己的信息。从本地 Windows 计算机运行的版本包含转义字符 (“/”)，您需要从命令行工具运行命令。

------
#### [ Linux & macOS ]

   ```
   aws ssm register-task-with-maintenance-window \
       --window-id mw-0c50858d01EXAMPLE \
       --task-arn "AWS-RunShellScript" \
       --max-concurrency 1 --max-errors 1 \
       --priority 10 \
       --targets "Key=InstanceIds,Values=i-0471e04240EXAMPLE" \
       --task-type "RUN_COMMAND" \
       --task-invocation-parameters '{"RunCommand":{"Parameters":{"commands":["df"]}}}'
   ```

------
#### [ Windows ]

   ```
   aws ssm register-task-with-maintenance-window ^
       --window-id mw-0c50858d01EXAMPLE ^
       --task-arn "AWS-RunShellScript" ^
       --max-concurrency 1 --max-errors 1 ^
       --priority 10 ^
       --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE" ^
       --task-type "RUN_COMMAND" ^
       --task-invocation-parameters={\"RunCommand\":{\"Parameters\":{\"commands\":[\"df\"]}}}
   ```

------

   系统返回类似于下文的信息：

   ```
   {
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE"
   }
   ```

1. 现在，运行以下命令查看有关您创建的维护时段任务的详细信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-tasks \
       --window-id mw-0c50858d01EXAMPLE
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-tasks ^
       --window-id mw-0c50858d01EXAMPLE
   ```

------

1. 系统返回类似于以下内容的信息。

   ```
   {
       "Tasks": [
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
               "TaskArn": "AWS-RunShellScript",
               "Type": "RUN_COMMAND",
               "Targets": [
                   {
                       "Key": "InstanceIds",
                       "Values": [
                           "i-02573cafcfEXAMPLE"
                       ]
                   }
               ],
               "TaskParameters": {},
               "Priority": 10,
               "ServiceRoleArn": "arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole",
               "MaxConcurrency": "1",
               "MaxErrors": "1"
           }
       ]
   }
   ```

1. 请耐心等待，直到有足够的时间根据您在[步骤 1：使用 AWS CLI 创建维护时段](mw-cli-tutorial-create-mw.md) 中指定的计划运行任务。例如，如果您指定了 **--schedule "rate(5 minutes)"**，则等待五分钟。然后，运行以下命令来查看此任务所进行的任何执行的相关信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-executions \
       --window-id mw-0c50858d01EXAMPLE
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-executions ^
       --window-id mw-0c50858d01EXAMPLE
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutions": [
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
               "Status": "SUCCESS",
               "StartTime": 1557593493.096,
               "EndTime": 1557593498.611
           }
       ]
   }
   ```

**提示**  
任务成功运行后，您可以降低维护时段运行的速率。例如，运行以下命令以将频率减少为每周一次。将 *mw-0c50858d01EXAMPLE* 替换为您自己的信息。  

```
aws ssm update-maintenance-window \
    --window-id mw-0c50858d01EXAMPLE \
    --schedule "rate(7 days)"
```

```
aws ssm update-maintenance-window ^
    --window-id mw-0c50858d01EXAMPLE ^
    --schedule "rate(7 days)"
```
有关管理维护时段计划的信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md) 和 [维护时段计划和活动期间选项](maintenance-windows-schedule-options.md)。  
有关使用 AWS Command Line Interface (AWS CLI) 修改维护时段的信息，请参阅 [教程：使用 AWS CLI 更新维护时段](maintenance-windows-cli-tutorials-update.md)。

有关运行 AWS CLI 命令以查看有关维护时段任务及其执行详细信息的练习，请转到[教程：查看有关任务和使用 AWS CLI 执行任务的信息](mw-cli-tutorial-task-info.md)。

**访问教程命令输出**  
使用 AWS CLI 查看与您的维护时段任务执行相关联的 Run Command 命令的*输出*，不在本教程的讨论范围内。

不过，您可以使用 AWS CLI 查看此数据。（您还可以在 Systems Manager 控制台中或存储在 Amazon Simple Storage Service (Amazon S3) 存储桶内的日志文件中（如果您已配置维护时段将命令输出存储在其中）查看输出。） 您会看到，适用于 Linux 的 Amazon EC2 实例上 **df** 命令的输出类似于下文：

```
Filesystem 1K-blocks Used Available Use% Mounted on

devtmpfs 485716 0 485716 0% /dev

tmpfs 503624 0 503624 0% /dev/shm

tmpfs 503624 328 503296 1% /run

tmpfs 503624 0 503624 0% /sys/fs/cgroup

/dev/xvda1 8376300 1464160 6912140 18% /
```

Windows Server 的 EC2 实例上 **ipconfig** 命令的输出类似于下文：

```
Windows IP Configuration


Ethernet adapter Ethernet 2:

   Connection-specific DNS Suffix  . : example.com
   IPv4 Address. . . . . . . . . . . : 10.24.34.0/23
   Subnet Mask . . . . . . . . . . . : 255.255.255.255
   Default Gateway . . . . . . . . . : 0.0.0.0

Ethernet adapter Ethernet:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . : abc1.wa.example.net

Wireless LAN adapter Local Area Connection* 1:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :

Wireless LAN adapter Wi-Fi:

   Connection-specific DNS Suffix  . :
   Link-local IPv6 Address . . . . . : fe80::100b:c234:66d6:d24f%4
   IPv4 Address. . . . . . . . . . . : 192.0.2.0
   Subnet Mask . . . . . . . . . . . : 255.255.255.0
   Default Gateway . . . . . . . . . : 192.0.2.0

Ethernet adapter Bluetooth Network Connection:

   Media State . . . . . . . . . . . : Media disconnected
   Connection-specific DNS Suffix  . :
```

# 示例：向维护时段注册任务
<a name="mw-cli-register-tasks-examples"></a>

您可以使用 AWS Command Line Interface（AWS CLI）将 Run Command（AWS Systems Manager 中的一项工具）中的任务注册到维护时段，如[向维护时段注册任务](mw-cli-tutorial-tasks.md)中所示。您还可以为 Systems Manager 自动化 工作流、AWS Lambda 函数和 AWS Step Functions 任务注册任务，如本主题后面的内容所示。

**注意**  
为维护时段 Run Command 类型任务指定一个或多个目标。根据任务的不同，目标对于其他维护时段任务类型（自动化、AWS Lambda 和 AWS Step Functions）是可选的。有关运行未指定目标的任务的更多信息，请参阅 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

在本主题中，我们提供的示例演示了如何使用 AWS Command Line Interface (AWS CLI) 命令 `register-task-with-maintenance-window`，分别将四种支持的任务类型注册到维护时段。这些示例仅用于演示目的，不过您可以修改它们以创建工作任务注册命令。

**使用 --cli-input-json 选项**  
为了更好地管理任务选项，您可以使用命令选项 `--cli-input-json`，其选项值在 JSON 文件中引用。

要使用我们在下列示例中提供的示例 JSON 文件内容，请在您本地计算机上执行以下操作：

1. 创建一个文件，采用类似于 `MyRunCommandTask.json`、`MyAutomationTask.json` 或其他您偏好的名称。

1. 将 JSON 示例内容复制到该文件中。

1. 为您的任务注册修改文件内容，然后保存该文件。

1. 在存储文件的同一个目录中，运行以下命令：用您的文件名替换 *MyFile.json*。

------
#### [ Linux & macOS ]

   ```
   aws ssm register-task-with-maintenance-window \
       --cli-input-json file://MyFile.json
   ```

------
#### [ Windows ]

   ```
   aws ssm register-task-with-maintenance-window ^
       --cli-input-json file://MyFile.json
   ```

------

**维护时段任务中的伪参数**  
在某些示例中，我们使用*伪参数* 作为将 ID 信息传递到您任务的方法。例如，`{{TARGET_ID}}` 和 `{{RESOURCE_ID}}` 可用于将 AWS 资源的 ID 传递到 自动化、Lambda 和 Step Functions 任务。有关 `--task-invocation-parameters` 内容中伪参数的更多信息，请参阅 [注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

**更多信息**  
+ [register-task-with-maintenance-windows 命令的参数选项](mw-cli-task-options.md).
+ 《AWS CLI Command Reference》**中的 [https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html)。
+ **《AWS Systems Manager API 参考》中的 [https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_RegisterTaskWithMaintenanceWindow.html](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_RegisterTaskWithMaintenanceWindow.html)

## 任务注册示例
<a name="task-examples"></a>

以下部分提供了一个示例 AWS CLI 命令，用于注册支持的任务类型和可与 `--cli-input-json` 选项一起使用的 JSON 示例。

### 注册 Systems Manager Run Command 任务
<a name="register-tasks-tutorial-run-command"></a>

以下示例演示了如何使用 AWS CLI 将 Systems Manager Run Command 任务注册到维护时段。

------
#### [ Linux & macOS ]

```
aws ssm register-task-with-maintenance-window \
    --window-id mw-0c50858d01EXAMPLE \
    --task-arn "AWS-RunShellScript" \
    --max-concurrency 1 --max-errors 1 --priority 10 \
    --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE" \
    --task-type "RUN_COMMAND" \
    --task-invocation-parameters '{"RunCommand":{"Parameters":{"commands":["df"]}}}'
```

------
#### [ Windows ]

```
aws ssm register-task-with-maintenance-window ^
    --window-id mw-0c50858d01EXAMPLE ^
    --task-arn "AWS-RunShellScript" ^
    --max-concurrency 1 --max-errors 1 --priority 10 ^
    --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE" ^
    --task-type "RUN_COMMAND" ^
    --task-invocation-parameters "{\"RunCommand\":{\"Parameters\":{\"commands\":[\"df\"]}}}"
```

------

**用于 `--cli-input-json` 文件选项的 JSON 内容：**

```
{
    "TaskType": "RUN_COMMAND",
    "WindowId": "mw-0c50858d01EXAMPLE",
    "Description": "My Run Command task to update SSM Agent on an instance",
    "MaxConcurrency": "1",
    "MaxErrors": "1",
    "Name": "My-Run-Command-Task",
    "Priority": 10,
    "Targets": [
        {
            "Key": "WindowTargetIds",
            "Values": [
                "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
            ]
        }
    ],
    "TaskArn": "AWS-UpdateSSMAgent",
    "TaskInvocationParameters": {
        "RunCommand": {
            "Comment": "A TaskInvocationParameters test comment",
            "NotificationConfig": {
                "NotificationArn": "arn:aws:sns:region:123456789012:my-sns-topic-name",
                "NotificationEvents": [
                    "All"
                ],
                "NotificationType": "Invocation"
            },
            "OutputS3BucketName": "amzn-s3-demo-bucket",
            "OutputS3KeyPrefix": "S3-PREFIX",
            "TimeoutSeconds": 3600
        }
    }
}
```

### 注册 Systems Manager 自动化 任务
<a name="register-tasks-tutorial-automation"></a>

以下示例演示了如何使用 AWS CLI 将 Systems Manager 自动化 任务注册到维护时段：

**AWS CLI 命令：**

------
#### [ Linux & macOS ]

```
aws ssm register-task-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --task-arn "AWS-RestartEC2Instance" \
    --service-role-arn arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole \
    --task-type AUTOMATION \
    --task-invocation-parameters "Automation={DocumentVersion=5,Parameters={InstanceId='{{RESOURCE_ID}}'}}" \
    --priority 0 --name "My-Restart-EC2-Instances-Automation-Task" \
    --description "Automation task to restart EC2 instances"
```

------
#### [ Windows ]

```
aws ssm register-task-with-maintenance-window ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --task-arn "AWS-RestartEC2Instance" ^
    --service-role-arn arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole ^
    --task-type AUTOMATION ^
    --task-invocation-parameters "Automation={DocumentVersion=5,Parameters={InstanceId='{{TARGET_ID}}'}}" ^
    --priority 0 --name "My-Restart-EC2-Instances-Automation-Task" ^
    --description "Automation task to restart EC2 instances"
```

------

**用于 `--cli-input-json` 文件选项的 JSON 内容：**

```
{
    "WindowId": "mw-0c50858d01EXAMPLE",
        "TaskArn": "AWS-PatchInstanceWithRollback",
    "TaskType": "AUTOMATION","TaskInvocationParameters": {
        "Automation": {
            "DocumentVersion": "1",
            "Parameters": {
                "instanceId": [
                    "{{RESOURCE_ID}}"
                ]
            }
        }
    }
}
```

### 注册 AWS Lambda 任务
<a name="register-tasks-tutorial-lambda"></a>

以下示例演示了如何使用 AWS CLI 将 Lambda 函数任务注册到维护时段。

对于这些示例，创建 Lambda 函数的用户将其命名为 `SSMrestart-my-instances`，并创建了名为 `instanceId` 和 `targetType` 的两个参数。

**重要**  
Maintenance Windows 的 IAM policy 要求您将前缀 `SSM` 添加到 Lambda 函数（或别名）名称。继续注册此类型的任务之前，请在 AWS Lambda 中更新其名称，以包含 `SSM`。例如，如果您的 Lambda 函数名称为 `MyLambdaFunction`，请将其更改为 `SSMMyLambdaFunction`。

**AWS CLI 命令：**

------
#### [ Linux & macOS ]

**重要**  
如果您使用的是版本 2 的 AWS CLI，并且您的 Lambda 有效负载没有进行 base64 编码，则您必须在以下命令中包含选项 `--cli-binary-format raw-in-base64-out`。`cli_binary_format` 选项仅在版本 2 中可用。有关此设置和其他 AWS CLI `config` 文件设置的信息，请参阅 *AWS Command Line Interface 用户指南*中的[受支持的 `config` 文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-settings)。

```
aws ssm register-task-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
    --priority 2 --max-concurrency 10 --max-errors 5 --name "My-Lambda-Example" \
    --description "A description for my LAMBDA example task" --task-type "LAMBDA" \
    --task-arn "arn:aws:lambda:region:123456789012:function:serverlessrepo-SSMrestart-my-instances-C4JF9EXAMPLE" \
    --task-invocation-parameters '{"Lambda":{"Payload":"{\"InstanceId\":\"{{RESOURCE_ID}}\",\"targetType\":\"{{TARGET_TYPE}}\"}","Qualifier": "$LATEST"}}'
```

------
#### [ PowerShell ]

**重要**  
如果您使用的是版本 2 的 AWS CLI，并且您的 Lambda 有效负载没有进行 base64 编码，则您必须在以下命令中包含选项 `--cli-binary-format raw-in-base64-out`。`cli_binary_format` 选项仅在版本 2 中可用。有关此设置和其他 AWS CLI `config` 文件设置的信息，请参阅 *AWS Command Line Interface 用户指南*中的[受支持的 `config` 文件设置](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-files.html#cli-configure-files-settings)。

```
aws ssm register-task-with-maintenance-window `
    --window-id "mw-0c50858d01EXAMPLE" `
    --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" `
    --priority 2 --max-concurrency 10 --max-errors 5 --name "My-Lambda-Example" `
    --description "A description for my LAMBDA example task" --task-type "LAMBDA" `
    --task-arn "arn:aws:lambda:region:123456789012:function:serverlessrepo-SSMrestart-my-instances-C4JF9EXAMPLE" `
    --task-invocation-parameters '{\"Lambda\":{\"Payload\":\"{\\\"InstanceId\\\":\\\"{{RESOURCE_ID}}\\\",\\\"targetType\\\":\\\"{{TARGET_TYPE}}\\\"}\",\"Qualifier\": \"$LATEST\"}}'
```

------

**用于 `--cli-input-json` 文件选项的 JSON 内容：**

```
{
    "WindowId": "mw-0c50858d01EXAMPLE",
    "Targets": [
        {
            "Key": "WindowTargetIds",
            "Values": [
                "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
            ]
        }
    ],
    "TaskArn": "SSM_RestartMyInstances",
    "TaskType": "LAMBDA",
    "MaxConcurrency": "10",
    "MaxErrors": "10",
    "TaskInvocationParameters": {
        "Lambda": {
            "ClientContext": "ew0KICAi--truncated--0KIEXAMPLE",
            "Payload": "{ \"instanceId\": \"{{RESOURCE_ID}}\", \"targetType\": \"{{TARGET_TYPE}}\" }",
            "Qualifier": "$LATEST"
        }
    },
    "Name": "My-Lambda-Task",
    "Description": "A description for my LAMBDA task",
    "Priority": 5
}
```

### 注册 Step Functions 任务
<a name="register-tasks-tutorial-step-functions"></a>

以下示例演示了如何使用 AWS CLI 将 Step Functions 状态机任务注册到维护时段。

**注意**  
维护时段任务仅支持 Step Functions 标准状态机工作流。它们不支持快速状态机工作流。有关状态机工作流类型的信息，请参阅《AWS Step Functions 开发人员指南》**中的[标准与快速工作流](https://docs.aws.amazon.com/step-functions/latest/dg/concepts-standard-vs-express.html)。

对于这些示例，创建 Step Functions 状态机的用户使用名为 `instanceId` 的参数创建名为 `SSMMyStateMachine` 的状态机。

**重要**  
Maintenance Windows 的 AWS Identity and Access Management （IAM）policy 要求您使用 `SSM` 作为 Step Functions 状态机名称的前缀。继续注册此类型的任务之前，您必须在 AWS Step Functions 中更新此名称以包括 `SSM`。例如，如果您的状态机名为 `MyStateMachine`，则将其更改为 `SSMMyStateMachine`。

**AWS CLI 命令：**

------
#### [ Linux & macOS ]

```
aws ssm register-task-with-maintenance-window \
    --window-id "mw-0c50858d01EXAMPLE" \
    --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
    --task-arn arn:aws:states:region:123456789012:stateMachine:SSMMyStateMachine-MggiqEXAMPLE \
    --task-type STEP_FUNCTIONS \
    --task-invocation-parameters '{"StepFunctions":{"Input":"{\"InstanceId\":\"{{RESOURCE_ID}}\"}", "Name":"{{INVOCATION_ID}}"}}' \
    --priority 0 --max-concurrency 10 --max-errors 5 \
    --name "My-Step-Functions-Task" --description "A description for my Step Functions task"
```

------
#### [ PowerShell ]

```
aws ssm register-task-with-maintenance-window `
    --window-id "mw-0c50858d01EXAMPLE" `
    --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" `
    --task-arn arn:aws:states:region:123456789012:stateMachine:SSMMyStateMachine-MggiqEXAMPLE `
    --task-type STEP_FUNCTIONS `
    --task-invocation-parameters '{\"StepFunctions\":{\"Input\":\"{\\\"InstanceId\\\":\\\"{{RESOURCE_ID}}\\\"}\", \"Name\":\"{{INVOCATION_ID}}\"}}' `
    --priority 0 --max-concurrency 10 --max-errors 5 `
    --name "My-Step-Functions-Task" --description "A description for my Step Functions task"
```

------

**用于 `--cli-input-json` 文件选项的 JSON 内容：**

```
{
    "WindowId": "mw-0c50858d01EXAMPLE",
    "Targets": [
        {
            "Key": "WindowTargetIds",
            "Values": [
                "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
            ]
        }
    ],
    "TaskArn": "SSM_MyStateMachine",
    "TaskType": "STEP_FUNCTIONS",
    "MaxConcurrency": "10",
    "MaxErrors": "10",
    "TaskInvocationParameters": {
        "StepFunctions": {
            "Input": "{ \"instanceId\": \"{{TARGET_ID}}\" }",
            "Name": "{{INVOCATION_ID}}"
        }
    },
    "Name": "My-Step-Functions-Task",
    "Description": "A description for my Step Functions task",
    "Priority": 5
}
```

# register-task-with-maintenance-windows 命令的参数选项
<a name="mw-cli-task-options"></a>

**register-task-with-maintenance-window** 命令提供多个选项用于根据您的需求配置任务。其中一些任务为必需，一些为可选，还有一些仅适用于单个维护时段任务类型。

本主题提供了有关其中一些选项的信息，以帮助您使用本教程这一部分中的示例。有关所有命令选项的信息，请参阅 *AWS CLI 命令参考*中的 **[https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html)**。

**命令选项：`--task-arn`**  
`--task-arn` 选项用于指定执行任务的资源。您指定的值取决于所要注册的任务类型，如下表中所述。


**维护时段任务的 TaskArn 格式**  

| 维护时段任务类型 | TaskArn 值 | 
| --- | --- | 
|  **`RUN_COMMAND`** 和 **`AUTOMATION`**  |  `TaskArn` 是 SSM 文档名称或 Amazon Resource Name (ARN)。例如： `AWS-RunBatchShellScript`  –或者– `arn:aws:ssm:region:111122223333:document/My-Document`.  | 
|  **`LAMBDA`**  |  `TaskArn` 是函数名称或 ARN。例如： `SSMMy-Lambda-Function` –或者– `arn:aws:lambda:region:111122223333:function:SSMMyLambdaFunction`.  Maintenance Windows 的 IAM policy 要求您将前缀 `SSM` 添加到 Lambda 函数（或别名）名称。继续注册此类型的任务之前，请在 AWS Lambda 中更新其名称，以包含 `SSM`。例如，如果您的 Lambda 函数名称为 `MyLambdaFunction`，请将其更改为 `SSMMyLambdaFunction`。   | 
|  **`STEP_FUNCTIONS`**  |  `TaskArn` 是状态机 ARN。例如： `arn:aws:states:us-east-2:111122223333:stateMachine:SSMMyStateMachine`.  维护时段的 IAM policy 要求您使用 `SSM` 作为 Step Functions 状态机名称的前缀。您应先注册此类型的任务，然后必须在 AWS Step Functions 中更新其名称以包含 `SSM`。例如，如果您的状态机名为 `MyStateMachine`，则将其更改为 `SSMMyStateMachine`。   | 

**命令选项：`--service-role-arn`**  
运行维护时段任务时 AWS Systems Manager 要代入的角色。

有关更多信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。

**命令选项：`--task-invocation-parameters`**  
`--task-invocation-parameters` 选项用于指定分别对于四种任务类型唯一的参数。四种任务类型分别支持的参数如下表中所述。

**注意**  
有关在 `--task-invocation-parameters` 内容中使用伪参数的信息，例如 \$1\$1TARGET\$1ID\$1\$1，请参阅[注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md)。

维护任务时段的任务调用参数选项


| 维护时段任务类型 | 可用参数  | 示例 | 
| --- | --- | --- | 
|  **`RUN_COMMAND`**  |  `Comment` `DocumentHash` `DocumentHashType` `NotificationConfig` `OutputS3BucketName` `OutPutS3KeyPrefix` `Parameters` `ServiceRoleArn` `TimeoutSeconds`  |  <pre>"TaskInvocationParameters": {<br />        "RunCommand": {<br />            "Comment": "My Run Command task comment",<br />            "DocumentHash": "6554ed3d--truncated--5EXAMPLE",<br />            "DocumentHashType": "Sha256",<br />            "NotificationConfig": {<br />                "NotificationArn": "arn:aws:sns:region:123456789012:my-sns-topic-name",<br />                "NotificationEvents": [<br />                    "FAILURE"<br />                ],<br />                "NotificationType": "Invocation"<br />            },<br />            "OutputS3BucketName": "amzn-s3-demo-bucket",<br />            "OutputS3KeyPrefix": "S3-PREFIX",<br />            "Parameters": {<br />                "commands": [<br />                    "Get-ChildItem$env: temp-Recurse|Remove-Item-Recurse-force"<br />                ]<br />            },<br />            "ServiceRoleArn": "arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole",<br />            "TimeoutSeconds": 3600<br />        }<br />    }</pre>  | 
|  **`AUTOMATION`**  |  `DocumentVersion` `Parameters`  |  <pre>"TaskInvocationParameters": {<br />        "Automation": {<br />            "DocumentVersion": "3",<br />            "Parameters": {<br />                "instanceid": [<br />                    "{{TARGET_ID}}"<br />                ]<br />            }<br />        }<br />    }</pre>  | 
|  **`LAMBDA`**  |  `ClientContext` `Payload` `Qualifier`  |  <pre>"TaskInvocationParameters": {<br />        "Lambda": {<br />            "ClientContext": "ew0KICAi--truncated--0KIEXAMPLE",<br />            "Payload": "{ \"targetId\": \"{{TARGET_ID}}\", \"targetType\": \"{{TARGET_TYPE}}\" }",<br />            "Qualifier": "$LATEST"<br />        }<br />    }</pre>  | 
|  **`STEP_FUNCTIONS`**  |  `Input` `Name`  |  <pre>"TaskInvocationParameters": {<br />        "StepFunctions": {<br />            "Input": "{ \"targetId\": \"{{TARGET_ID}}\" }",<br />            "Name": "{{INVOCATION_ID}}"<br />        }<br />    }</pre>  | 

# 教程：使用 AWS CLI 查看有关维护时段的信息
<a name="maintenance-windows-cli-tutorials-describe"></a>

本教程包含的命令可帮助您更新维护时段、任务、执行和调用或获取相关信息。这些示例按命令进行组织，说明如何使用命令选项筛选要查看的详细信息类型。

在按照本教程中的步骤操作时，请将以斜体*红色*文本显示的值替换为您自己的选项和 ID。例如，请将维护时段 ID *mw-0c50858d01EXAMPLE* 和实例 ID *i-02573cafcfEXAMPLE* 替换为您创建的资源的 ID。

有关设置和配置 AWS Command Line Interface (AWS CLI) 的信息，请参阅[安装、更新和卸载 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html) 和[配置 AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-configure.html)。

**Topics**
+ ['describe-maintenance-windows' 的示例](#mw-cli-tutorials-describe-maintenance-windows)
+ ['describe-maintenance-window-targets' 的示例](#mw-cli-tutorials-describe-maintenance-window-targets)
+ ['describe-maintenance-window-tasks' 的示例](#mw-cli-tutorials-describe-maintenance-window-tasks)
+ ['describe-maintenance-windows-for-target' 的示例](#mw-cli-tutorials-describe-maintenance-windows-for-target)
+ ['describe-maintenance-window-executions' 的示例](#mw-cli-tutorials-describe-maintenance-window-executions)
+ ['describe-maintenance-window-schedule' 的示例](#mw-cli-tutorials-describe-maintenance-window-schedule)

## 'describe-maintenance-windows' 的示例
<a name="mw-cli-tutorials-describe-maintenance-windows"></a>

**列出您的 AWS 账户中的所有维护时段**  
运行如下命令。

```
aws ssm describe-maintenance-windows
```

系统返回类似于以下内容的信息。

```
{
   "WindowIdentities":[
      {
         "WindowId":"mw-0c50858d01EXAMPLE",
         "Name":"My-First-Maintenance-Window",
         "Enabled":true,
         "Duration":2,
         "Cutoff":0,
         "NextExecutionTime": "2019-05-18T17:01:01.137Z"        
      },
      {
         "WindowId":"mw-9a8b7c6d5eEXAMPLE",
         "Name":"My-Second-Maintenance-Window",
         "Enabled":true,
         "Duration":4,
         "Cutoff":1,
         "NextExecutionTime": "2019-05-30T03:30:00.137Z"        
      },
   ]
}
```

**列出所有已启用的维护时段**  
运行如下命令。

```
aws ssm describe-maintenance-windows --filters "Key=Enabled,Values=true"
```

系统返回类似于以下内容的信息。

```
{
   "WindowIdentities":[
      {
         "WindowId":"mw-0c50858d01EXAMPLE",
         "Name":"My-First-Maintenance-Window",
         "Enabled":true,
         "Duration":2,
         "Cutoff":0,
         "NextExecutionTime": "2019-05-18T17:01:01.137Z"        
      },
      {
         "WindowId":"mw-9a8b7c6d5eEXAMPLE",
         "Name":"My-Second-Maintenance-Window",
         "Enabled":true,
         "Duration":4,
         "Cutoff":1,
         "NextExecutionTime": "2019-05-30T03:30:00.137Z"        
      },
   ]
}
```

**列出所有已禁用的维护时段**  
运行如下命令。

```
aws ssm describe-maintenance-windows --filters "Key=Enabled,Values=false"
```

系统返回类似于以下内容的信息。

```
{
    "WindowIdentities": [
        {
            "WindowId": "mw-6e5c9d4b7cEXAMPLE",
            "Name": "My-Disabled-Maintenance-Window",
            "Enabled": false,
            "Duration": 2,
            "Cutoff": 1
        }
    ]
}
```

**列出名称以特定前缀开头的所有维护时段**  
运行如下命令。

```
aws ssm describe-maintenance-windows --filters "Key=Name,Values=My"
```

系统返回类似于以下内容的信息。

```
{
    "WindowIdentities": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "Enabled": true,
            "Duration": 2,
            "Cutoff": 0,
            "NextExecutionTime": "2019-05-18T17:01:01.137Z"
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "Name": "My-Second-Maintenance-Window",
            "Enabled": true,
            "Duration": 4,
            "Cutoff": 1,
            "NextExecutionTime": "2019-05-30T03:30:00.137Z"
        },
        {
            "WindowId": "mw-6e5c9d4b7cEXAMPLE",
            "Name": "My-Disabled-Maintenance-Window",
            "Enabled": false,
            "Duration": 2,
            "Cutoff": 1
        }
    ]
}
```

## 'describe-maintenance-window-targets' 的示例
<a name="mw-cli-tutorials-describe-maintenance-window-targets"></a>

**显示匹配特定所有者信息值的维护时段的目标**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-targets \
    --window-id "mw-6e5c9d4b7cEXAMPLE" \
    --filters "Key=OwnerInformation,Values=CostCenter1"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-targets ^
    --window-id "mw-6e5c9d4b7cEXAMPLE" ^
    --filters "Key=OwnerInformation,Values=CostCenter1"
```

------

**注意**  
支持的筛选条件键为 `Type`、`WindowTargetId` 和 `OwnerInformation`。

系统返回类似于以下内容的信息。

```
{
    "Targets": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowTargetId": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE",
            "ResourceType": "INSTANCE",
            "Targets": [
                {
                    "Key": "tag:Name",
                    "Values": [
                        "Production"
                    ]
                }
            ],
            "OwnerInformation": "CostCenter1",
            "Name": "Target1"
        }
    ]
}
```

## 'describe-maintenance-window-tasks' 的示例
<a name="mw-cli-tutorials-describe-maintenance-window-tasks"></a>

**显示调用 SSM 命令文档 `AWS-RunPowerShellScript` 的所有已注册任务**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-tasks \
    --window-id "mw-0c50858d01EXAMPLE" \
    --filters "Key=TaskArn,Values=AWS-RunPowerShellScript"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-tasks ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --filters "Key=TaskArn,Values=AWS-RunPowerShellScript"
```

------

系统返回类似于以下内容的信息。

```
{
   "Tasks":[
      {
         "ServiceRoleArn": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
         "MaxErrors":"1",
         "TaskArn":"AWS-RunPowerShellScript",
         "MaxConcurrency":"1",
         "WindowTaskId":"4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
         "TaskParameters":{
            "commands":{
               "Values":[
                  "driverquery.exe"
               ]
            }
         },
         "Priority":3,
         "Type":"RUN_COMMAND",
         "Targets":[
            {
               "TaskTargetId":"i-02573cafcfEXAMPLE",
               "TaskTargetType":"INSTANCE"
            }
         ]
      },
      {
         "ServiceRoleArn":"arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
         "MaxErrors":"1",
         "TaskArn":"AWS-RunPowerShellScript",
         "MaxConcurrency":"1",
         "WindowTaskId":"4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
         "TaskParameters":{
            "commands":{
               "Values":[
                  "ipconfig"
               ]
            }
         },
         "Priority":1,
         "Type":"RUN_COMMAND",
         "Targets":[
            {
               "TaskTargetId":"i-02573cafcfEXAMPLE",
               "TaskTargetType":"WINDOW_TARGET"
            }
         ]
      }
   ]
}
```

**显示优先级为“3”的所有已注册任务**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-tasks \
    --window-id "mw-9a8b7c6d5eEXAMPLE" \
    --filters "Key=Priority,Values=3"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-tasks ^
    --window-id "mw-9a8b7c6d5eEXAMPLE" ^
    --filters "Key=Priority,Values=3"
```

------

系统返回类似于以下内容的信息。

```
{
   "Tasks":[
      {
         "ServiceRoleArn":"arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
         "MaxErrors":"1",
         "TaskArn":"AWS-RunPowerShellScript",
         "MaxConcurrency":"1",
         "WindowTaskId":"4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
         "TaskParameters":{
            "commands":{
               "Values":[
                  "driverquery.exe"
               ]
            }
         },
         "Priority":3,
         "Type":"RUN_COMMAND",
         "Targets":[
            {
               "TaskTargetId":"i-02573cafcfEXAMPLE",
               "TaskTargetType":"INSTANCE"
            }
         ]
      }
   ]
}
```

**显示优先级为 1 且使用 Run Command 的所有已注册任务**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-tasks \
    --window-id "mw-0c50858d01EXAMPLE" \
    --filters "Key=Priority,Values=1" "Key=TaskType,Values=RUN_COMMAND"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-tasks ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --filters "Key=Priority,Values=1" "Key=TaskType,Values=RUN_COMMAND"
```

------

系统返回类似于以下内容的信息。

```
{
    "Tasks": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
            "TaskArn": "AWS-RunShellScript",
            "Type": "RUN_COMMAND",
            "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "i-02573cafcfEXAMPLE"
                    ]
                }
            ],
            "TaskParameters": {},
            "Priority": 1,
            "ServiceRoleArn": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
            "MaxConcurrency": "1",
            "MaxErrors": "1"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowTaskId": "8a5c4629-31b0-4edd-8aea-33698EXAMPLE",
            "TaskArn": "AWS-UpdateSSMAgent",
            "Type": "RUN_COMMAND",
            "Targets": [
                {
                    "Key": "InstanceIds",
                    "Values": [
                        "i-0471e04240EXAMPLE"
                    ]
                }
            ],
            "TaskParameters": {},
            "Priority": 1,
            "ServiceRoleArn": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
            "MaxConcurrency": "1",
            "MaxErrors": "1",
            "Name": "My-Run-Command-Task",
            "Description": "My Run Command task to update SSM Agent on an instance"
        }
    ]
}
```

## 'describe-maintenance-windows-for-target' 的示例
<a name="mw-cli-tutorials-describe-maintenance-windows-for-target"></a>

**列出与特定节点关联的维护时段目标或任务的相关信息**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-windows-for-target \
    --resource-type INSTANCE \
    --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE" \
    --max-results 10
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-windows-for-target ^
    --resource-type INSTANCE ^
    --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE" ^
    --max-results 10
```

------

系统返回类似于以下内容的信息。

```
{
    "WindowIdentities": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window"
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "Name": "My-Second-Maintenance-Window"
        }
    ]
}
```

## 'describe-maintenance-window-executions' 的示例
<a name="mw-cli-tutorials-describe-maintenance-window-executions"></a>

**列出在特定日期前运行的所有任务**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-executions \
    --window-id "mw-9a8b7c6d5eEXAMPLE" \
    --filters "Key=ExecutedBefore,Values=2019-05-12T05:00:00Z"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-executions ^
    --window-id "mw-9a8b7c6d5eEXAMPLE" ^
    --filters "Key=ExecutedBefore,Values=2019-05-12T05:00:00Z"
```

------

系统返回类似于以下内容的信息。

```
{
    "WindowExecutions": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
            "Status": "FAILED",
            "StatusDetails": "The following SSM parameters are invalid: LevelUp",
            "StartTime": 1557617747.993,
            "EndTime": 1557617748.101
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "WindowExecutionId": "791b72e0-f0da-4021-8b35-f95dfEXAMPLE",
            "Status": "SUCCESS",
            "StartTime": 1557594085.428,
            "EndTime": 1557594090.978
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowExecutionId": "ecec60fa-6bb0-4d26-98c7-140308EXAMPLE",
            "Status": "SUCCESS",
            "StartTime": 1557593793.483,
            "EndTime": 1557593798.978
        }
    ]
}
```

**列出在特定日期后运行的所有任务**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-executions \
    --window-id "mw-9a8b7c6d5eEXAMPLE" \
    --filters "Key=ExecutedAfter,Values=2018-12-31T17:00:00Z"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-executions ^
    --window-id "mw-9a8b7c6d5eEXAMPLE" ^
    --filters "Key=ExecutedAfter,Values=2018-12-31T17:00:00Z"
```

------

系统返回类似于以下内容的信息。

```
{
    "WindowExecutions": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
            "Status": "FAILED",
            "StatusDetails": "The following SSM parameters are invalid: LevelUp",
            "StartTime": 1557617747.993,
            "EndTime": 1557617748.101
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "WindowExecutionId": "791b72e0-f0da-4021-8b35-f95dfEXAMPLE",
            "Status": "SUCCESS",
            "StartTime": 1557594085.428,
            "EndTime": 1557594090.978
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "WindowExecutionId": "ecec60fa-6bb0-4d26-98c7-140308EXAMPLE",
            "Status": "SUCCESS",
            "StartTime": 1557593793.483,
            "EndTime": 1557593798.978
        }
    ]
}
```

## 'describe-maintenance-window-schedule' 的示例
<a name="mw-cli-tutorials-describe-maintenance-window-schedule"></a>

**显示特定节点接下来的十次已计划的维护时段运行**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-schedule \
    --resource-type INSTANCE \
    --targets "Key=InstanceIds,Values=i-07782c72faEXAMPLE" \
    --max-results 10
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-schedule ^
    --resource-type INSTANCE ^
    --targets "Key=InstanceIds,Values=i-07782c72faEXAMPLE" ^
    --max-results 10
```

------

系统返回类似于以下内容的信息。

```
{
    "ScheduledWindowExecutions": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-05-18T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-05-25T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-06-01T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-06-08T23:35:24.902Z"
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "Name": "My-Second-Maintenance-Window",
            "ExecutionTime": "2019-06-15T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-06-22T23:35:24.902Z"
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "Name": "My-Second-Maintenance-Window",
            "ExecutionTime": "2019-06-29T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-07-06T23:35:24.902Z"
        },
        {
            "WindowId": "mw-9a8b7c6d5eEXAMPLE",
            "Name": "My-Second-Maintenance-Window",
            "ExecutionTime": "2019-07-13T23:35:24.902Z"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "My-First-Maintenance-Window",
            "ExecutionTime": "2019-07-20T23:35:24.902Z"
        }
    ],
    "NextToken": "AAEABUXdceT92FvtKld/dGHELj5Mi+GKW/EXAMPLE"
}
```

**显示使用特定键值对标记的节点的维护时段计划**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-schedule \
    --resource-type INSTANCE \
    --targets "Key=tag:prod,Values=rhel7"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-schedule ^
    --resource-type INSTANCE ^
    --targets "Key=tag:prod,Values=rhel7"
```

------

系统返回类似于以下内容的信息。

```
{
    "ScheduledWindowExecutions": [
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "DemoRateStartDate",
            "ExecutionTime": "2019-10-20T05:34:56-07:00"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "DemoRateStartDate",
            "ExecutionTime": "2019-10-21T05:34:56-07:00"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "DemoRateStartDate",
            "ExecutionTime": "2019-10-22T05:34:56-07:00"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "DemoRateStartDate",
            "ExecutionTime": "2019-10-23T05:34:56-07:00"
        },
        {
            "WindowId": "mw-0c50858d01EXAMPLE",
            "Name": "DemoRateStartDate",
            "ExecutionTime": "2019-10-24T05:34:56-07:00"
        }
    ],
    "NextToken": "AAEABccwSXqQRGKiTZ1yzGELR6cxW4W/EXAMPLE"
}
```

**显示某个维护时段接下来的四个运行的开始时间**  
运行如下命令。

------
#### [ Linux & macOS ]

```
aws ssm describe-maintenance-window-schedule \
    --window-id "mw-0c50858d01EXAMPLE" \
    --max-results "4"
```

------
#### [ Windows ]

```
aws ssm describe-maintenance-window-schedule ^
    --window-id "mw-0c50858d01EXAMPLE" ^
    --max-results "4"
```

------

系统返回类似于以下内容的信息。

```
{
    "WindowSchedule": [
        {
            "ScheduledWindowExecutions": [
                {
                    "ExecutionTime": "2019-10-04T10:10:10Z",
                    "Name": "My-First-Maintenance-Window",
                    "WindowId": "mw-0c50858d01EXAMPLE"
                },
                {
                    "ExecutionTime": "2019-10-11T10:10:10Z",
                    "Name": "My-First-Maintenance-Window",
                    "WindowId": "mw-0c50858d01EXAMPLE"
                },
                {
                    "ExecutionTime": "2019-10-18T10:10:10Z",
                    "Name": "My-First-Maintenance-Window",
                    "WindowId": "mw-0c50858d01EXAMPLE"
                },
                {
                    "ExecutionTime": "2019-10-25T10:10:10Z",
                    "Name": "My-First-Maintenance-Window",
                    "WindowId": "mw-0c50858d01EXAMPLE"
                }
            ]
        }
    ]
}
```

# 教程：查看有关任务和使用 AWS CLI 执行任务的信息
<a name="mw-cli-tutorial-task-info"></a>

本教程演示了如何使用 AWS Command Line Interface (AWS CLI) 查看有关您已完成的维护时段任务的详细信息。

如果您直接从 [教程：使用 AWS CLI 创建和配置维护时段](maintenance-windows-cli-tutorials-create.md) 继续，请确保您已为维护时段留出足够时间至少运行一次，以查看其执行结果。

在按照本教程中的步骤操作时，请将以斜体*红色*文本显示的值替换为您自己的选项和 ID。例如，请将维护时段 ID *mw-0c50858d01EXAMPLE* 和实例 ID *i-02573cafcfEXAMPLE* 替换为您创建的资源的 ID。

**要查看有关任务和使用 AWS CLI 执行任务的信息**

1. 运行以下命令，查看特定维护时段的任务执行列表。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-executions \
       --window-id "mw-0c50858d01EXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-executions ^
       --window-id "mw-0c50858d01EXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutions": [
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
               "Status": "SUCCESS",
               "StartTime": 1557593793.483,
               "EndTime": 1557593798.978
           },
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowExecutionId": "791b72e0-f0da-4021-8b35-f95dfEXAMPLE",
               "Status": "SUCCESS",
               "StartTime": 1557593493.096,
               "EndTime": 1557593498.611
           },
           {
               "WindowId": "mw-0c50858d01EXAMPLE",
               "WindowExecutionId": "ecec60fa-6bb0-4d26-98c7-140308EXAMPLE",
               "Status": "SUCCESS",
               "StatusDetails": "No tasks to execute.",
               "StartTime": 1557593193.309,
               "EndTime": 1557593193.334
           }
       ]
   }
   ```

1. 运行以下命令，获取有关维护时段任务执行的信息。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-maintenance-window-execution \
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm get-maintenance-window-execution ^
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
       "TaskIds": [
           "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE"
       ],
       "Status": "SUCCESS",
       "StartTime": 1557593493.096,
       "EndTime": 1557593498.611
   }
   ```

1. 运行以下命令，列出作为维护时段执行的组成部分运行的任务。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-execution-tasks \
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-execution-tasks ^
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutionTaskIdentities": [
           {
               "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
               "TaskExecutionId": "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE",
               "Status": "SUCCESS",
               "StartTime": 1557593493.162,
               "EndTime": 1557593498.57,
               "TaskArn": "AWS-RunShellScript",
               "TaskType": "RUN_COMMAND"
           }
       ]
   }
   ```

1. 运行以下命令，获取有关任务执行的详情。

------
#### [ Linux & macOS ]

   ```
   aws ssm get-maintenance-window-execution-task \
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE" \
       --task-id "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm get-maintenance-window-execution-task ^
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE" ^
       --task-id "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
       "TaskExecutionId": "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE",
       "TaskArn": "AWS-RunShellScript",
       "ServiceRole": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
       "Type": "RUN_COMMAND",
       "TaskParameters": [
           {
               "aws:InstanceId": {
                   "Values": [
                       "i-02573cafcfEXAMPLE"
                   ]
               },
               "commands": {
                   "Values": [
                       "df"
                   ]
               }
           }
       ],
       "Priority": 10,
       "MaxConcurrency": "1",
       "MaxErrors": "1",
       "Status": "SUCCESS",
       "StartTime": 1557593493.162,
       "EndTime": 1557593498.57
   }
   ```

1. 运行以下命令，获取执行某个任务时执行的具体任务调用。

------
#### [ Linux & macOS ]

   ```
   aws ssm describe-maintenance-window-execution-task-invocations \
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE" \
       --task-id "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE"
   ```

------
#### [ Windows ]

   ```
   aws ssm describe-maintenance-window-execution-task-invocations ^
       --window-execution-id "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE" ^
       --task-id "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowExecutionTaskInvocationIdentities": [
           {
               "WindowExecutionId": "14bea65d-5ccc-462d-a2f3-e99c8EXAMPLE",
               "TaskExecutionId": "c9b05aba-197f-4d8d-be34-e73fbEXAMPLE",
               "InvocationId": "c336d2ab-09de-44ba-8f6a-6136cEXAMPLE",
               "ExecutionId": "76a5a04f-caf6-490c-b448-92c02EXAMPLE",
               "TaskType": "RUN_COMMAND",
               "Parameters": "{\"documentName\":\"AWS-RunShellScript\",\"instanceIds\":[\"i-02573cafcfEXAMPLE\"],\"maxConcurrency\":\"1\",\"maxErrors\":\"1\",\"parameters\":{\"commands\":[\"df\"]}}",
               "Status": "SUCCESS",
               "StatusDetails": "Success",
               "StartTime": 1557593493.222,
               "EndTime": 1557593498.466
           }
       ]
   }
   ```

# 教程：使用 AWS CLI 更新维护时段
<a name="maintenance-windows-cli-tutorials-update"></a>

本教程演示了如何使用 AWS Command Line Interface (AWS CLI) 更新维护时段。它还向您演示了如何更新不同的任务类型，包括 AWS Systems Manager Run Command、自动化、AWS Lambda 和 AWS Step Functions 任务类型。

本节中的示例使用以下 Systems Manager 操作来更新维护时段。
+ [UpdateMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateMaintenanceWindow.html)
+ [UpdateMaintenanceWindowTarget](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateMaintenanceWindowTarget.html)
+ [UpdateMaintenanceWindowTask](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_UpdateMaintenanceWindowTask.html)
+ [DeregisterTargetFromMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DeregisterTargetFromMaintenanceWindow.html)

有关使用 Systems Manager 控制台来更新维护时段的信息，请参阅 [使用控制台更新或删除维护时段资源](sysman-maintenance-update.md)。

在按照本教程中的步骤操作时，请将以斜体*红色*文本显示的值替换为您自己的选项和 ID。例如，请将维护时段 ID *mw-0c50858d01EXAMPLE* 和实例 ID *i-02573cafcfEXAMPLE* 替换为您创建的资源的 ID。

**要使用 AWS CLI 更新维护时段**

1. 打开 AWS CLI 并运行以下命令将目标更新为包括名称和描述。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-target \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --name "My-Maintenance-Window-Target" \
       --description "Description for my maintenance window target"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-target ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --name "My-Maintenance-Window-Target" ^
       --description "Description for my maintenance window target"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTargetId": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE",
       "Targets": [
           {
               "Key": "InstanceIds",
               "Values": [
                   "i-02573cafcfEXAMPLE"
               ]
           }
       ],
       "Name": "My-Maintenance-Window-Target",
       "Description": "Description for my maintenance window target"
   }
   ```

1. 运行以下命令，使用 `replace` 选项来删除描述字段和添加更多目标。描述字段被删除，因为更新不包含该字段（空值）。请务必指定已配置为用于 Systems Manager 的其他节点。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-target \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-target-id "d208dedf-3f6b-41ff-ace8-8e751EXAMPLE" \
       --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE,i-0471e04240EXAMPLE" \
       --name "My-Maintenance-Window-Target" \
       --replace
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-target ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-target-id "d208dedf-3f6b-41ff-ace8-8e751EXAMPLE" ^
       --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE,i-0471e04240EXAMPLE" ^
       --name "My-Maintenance-Window-Target" ^
       --replace
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTargetId": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE",
       "Targets": [
           {
               "Key": "InstanceIds",
               "Values": [
                   "i-02573cafcfEXAMPLE",
                   "i-0471e04240EXAMPLE"
               ]
           }
       ],
       "Name": "My-Maintenance-Window-Target"
   }
   ```

1. `start-date` 选项用于将维护时段的激活时间延迟到一个指定的未来日期。`end-date` 选项用于设置在某个未来的日期和时间后不再运行维护时段。请以 ISO-8601 扩展格式指定这些选项。

   运行以下命令可为定期执行的维护时段指定日期和时间范围。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window \
       --window-id "mw-0c50858d01EXAMPLE" \
       --start-date "2020-10-01T10:10:10Z" \
       --end-date "2020-11-01T10:10:10Z"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --start-date "2020-10-01T10:10:10Z" ^
       --end-date "2020-11-01T10:10:10Z"
   ```

------

1. 运行以下命令可更新 Run Command 任务。
**提示**  
如果您的目标是 Windows Server 的 Amazon Elastic Compute Cloud (Amazon EC2) 实例，请将以下命令中的 `df` 更改为 `ipconfig`，并将 `AWS-RunShellScript` 更改为 `AWS-RunPowerShellScript`。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-task \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" \
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --task-arn "AWS-RunShellScript" \
       --service-role-arn "arn:aws:iam::account-id:role/MaintenanceWindowsRole" \
       --task-invocation-parameters "RunCommand={Comment=Revising my Run Command task,Parameters={commands=df}}" \
       --priority 1 --max-concurrency 10 --max-errors 4 \
       --name "My-Task-Name" --description "A description for my Run Command task"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-task ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" ^
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --task-arn "AWS-RunShellScript" ^
       --service-role-arn "arn:aws:iam::account-id:role/MaintenanceWindowsRole" ^
       --task-invocation-parameters "RunCommand={Comment=Revising my Run Command task,Parameters={commands=df}}" ^
       --priority 1 --max-concurrency 10 --max-errors 4 ^
       --name "My-Task-Name" --description "A description for my Run Command task"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
       "Targets": [
           {
               "Key": "WindowTargetIds",
               "Values": [
                   "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
               ]
           }
       ],
       "TaskArn": "AWS-RunShellScript",
       "ServiceRoleArn": "arn:aws:iam::111122223333:role/MaintenanceWindowsRole",
       "TaskParameters": {},
       "TaskInvocationParameters": {
           "RunCommand": {
               "Comment": "Revising my Run Command task",
               "Parameters": {
                   "commands": [
                       "df"
                   ]
               }
           }
       },
       "Priority": 1,
       "MaxConcurrency": "10",
       "MaxErrors": "4",
       "Name": "My-Task-Name",
       "Description": "A description for my Run Command task"
   }
   ```

1. 改写并运行以下命令以更新 Lambda 任务。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-task \
       --window-id mw-0c50858d01EXAMPLE \
       --window-task-id 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE \
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --task-arn "arn:aws:lambda:region:111122223333:function:SSMTestLambda" \
       --service-role-arn "arn:aws:iam:account-id:role/MaintenanceWindowsRole" \
       --task-invocation-parameters '{"Lambda":{"Payload":"{\"InstanceId\":\"{{RESOURCE_ID}}\",\"targetType\":\"{{TARGET_TYPE}}\"}"}}' \
       --priority 1 --max-concurrency 10 --max-errors 5 \
       --name "New-Lambda-Task-Name" \
       --description "A description for my Lambda task"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-task ^
       --window-id mw-0c50858d01EXAMPLE ^
       --window-task-id 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE ^
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --task-arn --task-arn "arn:aws:lambda:region:111122223333:function:SSMTestLambda" ^
       --service-role-arn "arn:aws:iam:account-id:role/MaintenanceWindowsRole" ^
       --task-invocation-parameters '{"Lambda":{"Payload":"{\"InstanceId\":\"{{RESOURCE_ID}}\",\"targetType\":\"{{TARGET_TYPE}}\"}"}}' ^
       --priority 1 --max-concurrency 10 --max-errors 5 ^
       --name "New-Lambda-Task-Name" ^
       --description "A description for my Lambda task"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
       "Targets": [
           {
               "Key": "WindowTargetIds",
               "Values": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
           }
       ],
       "TaskArn": "arn:aws:lambda:us-east-2:111122223333:function:SSMTestLambda",
       "ServiceRoleArn": "arn:aws:iam::111122223333:role/MaintenanceWindowsRole",
       "TaskParameters": {},
       "TaskInvocationParameters": {
           "Lambda": {
               "Payload": "e30="
           }
       },
       "Priority": 1,
       "MaxConcurrency": "10",
       "MaxErrors": "5",
       "Name": "New-Lambda-Task-Name",
       "Description": "A description for my Lambda task"
   }
   ```

1. 如果您要更新 Step Functions 任务，请改写并运行以下命令，以更新其 task-invocation-parameters。

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-task \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" \
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --task-arn "arn:aws:states:region:execution:SSMStepFunctionTest" \
       --service-role-arn "arn:aws:iam:account-id:role/MaintenanceWindowsRole" \
       --task-invocation-parameters '{"StepFunctions":{"Input":"{\"InstanceId\":\"{{RESOURCE_ID}}\"}"}}' \
       --priority 0 --max-concurrency 10 --max-errors 5 \
       --name "My-Step-Functions-Task" \
       --description "A description for my Step Functions task"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-task ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" ^
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --task-arn "arn:aws:states:region:execution:SSMStepFunctionTest" ^
       --service-role-arn "arn:aws:iam:account-id:role/MaintenanceWindowsRole" ^
       --task-invocation-parameters '{"StepFunctions":{"Input":"{\"InstanceId\":\"{{RESOURCE_ID}}\"}"}}' ^
       --priority 0 --max-concurrency 10 --max-errors 5 ^
       --name "My-Step-Functions-Task" ^
       --description "A description for my Step Functions task"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
       "Targets": [
           {
               "Key": "WindowTargetIds",
               "Values": [
                   "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
               ]
           }
       ],
       "TaskArn": "arn:aws:states:us-east-2:111122223333:execution:SSMStepFunctionTest",
       "ServiceRoleArn": "arn:aws:iam::111122223333:role/MaintenanceWindowsRole",
       "TaskParameters": {},
       "TaskInvocationParameters": {
           "StepFunctions": {
               "Input": "{\"instanceId\":\"{{RESOURCE_ID}}\"}"
           }
       },
       "Priority": 0,
       "MaxConcurrency": "10",
       "MaxErrors": "5",
       "Name": "My-Step-Functions-Task",
       "Description": "A description for my Step Functions task"
   }
   ```

1. 运行以下命令可从维护时段中注销目标。本示例使用 `safe` 参数确定目标是否被任何任务引用，从而确定注销是否安全。

------
#### [ Linux & macOS ]

   ```
   aws ssm deregister-target-from-maintenance-window \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --safe
   ```

------
#### [ Windows ]

   ```
   aws ssm deregister-target-from-maintenance-window ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --safe
   ```

------

   系统返回类似于以下内容的信息。

   ```
   An error occurred (TargetInUseException) when calling the DeregisterTargetFromMaintenanceWindow operation: 
   This Target cannot be deregistered because it is still referenced in Task: 4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE
   ```

1. 运行以下命令可从维护时段注销目标，即使该目标已被某个任务引用。您可以使用 `no-safe` 参数强制执行注销操作。

------
#### [ Linux & macOS ]

   ```
   aws ssm deregister-target-from-maintenance-window \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" \
       --no-safe
   ```

------
#### [ Windows ]

   ```
   aws ssm deregister-target-from-maintenance-window ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-target-id "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE" ^
       --no-safe
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTargetId": "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
   }
   ```

1. 运行以下命令可更新 Run Command 任务。此示例使用名为 `UpdateLevel` 的 Systems Manager Parameter Store 参数，其格式如下所示：“`{{ssm:UpdateLevel}}`”

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-task \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" \
       --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE"  \
       --task-invocation-parameters "RunCommand={Comment=A comment for my task update,Parameters={UpdateLevel='{{ssm:UpdateLevel}}'}}"
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-task ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" ^
       --targets "Key=InstanceIds,Values=i-02573cafcfEXAMPLE"  ^
       --task-invocation-parameters "RunCommand={Comment=A comment for my task update,Parameters={UpdateLevel='{{ssm:UpdateLevel}}'}}"
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
       "Targets": [
           {
               "Key": "InstanceIds",
               "Values": [
                   "i-02573cafcfEXAMPLE"
               ]
           }
       ],
       "TaskArn": "AWS-RunShellScript",
       "ServiceRoleArn": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
       "TaskParameters": {},
       "TaskInvocationParameters": {
           "RunCommand": {
               "Comment": "A comment for my task update",
               "Parameters": {
                   "UpdateLevel": [
                       "{{ssm:UpdateLevel}}"
                   ]
               }
           }
       },
       "Priority": 10,
       "MaxConcurrency": "1",
       "MaxErrors": "1"
   }
   ```

1. 运行以下命令可更新 自动化 任务，为 `task-invocation-parameters` 参数指定 `WINDOW_ID` 和 `WINDOW_TASK_ID` 参数：

------
#### [ Linux & macOS ]

   ```
   aws ssm update-maintenance-window-task \
       --window-id "mw-0c50858d01EXAMPLE" \
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" \
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE \
       --task-arn "AutoTestDoc" \
       --service-role-arn "arn:aws:iam:account-id:role/MyMaintenanceWindowServiceRole \
       --task-invocation-parameters "Automation={Parameters={InstanceId='{{RESOURCE_ID}}',initiator='{{WINDOW_ID}}.Task-{{WINDOW_TASK_ID}}'}}" \
       --priority 3 --max-concurrency 10 --max-errors 5
   ```

------
#### [ Windows ]

   ```
   aws ssm update-maintenance-window-task ^
       --window-id "mw-0c50858d01EXAMPLE" ^
       --window-task-id "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE" ^
       --targets "Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE ^
       --task-arn "AutoTestDoc" ^
       --service-role-arn "arn:aws:iam:account-id:role/MyMaintenanceWindowServiceRole ^
       --task-invocation-parameters "Automation={Parameters={InstanceId='{{RESOURCE_ID}}',initiator='{{WINDOW_ID}}.Task-{{WINDOW_TASK_ID}}'}}" ^
       --priority 3 --max-concurrency 10 --max-errors 5
   ```

------

   系统返回类似于以下内容的信息。

   ```
   {
       "WindowId": "mw-0c50858d01EXAMPLE",
       "WindowTaskId": "4f7ca192-7e9a-40fe-9192-5cb15EXAMPLE",
       "Targets": [
           {
               "Key": "WindowTargetIds",
               "Values": [
                   "e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE"
               ]
           }
       ],
       "TaskArn": "AutoTestDoc",
       "ServiceRoleArn": "arn:aws:iam::111122223333:role/MyMaintenanceWindowServiceRole",
       "TaskParameters": {},
       "TaskInvocationParameters": {
           "Automation": {
               "Parameters": {
                   "multi": [
                       "{{WINDOW_TASK_ID}}"
                   ],
                   "single": [
                       "{{WINDOW_ID}}"
                   ]
               }
           }
       },
       "Priority": 0,
       "MaxConcurrency": "10",
       "MaxErrors": "5",
       "Name": "My-Automation-Task",
       "Description": "A description for my Automation task"
   }
   ```

# 教程：使用 AWS CLI 删除维护时段
<a name="mw-cli-tutorial-delete-mw"></a>

要删除您在这些教程中创建的维护时段，请运行以下命令。

```
aws ssm delete-maintenance-window --window-id "mw-0c50858d01EXAMPLE"
```

系统返回类似于以下内容的信息。

```
{
   "WindowId":"mw-0c50858d01EXAMPLE"
}
```

# 教程：使用控制台创建修补的维护时段
<a name="maintenance-window-tutorial-patching"></a>

**重要**  
您可以继续使用此早期主题来创建用于修补的维护时段。但是，我们建议您使用补丁策略。有关更多信息，请参阅[Quick Setup 中的补丁策略配置](patch-manager-policies.md)和[使用 Quick Setup 补丁策略为组织中的实例配置修补](quick-setup-patch-manager.md)。

为了最大程度减少对服务器可用性的影响，我们建议您将维护时段配置为在不中断业务运营的时间运行修补。

您必须先为 Maintenance Windows（AWS Systems Manager 中的一项工具）配置角色和权限，然后才能开始此过程。有关更多信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。

**创建维护时段以进行修补**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Maintenance Windows**。

1. 选择**创建维护时段**。

1. 在**名称**字段中输入一个名称，将其指定为用于修补关键更新和重要更新的维护时段。

1. （可选）对于**描述**，输入描述。

1. 如果您希望即便没有将托管式节点注册为目标，也允许维护时段任务在这些节点上运行，则选择 **Allow unregistered targets**（允许未注册的目标）。

   如果选择了此选项，您在将任务注册到维护时段时便可以选择已注销节点（按节点 ID）。

   如果未选择此选项，您在将任务注册到维护时段时就必须选择之前注册的目标。

1. 在 **Schedule (计划)** 部分的顶部，通过使用三个计划选项之一来为维护时段指定计划。

   有关构建 cron/rate 表达式的信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

1. 对于 **Duration (持续时间)**，输入维护时段将运行的小时数。您指定的值根据维护时段的开始时间确定维护时段的具体结束时间。在最终结束时间减去您在下一步中为 **Stop initiating tasks (停止启动任务)** 指定的小时数后，不允许启动维护时段任务。

   例如，如果维护时段从下午 3 点开始，持续时间是 3 个小时，并且 **Stop initiating tasks (停止启动任务)** 值是 1 个小时，则下午 5 点之后将无法启动维护时段任务。

1. 在**停止启动任务**中，输入系统应该在维护时段结束前几小时停止计划要运行的新任务。

1. （可选）对于 **Window start date**（时段开始日期），请以 ISO-8601 扩展格式指定您希望维护时段变为活动状态的日期和时间。这让您可以将维护时段的激活时间推迟到指定的将来日期。

1. （可选）对于 **Window end date**（时段结束日期），请以 ISO-8601 扩展格式指定您希望维护时段变为不活动状态的日期和时间。这样可以设置在某个未来的日期和时间后不再运行维护时段。

1. （可选）对于**计划时区**，请以互联网编号分配机构（IANA）格式指定时区，计划的维护时段执行将基于该时区。例如：“America/Los\$1Angeles”、“etc/UTC”或“Asia/Seoul”。

   有关有效格式的更多信息，请参阅 IANA 网站上的 [Time Zone Database](https://www.iana.org/time-zones)。

1. （可选）在**管理标签**区域，将一个或多个标签键名称/值对应用到维护时段。

   标签是您分配给资源的可选元数据。标签可让您按不同的方式（如用途、拥有者或环境）对资源进行分类。例如，您可能需要标记此维护时段来标识它运行的任务的类型。在这种情况下，您可以指定以下键名/键值对：
   + `Key=TaskType,Value=Patching`

1. 选择**创建维护时段**。

1. 在维护时段列表中，请选择您刚刚创建的维护时段，然后选择**操作**和**注册目标**。

1. (可选) 在 **Maintenance window target details** 部分中，为此目标提供名称、描述和所有者信息 (您的姓名或别名)。

1. 对于**目标选择**，选择**指定实例标签**。

1. 对于**指定实例标签**，输入标签键和标签值来标识要注册到维护时段的节点，然后选择**添加**。

1. 选择**注册目标**。系统会创建维护时段目标。

1. 在创建的维护时段的详细信息页面中，选择 **Actions (操作)** 和 **Register Run command task (注册 Run Command 任务)**。

1. （可选）对于 **Maintenance window task details (维护时段任务详细信息)**，为此任务提供名称和描述。

1. 对于 **Command document (命令文档)**，选择 `AWS-RunPatchBaseline`。

1. 对于 **Task priority (任务优先级)**，请选择一个优先级。零 (`0`) 表示最高优先级。

1. 对于**目标**，在**定位方式** 下，选择在此过程中先前创建的维护时段目标。

1. 对于 **Rate control（速率控制）**：
   + 对于 **Concurrency**（并发），请指定要同时运行该命令的托管式节点的数量或百分比。
**注意**  
如果您通过指定应用于托管式节点的标签或指定 AWS Resource Groups 来选择目标，但不确定有多少个托管式节点已被设为目标，则可通过指定百分比来限制可同时运行该文档的目标的数量。
   + 对于 **Error threshold**（错误阈值），请指定当命令在一定数量或百分比的节点上失败后，何时在其他托管式节点上停止运行该命令。例如，如果您指定三个错误，Systems Manager 将在收到第四个错误时停止发送该命令。仍在处理该命令的托管式节点也可能发送错误。

1. （可选）对于 **IAM 服务角色**，选择一个角色以向 Systems Manager 提供运行维护时段任务时所承担的权限。

   如果您未指定服务角色 ARN，Systems Manager 将使用您账户中的服务相关角色。如果您的账户中没有适用于 Systems Manager 的适当服务相关角色，则将在成功注册任务后创建该角色。
**注意**  
为了改善安全状况，强烈建议您创建自定义策略和自定义服务角色来运行维护时段任务。可以精心设计该策略，只提供特定维护时段任务所需的权限。有关更多信息，请参阅 [设置 Maintenance Windows](setting-up-maintenance-windows.md)。

1. （可选）对于 **Output options (输出选项)**，要将命令输出保存到文件，请选中 **Enable writing output to S3 (启用将输出写入 S3)** 方框。在方框中输入存储桶和前缀（文件夹）名称。
**注意**  
授予将数据写入 S3 存储桶的能力的 S3 权限，是分配给托管式节点的实例配置文件的权限，而不是执行此任务的 IAM 用户的权限。有关更多信息，请参阅[配置 Systems Manager 所需的实例权限](setup-instance-permissions.md)或[为混合环境创建 IAM 服务角色](hybrid-multicloud-service-role.md)。此外，如果指定的 S3 存储桶位于不同的 AWS 账户 中，请确认与该托管式节点关联的实例配置文件或 IAM 服务角色具有写入该存储桶的所需权限。

   要将输出流式传输到 Amazon CloudWatch Logs 日志组，请选择 **CloudWatch output (CloudWatch 输出)** 框。在该框中输入日志组名称。

1. 在 **SNS notifications (SNS 通知)** 部分中，如果希望发送有关命令执行状态的通知，请选中 **Enable SNS notifications (启用 SNS 通知)** 复选框。

   有关为 Run Command 配置 Amazon SNS 通知的更多信息，请参阅 [使用 Amazon SNS 通知监控 Systems Manager 状态更改](monitoring-sns-notifications.md)。

1. 对于 **Parameters (参数)**：
   + 对于 **Operation (操作)**，选择 **Scan (扫描)** 扫描缺失的补丁，或选择 **Install (安装)** 扫描并安装缺失的补丁。
   + 您不需要在 **Snapshot Id (快照 ID)** 字段中输入任何值。此系统将自动生成并提供此参数。
   + 除非您希望 Patch Manager 使用与为补丁基准指定的补丁集不同的补丁集，否则无需在 **Install Override List (安装覆盖列表)** 字段中输入任何内容。有关信息，请参阅[参数名称: `InstallOverrideList`](patch-manager-aws-runpatchbaseline.md#patch-manager-aws-runpatchbaseline-parameters-installoverridelist)。
   + 对于**重启选项**，请指定您是希望在 `Install` 操作期间安装补丁时，还是在 Patch Manager 检测到自上次重启节点以来安装的其他补丁时重启节点。有关信息，请参阅[参数名称: `RebootOption`](patch-manager-aws-runpatchbaseline.md#patch-manager-aws-runpatchbaseline-parameters-norebootoption)。
   + （可选）对于 **Comment (注释)**，输入有关此命令的跟踪备注或提醒。
   + 对于 **Timeout (seconds)（超时（秒））**，输入系统在认为操作失败前等待操作完成的秒数。

1. 选择**注册运行命令任务**。

维护时段任务完成后，您可以通过 Systems Manager 控制台中的 [Fleet Manager](fleet-manager.md) 工具查看补丁合规性详细信息。

您还可以在**合规性报告**选项卡上的[Patch Manager](patch-manager.md)工具中查看合规性信息。

您也可以使用 [DescribePatchGroupState](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribePatchGroupState.html) 和 [DescribeInstancePatchStatesForPatchGroup](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_DescribeInstancePatchStatesForPatchGroup.html) API 来查看合规性详细信息。有关补丁合规性数据的信息，请参阅 [关于补丁合规性](compliance-about.md#compliance-monitor-patch)。

# 使用维护时段修补计划
<a name="sysman-patch-scheduletasks"></a>

配置补丁基准（可以选择配置补丁组）后，您可以使用维护时段将补丁应用于您的节点。维护时段通过让您指定在不中断业务运营的时间执行修补流程，可以减少对服务器可用性的影响。维护时段的操作如下：

1. 创建带修补操作计划的维护时段。

1. 通过为标签名称指定 `Patch Group` 或 `PatchGroup` 标签，并指定已定义 Amazon Elastic Compute Cloud (Amazon EC2) 标签的任意值（例如，“web 服务器”或“US-EAST-PROD”），来选择维护时段的目标。（如果[在 EC2 实例元数据中允许使用标签](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/Using_Tags.html#allow-access-to-tags-in-IMDS)，则必须使用 `PatchGroup`，且不能使用空格。

1. 创建新的维护时段任务，并指定 `AWS-RunPatchBaseline` 文档。

在配置任务时，可以选择扫描节点，也可以选择扫描并安装节点上的补丁。如果选择扫描节点，则Patch Manager（AWS Systems Manager 中的一项工具）会扫描每个节点，并生成缺失补丁的列表供您审核。

如果选择扫描和安装补丁，Patch Manager 将扫描每个节点，并将已安装补丁的列表与基准中已批准补丁的列表进行比较。Patch Manager 将标识缺失的补丁，然后下载并安装所有缺失和批准的补丁。

如果希望执行一次性扫描或安装来修复问题，可以使用 Run Command 直接调用 `AWS-RunPatchBaseline` 文档。

**重要**  
在安装补丁后，Systems Manager 会重启每个节点。需要重启才能确保正确安装补丁，并确保系统不会使节点处于潜在的不良状态。（例外：如果将 `AWS-RunPatchBaseline` 文档中的 `RebootOption` 参数设置为 `NoReboot`，则在 Patch Manager 运行后不会重启托管式节点。有关更多信息，请参阅 [参数名称: `RebootOption`](patch-manager-aws-runpatchbaseline.md#patch-manager-aws-runpatchbaseline-parameters-norebootoption)。） 

# 注册维护时段任务时使用伪参数
<a name="maintenance-window-tasks-pseudo-parameters"></a>

当您在 Maintenance Windows（AWS Systems Manager 中的一项工具）中注册任务时，可以指定分别对于四种任务类型唯一的参数。（在 CLI 命令中，这些参数是使用 `--task-invocation-parameters` 选项提供的。）

 您还可以使用*伪参数* 语法引用特定值，例如 `{{RESOURCE_ID}}`、`{{TARGET_TYPE}}` 和 `{{WINDOW_TARGET_ID}}`。维护时段任务运行时，它传递正确的值而不是伪参数占位符。本主题后面的 [支持的伪参数](#pseudo-parameters) 中提供了您可以使用的伪参数的完整列表。

**重要**  
对于目标类型 `RESOURCE_GROUP`，根据任务所需的 ID 格式，您可以在任务运行时选择是使用 `{{TARGET_ID}}` 还是使用 `{{RESOURCE_ID}}` 来引用资源。`{{TARGET_ID}}` 返回资源的完整 ARN。`{{RESOURCE_ID}}` 仅返回资源的较短名称或 ID，如以下示例所示。  
`{{TARGET_ID}}` 格式：`arn:aws:ec2:us-east-1:123456789012:instance/i-02573cafcfEXAMPLE`
`{{RESOURCE_ID}}` 格式：`i-02573cafcfEXAMPLE`
对于目标类型 `INSTANCE`，`{{TARGET_ID}}` 和 `{{RESOURCE_ID}}` 参数两者仅生成实例 ID。有关更多信息，请参阅 [支持的伪参数](#pseudo-parameters)。  
`{{TARGET_ID}}` 和 `{{RESOURCE_ID}}` 可用于将 AWS 资源的 ID 仅传递到 自动化、Lambda 和 Step Functions 任务。这两个伪参数不能用于 Run Command 任务。

## 伪参数示例
<a name="pseudo-parameter-examples"></a>

假设 AWS Lambda 任务的有效负载需要通过其 ID 引用实例。

无论您使用的是 `INSTANCE` 维护时段目标，还是 `RESOURCE_GROUP` 维护时段目标，这都可以通过使用 `{{RESOURCE_ID}}` 虚拟参数来实现。例如：

```
"TaskArn": "arn:aws:lambda:us-east-2:111122223333:function:SSMTestFunction",
    "TaskType": "LAMBDA",
    "TaskInvocationParameters": {
        "Lambda": {
            "ClientContext": "ew0KICAi--truncated--0KIEXAMPLE",
            "Payload": "{ \"instanceId\": \"{{RESOURCE_ID}}\" }",
            "Qualifier": "$LATEST"
        }
    }
```

如果您的 Lambda 任务旨在针对 Amazon Elastic Compute Cloud (Amazon EC2) 实例之外的其他受支持的目标类型运行（如 Amazon DynamoDB 表），则可以使用相同的语法，并且 `{{RESOURCE_ID}}` 仅生成该表的名称。但是，如果您需要表的完整 ARN，请使用 `{{TARGET_ID}}`，如以下示例所示。

```
"TaskArn": "arn:aws:lambda:us-east-2:111122223333:function:SSMTestFunction",
    "TaskType": "LAMBDA",
    "TaskInvocationParameters": {
        "Lambda": {
            "ClientContext": "ew0KICAi--truncated--0KIEXAMPLE",
            "Payload": "{ \"tableArn\": \"{{TARGET_ID}}\" }",
            "Qualifier": "$LATEST"
        }
    }
```

相同的语法适用于目标实例或其他资源类型。将多个资源类型添加到资源组时，任务将针对每个适当的资源运行。

**重要**  
并非所有可能包含在资源组中的资源类型都为 `{{RESOURCE_ID}}` 参数生成值。有关受支持的资源类型的列表，请参阅 [支持的伪参数](#pseudo-parameters)。

另一个例子是，要运行停止您的 Amazon EC2 实例的 自动化 任务，请指定 `AWS-StopEC2Instance` Systems Manager 文档（SSM 文档）作为 `TaskArn` 值，并使用 `{{RESOURCE_ID}}` 伪参数：

```
"TaskArn": "AWS-StopEC2Instance",
    "TaskType": "AUTOMATION"
    "TaskInvocationParameters": {
        "Automation": {
            "DocumentVersion": "1",
            "Parameters": {
                "instanceId": [
                    "{{RESOURCE_ID}}"
                ]
            }
        }
    }
```

要运行复制 Amazon Elastic Block Store (Amazon EBS) 卷的快照的 自动化 任务，请将 `AWS-CopySnapshot` SSM 文档指定为 `TaskArn` 值，并使用 `{{RESOURCE_ID}}` 伪参数。

```
"TaskArn": "AWS-CopySnapshot",
    "TaskType": "AUTOMATION"
    "TaskInvocationParameters": {
        "Automation": {
            "DocumentVersion": "1",
            "Parameters": {
                "SourceRegion": "us-east-2",
                "targetType":"RESOURCE_GROUP",
                "SnapshotId": [
                    "{{RESOURCE_ID}}"
                ]
            }
        }
    }
```

## 支持的伪参数
<a name="pseudo-parameters"></a>

以下列表描述了您可在 `--task-invocation-parameters` 选项中使用 `{{PSEUDO_PARAMETER}}` 语法指定的伪参数。
+ **`WINDOW_ID`**：目标维护时段的 ID。
+ **`WINDOW_TASK_ID`**：正在运行的时段任务的 ID。
+ **`WINDOW_TARGET_ID`**：包含目标的时段目标的 ID (目标 ID)。
+ **`WINDOW_EXECUTION_ID`**：当前时段执行的 ID。
+ **`TASK_EXECUTION_ID`**：当前任务执行的 ID。
+ **`INVOCATION_ID`**：当前调用的 ID。
+ **`TARGET_TYPE`**：目标的类型。支持的类型包括 `RESOURCE_GROUP` 和 `INSTANCE`。
+ **`TARGET_ID`**: 

  如果您指定的目标类型为 `INSTANCE`，则 `TARGET_ID` 伪参数将被替换为实例的 ID。例如 `i-078a280217EXAMPLE`。

  如果您指定的目标类型为 `RESOURCE_GROUP`，则为任务执行引用的值将是资源的完整 ARN。例如：`arn:aws:ec2:us-east-1:123456789012:instance/i-078a280217EXAMPLE`。下表提供资源组中特定资源类型的示例 `TARGET_ID` 值。
**注意**  
对于 Run Command 任务，`TARGET_ID` 不受支持。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/maintenance-window-tasks-pseudo-parameters.html)
+ **`RESOURCE_ID`**：资源组中包含的资源类型的短 ID。下表提供资源组中特定资源类型的示例 `RESOURCE_ID` 值。
**注意**  
对于 Run Command 任务，`RESOURCE_ID` 不受支持。    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/zh_cn/systems-manager/latest/userguide/maintenance-window-tasks-pseudo-parameters.html)
**注意**  
如果您指定的 AWS 资源组包含的资源类型不会生成 `RESOURCE_ID` 值，并且这些资源类型未在上表中列出，则不会填充 `RESOURCE_ID` 参数。对于该资源仍会发生执行调用。在这些情况下，请改用 `TARGET_ID` 伪参数，该参数将替换为资源的完整 ARN。

# 维护时段计划和活动期间选项
<a name="maintenance-windows-schedule-options"></a>

创建维护时段时，必须使用 [Cron 或 Rate 表达式](reference-cron-and-rate-expressions.md)指定维护时段运行的频率。您可以选择性地指定维护时段依据其定期计划运行的日期范围，以及该定期计划所基于的时区。

但请注意，时区选项以及开始日期和结束日期选项彼此互不影响。指定的任何开始日期和结束日期时间（包含或不包含时区偏移量）仅确定维护时段定期运行的*有效期间*。时区选项确定维护时段计划在有效期间*内* 所基于的国际时区。

**注意**  
请以 ISO-8601 时间戳格式指定开始日期和结束日期。例如：`2021-04-07T14:29:00-08:00`  
请以互联网编号分配机构 (IANA) 格式指定时区。例如：`America/Chicago`、`Europe/Berlin` 或 `Asia/Tokyo`。

**Topics**
+ [示例 1：指定维护时段的开始日期](#schedule-example-start-date)
+ [示例 2：指定维护时段的开始日期和结束日期](#schedule-example-start-end-date)
+ [示例 3：创建仅运行一次的维护时段](#schedule-example-one-time)
+ [示例 4：指定维护时段的计划偏移天数](#schedule-example-schedule-offset)

## 示例 1：指定维护时段的开始日期
<a name="schedule-example-start-date"></a>

假设您使用 AWS Command Line Interface (AWS CLI) 创建一个具有以下选项的维护时段：
+ `--start-date 2021-01-01T00:00:00-08:00`
+ `--schedule-timezone "America/Los_Angeles"`
+ `--schedule "cron(0 09 ? * WED *)"`

例如：

------
#### [ Linux & macOS ]

```
aws ssm create-maintenance-window \
    --name "My-LAX-Maintenance-Window" \
    --allow-unassociated-targets \
    --duration 3 \
    --cutoff 1 \
    --start-date 2021-01-01T00:00:00-08:00 \
    --schedule-timezone "America/Los_Angeles" \
    --schedule "cron(0 09 ? * WED *)"
```

------
#### [ Windows ]

```
aws ssm create-maintenance-window ^
    --name "My-LAX-Maintenance-Window" ^
    --allow-unassociated-targets ^
    --duration 3 ^
    --cutoff 1 ^
    --start-date 2021-01-01T00:00:00-08:00 ^
    --schedule-timezone "America/Los_Angeles" ^
    --schedule "cron(0 09 ? * WED *)"
```

------

这意味着维护时段只有在到达其指定的开始日期和时间（即美国太平洋时间 2021 年 1 月 1 日星期五中午 12:00）*之后* 才会首次运行。（此时区比 UTC 时间晚 8 个小时。） 在这种情况下，时段的开始日期和时间不表示维护时段首次运行的时间。总的来说，`--schedule-timezone` 和 `--schedule` 值意味着维护时段将在美国太平洋时区（以 IANA 格式“America/Los Angeles”表示）每个星期三的上午 9 点运行。允许时段内的首次执行时间将为美国太平洋时间 2021 年 1 月 4 日星期三上午 9 点。

## 示例 2：指定维护时段的开始日期和结束日期
<a name="schedule-example-start-end-date"></a>

假设您接下来创建一个具有以下选项的维护时段：
+ `--start-date 2019-01-01T00:03:15+09:00`
+ `--end-date 2019-06-30T00:06:15+09:00`
+ `--schedule-timezone "Asia/Tokyo"`
+ `--schedule "rate(7 days)"`

例如：

------
#### [ Linux & macOS ]

```
aws ssm create-maintenance-window \
    --name "My-NRT-Maintenance-Window" \
    --allow-unassociated-targets \
    --duration 3 \
    --cutoff 1 \
    --start-date 2019-01-01T00:03:15+09:00 \
    --end-date 2019-06-30T00:06:15+09:00 \
    --schedule-timezone "Asia/Tokyo" \
    --schedule "rate(7 days)"
```

------
#### [ Windows ]

```
aws ssm create-maintenance-window ^
    --name "My-NRT-Maintenance-Window" ^
    --allow-unassociated-targets ^
    --duration 3 ^
    --cutoff 1 ^
    --start-date 2019-01-01T00:03:15+09:00 ^
    --end-date 2019-06-30T00:06:15+09:00 ^
    --schedule-timezone "Asia/Tokyo" ^
    --schedule "rate(7 days)"
```

------

此维护时段的允许时段于日本标准时间 2019 年 1 月 1 日凌晨 3:15 开始。此维护时段的有效期间于日本标准时间 2019 年 6 月 30 日凌晨 6:15 结束。（此时区比 UTC 时间早 9 个小时。） 总的来说，`--schedule-timezone` 和 `--schedule` 值意味着维护时段将在日本标准时区（以 IANA 格式“Asia/Tokyo”表示）每个星期二的凌晨 3:15 运行。这是因为维护时段每七天运行一次，并且于 1 月 1 日星期二凌晨 3:15 变为活动状态。最后一次执行时间为日本标准时间 2019 年 6 月 25 日星期二凌晨 3:15。这是允许的维护时段期限在五天后结束前的最后一个星期二。

## 示例 3：创建仅运行一次的维护时段
<a name="schedule-example-one-time"></a>

现在，您可以创建具有此选项的维护时段：
+ `--schedule "at(2020-07-07T15:55:00)"`

例如：

------
#### [ Linux & macOS ]

```
aws ssm create-maintenance-window \
    --name "My-One-Time-Maintenance-Window" \
    --schedule "at(2020-07-07T15:55:00)" \
    --duration 5 \
    --cutoff 2 \
    --allow-unassociated-targets
```

------
#### [ Windows ]

```
aws ssm create-maintenance-window ^
    --name "My-One-Time-Maintenance-Window" ^
    --schedule "at(2020-07-07T15:55:00)" ^
    --duration 5 ^
    --cutoff 2 ^
    --allow-unassociated-targets
```

------

此维护时段仅运行一次，即在 2020 年 7 月 7 日下午 3:55（UTC 时间）运行。根据需要允许维护时段运行最多 5 小时，但在维护时段期限结束前的两小时禁止开始新任务。

## 示例 4：指定维护时段的计划偏移天数
<a name="schedule-example-schedule-offset"></a>

现在，您可以创建具有此选项的维护时段：

```
--schedule-offset 2
```

例如：

------
#### [ Linux & macOS ]

```
aws ssm create-maintenance-window \
    --name "My-Cron-Offset-Maintenance-Window" \
    --schedule "cron(0 30 23 ? * TUE#3 *)" \
    --duration 4 \
    --cutoff 1 \
    --schedule-offset 2 \
    --allow-unassociated-targets
```

------
#### [ Windows ]

```
aws ssm create-maintenance-window ^
    --name "My-Cron-Offset-Maintenance-Window" ^
    --schedule "cron(0 30 23 ? * TUE#3 *)" ^
    --duration 4 ^
    --cutoff 1 ^
    --schedule-offset 2 ^
    --allow-unassociated-targets
```

------

计划偏移是在运行维护时段之前但在 CRON 表达式指定的日期和时间之后等待的天数。

在上面的示例中，CRON 表达式计划一个维护时段，在每月第三个星期二的晚上 11:30 运行：

```
--schedule "cron(0 30 23 ? * TUE#3 *)
```

但是，包括 `--schedule-offset 2` 表示维护时段要到每月第三个星期二*之后* 两天的晚上 11:30 才会运行。

仅针对 CLEN 表达式支持计划偏移。

**更多信息**  
+ [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)
+ [使用控制台创建维护时段](sysman-maintenance-create-mw.md)
+ [教程：使用 AWS CLI 创建和配置维护时段](maintenance-windows-cli-tutorials-create.md)
+ *AWS Systems Manager API 参考*中的 [CreateMaintenanceWindow](https://docs.aws.amazon.com/systems-manager/latest/APIReference/API_CreateMaintenanceWindow.html)
+ **《AWS CLI Command Reference》的 AWS Systems Manager 部分中的 [https://docs.aws.amazon.com/cli/latest/reference/ssm/create-maintenance-window.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/create-maintenance-window.html)
+ IANA 网站上的[时区数据库](https://www.iana.org/time-zones)

# 注册不含目标的维护时段任务
<a name="maintenance-windows-targetless-tasks"></a>

对于您创建的每个维护时段，您可以指定要在维护时段运行时执行的一个或多个任务。在大多数情况下，您必须指定要在其上运行任务的资源或目标。但是，在某些情况下，无需在任务中明确指定目标。

必须为维护时段 Systems Manager Run Command 类型任务指定一个或多个目标。根据任务的性质，目标对于其他维护时段任务类型（Systems Manager 自动化、AWS Lambda 和 AWS Step Functions）是可选的。

对于 Lambda 和 Step Functions 任务类型，是否需要目标取决于您创建的函数或状态机的内容。

**注意**  
当任务注册了目标时，Automation、AWS Lambda 和 AWS Step Functions 任务会从资源组和标签解析目标，并为每个已解析的资源发送一次调用，这会导致多次任务调用。但是，举例来说，您只想对在包含多个实例的资源组中注册的 Lambda 任务进行一次调用。在这种情况下，如果您正在使用AWS 管理控制台，请在**注册 Lambda 任务**或**编辑 Lambda 任务**页面中选择**任务目标不是必需的**选项。如果使用 AWS CLI 命令，则在运行 [https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/register-task-with-maintenance-window.html) 命令或 [https://docs.aws.amazon.com/cli/latest/reference/ssm/update-maintenance-window-task.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/update-maintenance-window-task.html) 命令时，请勿使用 `--targets` 参数指定目标。

在许多情况下，您无需为自动化任务明确指定目标。例如，假设您要创建 自动化 类型的任务，以使用 `AWS-UpdateLinuxAmi` 运行手册为 Linux 更新 Amazon Machine Image (AMI)。在该任务运行时，已使用最新可用的 Linux 分发版本的程序包和 Amazon 软件更新了 AMI。从 AMI 创建的新实例已经安装了这些更新。由于要更新的 AMI 的 ID 是在运行手册的输入参数中指定的，因此无需在维护时段任务中再次指定目标。

同样，假设您正在使用 AWS Command Line Interface (AWS CLI) 注册使用 `AWS-RestartEC2Instance` 运行手册的维护时段 Automation 任务。由于要重启的节点是在 `--task-invocation-parameters` 参数中指定，您也无需指定 `--targets` 选项。

**注意**  
对于没有指定目标的维护时段任务，您无法为 `--max-errors` 和 `--max-concurrency` 提供值。作为替代方式，系统会插入一个占位符值 `1`，该值可能会在响应诸如 [https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/describe-maintenance-window-tasks.html) 和 [https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-maintenance-window-task.html) 等命令时发出报告。这些值不会影响任务的运行，并且可以忽略。

以下示例演示了为无目标维护时段任务省略 `--targets`、`--max-errors` 和 `--max-concurrency` 选项的情形。

------
#### [ Linux & macOS ]

```
aws ssm register-task-with-maintenance-window \
    --window-id "mw-ab12cd34eEXAMPLE" \
    --service-role-arn "arn:aws:iam::123456789012:role/MaintenanceWindowAndAutomationRole" \
    --task-type "AUTOMATION" \
    --name "RestartInstanceWithoutTarget" \
    --task-arn "AWS-RestartEC2Instance" \
    --task-invocation-parameters "{\"Automation\":{\"Parameters\":{\"InstanceId\":[\"i-02573cafcfEXAMPLE\"]}}}" \
    --priority 10
```

------
#### [ Windows ]

```
aws ssm register-task-with-maintenance-window ^
    --window-id "mw-ab12cd34eEXAMPLE" ^
    --service-role-arn "arn:aws:iam::123456789012:role/MaintenanceWindowAndAutomationRole" ^
    --task-type "AUTOMATION" ^
    --name "RestartInstanceWithoutTarget" ^
    --task-arn "AWS-RestartEC2Instance" ^
    --task-invocation-parameters "{\"Automation\":{\"Parameters\":{\"InstanceId\":[\"i-02573cafcfEXAMPLE\"]}}}" ^
    --priority 10
```

------

**注意**  
对于 2020 年 12 月 23 日之前注册的维护时段任务：如果您为任务指定了多个目标，但不再需要一个目标，则可以更新该任务，以使用 Systems Manager 控制台或 [https://docs.aws.amazon.com/cli/latest/reference/ssm/update-maintenance-window-task.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/update-maintenance-window-task.html) AWS CLI 命令删除目标。

**更多信息**  
+ [错误消息：“Maintenance window tasks without targets don't support MaxConcurrency values (没有目标的维护时段任务不支持 MaxConcurrency 值)”和“Maintenance window tasks without targets don't support MaxErrors values (没有目标的维护时段任务不支持 MaxErrors 值)”](troubleshooting-maintenance-windows.md#maxconcurrency-maxerrors-not-supported)

# 对维护时段进行故障排除
<a name="troubleshooting-maintenance-windows"></a>

可以使用以下信息来帮助您对维护时段的问题进行故障排除。

**Topics**
+ [编辑任务错误：在用于编辑维护时段任务的页面上，IAM 角色列表返回以下错误消息：“We couldn't find the IAM maintenance window role specified for this task。It might have been deleted, or it might not have been created yet. (找不到为此任务指定的 IAM 维护时段角色。它可能已被删除，也可能尚未创建。)”](#maintenance-window-role-troubleshooting)
+ [并非所有维护时段目标都会被更新](#targets-not-updated)
+ [任务失败并显示任务调用状态：“The provided role does not contain the correct SSM permissions”（提供的角色不包含正确的 SSM 权限）。](#incorrect-ssm-permissions)
+ [任务失败并显示错误消息：“Step fails when it is validating and resolving the step inputs (步骤在验证和解析步骤输入时失败)”](#step-fails)
+ [错误消息：“Maintenance window tasks without targets don't support MaxConcurrency values (没有目标的维护时段任务不支持 MaxConcurrency 值)”和“Maintenance window tasks without targets don't support MaxErrors values (没有目标的维护时段任务不支持 MaxErrors 值)”](#maxconcurrency-maxerrors-not-supported)

## 编辑任务错误：在用于编辑维护时段任务的页面上，IAM 角色列表返回以下错误消息：“We couldn't find the IAM maintenance window role specified for this task。It might have been deleted, or it might not have been created yet. (找不到为此任务指定的 IAM 维护时段角色。它可能已被删除，也可能尚未创建。)”
<a name="maintenance-window-role-troubleshooting"></a>

**问题 1**：您最初指定的 AWS Identity and Access Management (IAM) 维护时段角色在您创建任务后被删除。

**可能的修复措施**：1) 选择其他 IAM 维护时段角色（如果您的账户中存在），或者新建一个角色并为任务选择该角色。

**问题 2**：如果任务是使用 AWS Command Line Interface (AWS CLI)、AWS Tools for Windows PowerShell 或 AWS 开发工具包创建的，则可能指定了不存在的 IAM 维护时段角色名称。例如，IAM 维护时段角色可能已在创建任务之前删除，或者键入的角色名称不正确，如 **myrole** 而不是 **my-role**。

**可能的修复措施**：为您要使用的 IAM 维护时段角色选择正确的名称，或者新建一个要为任务指定的角色。

## 并非所有维护时段目标都会被更新
<a name="targets-not-updated"></a>

**问题：**您注意到，维护时段任务未在维护时段设为目标的所有资源上运行。例如，在维护时段运行结果中，该资源的任务被标记为已失败或已超时。

**解决方案：**维护时段任务未在目标资源上运行的最常见原因涉及连接性和可用性。例如：
+ Systems Manager 在维护时段操作之前或期间丢失与资源的连接。
+ 在维护时段操作期间，资源处于离线或停止状态。

您可以等待下一个计划维护时段的时间在资源上运行任务。您可以在不可用或离线的资源上手动运行维护时段任务。

## 任务失败并显示任务调用状态：“The provided role does not contain the correct SSM permissions”（提供的角色不包含正确的 SSM 权限）。
<a name="incorrect-ssm-permissions"></a>

**问题**：您已为任务指定维护时段服务角色，但该任务无法成功运行，并且任务调用状态报告“The provided role does not contain the correct SSM permissions”（提供的角色不包含正确的 SSM 权限）。
+ **解决方案**：在 [任务 1：使用控制台为维护时段服务角色创建自定义策略](configuring-maintenance-window-permissions-console.md#create-custom-policy-console) 中，我们提供了一个基本策略，您可以将其附加到您的[自定义维护时段服务角色](configuring-maintenance-window-permissions-console.md#create-custom-role-console)。该策略包含许多任务方案所需的权限。但是，由于您可以运行的任务种类繁多，您可能需要在策略中为自己的维护时段角色提供其他权限。

  例如，一些 自动化 操作使用 AWS CloudFormation 堆栈。因此，您可能需要将附加权限 `cloudformation:CreateStack`、`cloudformation:DescribeStacks` 和 `cloudformation:DeleteStack` 添加到您的维护时段服务角色的策略中。

  另一个示例：自动化运行手册 `AWS-CopySnapshot` 需要权限来创建 Amazon Elastic Block Store（Amazon EBS）快照，因此，您可能需要添加权限 `ec2:CreateSnapshot`。

  有关 AWS 托管的自动化运行手册所需角色权限的信息，请参阅 [AWS Systems Manager 自动化运行手册参考](https://docs.aws.amazon.com/systems-manager-automation-runbooks/latest/userguide/automation-runbook-reference.html)中的运行手册描述。

  有关 AWS 托管的 SSM 文档所需角色权限的信息，请查看[文档](https://console.aws.amazon.com//systems-manager/documents)部分 Systems Manager 控制台中的文档内容。

  有关 Step Functions 任务、Lambda 任务以及自定义自动化运行手册和 SSM 文档所需角色权限的信息，请向这些资源的作者验证权限要求。

## 任务失败并显示错误消息：“Step fails when it is validating and resolving the step inputs (步骤在验证和解析步骤输入时失败)”
<a name="step-fails"></a>

**问题**：在任务中使用的 自动化 运行手册或 Systems Manager 命令文档要求您指定输入，例如 `InstanceId` 或 `SnapshotId`，但没有提供或未正确提供某个值。
+ **解决方案 1**：如果您的任务将单个资源（例如单个节点或单个快照）设为目标，请在任务的输入参数中输入其 ID。
+ **解决方案 2**：如果您的任务将多个资源设为目标，例如在使用运行手册 `AWS-CreateImage` 时从多个节点创建映像，您可以在输入参数中使用维护时段任务支持的伪参数之一来表示命令中的节点 ID。

  以下命令使用 AWS CLI 将 Systems Manager 自动化 任务注册到维护时段。`--targets` 值指示维护时段目标 ID。此外，即使 `--targets` 参数指定时段目标 ID，自动化运行手册的参数也会要求提供节点 ID。在这种情况下，该命令使用伪参数 `{{RESOURCE_ID}}` 作为 `InstanceId` 值。

  **AWS CLI 命令：**

------
#### [ Linux & macOS ]

  以下示例命令会重新启动属于 ID 为 e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE 的维护时段目标组的 Amazon Elastic Compute Cloud（Amazon EC2）实例。

  ```
  aws ssm register-task-with-maintenance-window \
      --window-id "mw-0c50858d01EXAMPLE" \
      --targets Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE \
      --task-arn "AWS-RestartEC2Instance" \
      --service-role-arn arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole \
      --task-type AUTOMATION \
      --task-invocation-parameters "Automation={DocumentVersion=5,Parameters={InstanceId='{{RESOURCE_ID}}'}}" \
      --priority 0 --max-concurrency 10 --max-errors 5 --name "My-Restart-EC2-Instances-Automation-Task" \
      --description "Automation task to restart EC2 instances"
  ```

------
#### [ Windows ]

  ```
  aws ssm register-task-with-maintenance-window ^
      --window-id "mw-0c50858d01EXAMPLE" ^
      --targets Key=WindowTargetIds,Values=e32eecb2-646c-4f4b-8ed1-205fbEXAMPLE ^
      --task-arn "AWS-RestartEC2Instance" ^
      --service-role-arn arn:aws:iam::123456789012:role/MyMaintenanceWindowServiceRole ^
      --task-type AUTOMATION ^
      --task-invocation-parameters "Automation={DocumentVersion=5,Parameters={InstanceId='{{RESOURCE_ID}}'}}" ^
      --priority 0 --max-concurrency 10 --max-errors 5 --name "My-Restart-EC2-Instances-Automation-Task" ^
      --description "Automation task to restart EC2 instances"
  ```

------

  有关使用维护时段任务的伪参数的更多信息，请参阅 [注册维护时段任务时使用伪参数](maintenance-window-tasks-pseudo-parameters.md) 和 [任务注册示例](mw-cli-register-tasks-examples.md#task-examples)。

## 错误消息：“Maintenance window tasks without targets don't support MaxConcurrency values (没有目标的维护时段任务不支持 MaxConcurrency 值)”和“Maintenance window tasks without targets don't support MaxErrors values (没有目标的维护时段任务不支持 MaxErrors 值)”
<a name="maxconcurrency-maxerrors-not-supported"></a>

**问题：**当您注册 Run Command 类型的任务时，必须指定至少一个目标，以便任务能在其上运行。对于其他任务类型（自动化、AWS Lambda 和 AWS Step Functions），根据任务的性质，目标是可选的。选项 `MaxConcurrency`（要同时运行某一任务的资源数量）和 `MaxErrors`（在任务失败之前在目标资源上运行该任务的失败次数）不是必需的，也不支持未指定目标的维护时段任务。当未指定任何任务目标时，如果为这些选项中的任何一个指定值，则系统将生成这些错误消息。

**解决方案**：如果您收到这些错误中的任何一个，请在继续注册或更新维护时段任务之前，删除并发值和错误阈值。

有关运行未指定目标的任务的更多信息，请参阅 *AWS Systems Manager 用户指南*中的 [注册不含目标的维护时段任务](maintenance-windows-targetless-tasks.md)。

# AWS Systems Manager Quick Setup
<a name="systems-manager-quick-setup"></a>

使用Quick Setup（AWS Systems Manager 中的一项工具）可按照建议的最佳实践快速配置常用 Amazon Web Services 服务和功能。Quick Setup将通过自动执行常见或建议的任务，来简化 Systems Manager 等服务的设置。例如，这些任务包括创建必需的 AWS Identity and Access Management (IAM) 实例配置文件角色以及设置操作最佳实践，例如定期补丁扫描和清单收集。使用 Quick Setup 不会收取任何费用。但是，根据您设置的服务类型和使用限制，可能会产生成本，但不收取用于设置服务的服务费用。要开始使用 Quick Setup，请打开 [Systems Manager 控制台](https://console.aws.amazon.com/systems-manager/quick-setup)。在导航窗格中，请选择 **Quick Setup**。

**注意**  
如果指示您 Quick Setup，以帮助您将实例配置为由 Systems Manager 托管，请完成 [使用 Quick Setup 设置 Amazon EC2 主机管理](quick-setup-host-management.md) 中的过程。

## Quick Setup 的优势是什么？
<a name="quick-setup-features"></a>

Quick Setup 具有以下优势：
+ **简化服务和功能配置**

  Quick Setup 将指导您完成配置操作最佳实践并自动部署这些配置。Quick Setup 控制面板显示配置部署状态的实时视图。
+ **跨多个账户自动部署配置**

  可通过与 AWS Organizations 集成在单个 AWS 账户中或跨多个 AWS 账户和 AWS 区域使用 Quick Setup。跨多个账户使用 Quick Setup 有助于确保您的组织保持一致的配置。
+ **消除配置漂移**

  当用户对与通过 Quick Setup 进行的选择冲突的服务或功能进行更改时，会发生配置漂移。Quick Setup 会定期检查是否存在配置漂移并尝试进行修复。

## 谁应该使用 Quick Setup？
<a name="quick-setup-audience"></a>

如果客户已经具有当前设置的服务和功能的一些使用经验并且希望简化其设置过程，建议这些客户使用 Quick Setup。如果不熟悉正在使用 Quick Setup 配置的 AWS 服务，我们建议您首先深入了解该服务。请先查看相关用户指南中的内容，然后再使用 Quick Setup 创建配置。

## Quick Setup 在 AWS 区域 中的可用性
<a name="quick-setup-getting-started-regions"></a>

在下列 AWS 区域中，您可以为整个组织或者您选择的组织账户和区域使用所有 Quick Setup 配置类型（如 AWS Organizations 中所配置）。您也可以在这些区域中仅将 Quick Setup 用于一个账户。
+ 美国东部（俄亥俄州）
+ 美国东部（弗吉尼亚州北部）
+ 美国西部（北加利福尼亚）
+ 美国西部（俄勒冈州）
+ 亚太地区（孟买）
+ 亚太地区（首尔）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 亚太地区（东京）
+ 加拿大（中部）
+ 欧洲地区（法兰克福）
+ 欧洲地区（斯德哥尔摩）
+ 欧洲地区（爱尔兰）
+ 欧洲地区（伦敦）
+ 欧洲（巴黎）
+ 南美洲（圣保罗）

在下列区域中，只有[主机管理](quick-setup-host-management.md)配置类型可用于单个账户：
+ 欧洲地区（米兰）
+ 亚太地区（香港）
+ 中东（巴林）
+ 中国（北京）
+ China (Ningxia)
+ AWS GovCloud（美国东部）
+ AWS GovCloud（美国西部）

 有关 Systems Manager 支持的所有区域的列表，请参阅《Amazon Web Services 一般参考》中 [Systems Manager 服务端点](https://docs.aws.amazon.com/general/latest/gr/ssm.html#ssm_region) 部分的**区域**列**。

# Quick Setup 入门
<a name="quick-setup-getting-started"></a>

使用本主题中的信息帮助您准备使用 Quick Setup。

**Topics**
+ [注册 Quick Setup 的 IAM 角色和权限](#quick-setup-getting-started-iam)
+ [以编程方式使用 Quick Setup API 时的手动初始设置](#quick-setup-api-manual-onboarding)

## 注册 Quick Setup 的 IAM 角色和权限
<a name="quick-setup-getting-started-iam"></a>

Quick Setup 推出了新的控制台体验和新的 API。现在，您可以使用控制台、AWS CLI、CloudFormation 和 SDK 与此 API 进行交互。如果您选择使用新体验，则会使用新的 API 重新创建现有配置。根据您账户中的现有配置数量，此过程可能需要几分钟。

要使用新的 Quick Setup 控制台，您必须拥有以下操作的权限：

------
#### [ JSON ]

****  

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "ssm-quicksetup:*",
                "cloudformation:DescribeStackSetOperation",
                "cloudformation:ListStacks",
                "cloudformation:DescribeStacks",
                "cloudformation:DescribeStackResources",
                "cloudformation:ListStackSetOperations",
                "cloudformation:ListStackInstances",
                "cloudformation:DescribeStackSet",
                "cloudformation:ListStackSets",
                "cloudformation:DescribeStackInstance",
                "cloudformation:DescribeOrganizationsAccess",
                "cloudformation:ActivateOrganizationsAccess",
                "cloudformation:GetTemplate",
                "cloudformation:ListStackSetOperationResults",
                "cloudformation:DescribeStackEvents",
                "cloudformation:UntagResource",
                "ec2:DescribeInstances",
                "ssm:DescribeAutomationExecutions",
                "ssm:GetAutomationExecution",
                "ssm:ListAssociations",
                "ssm:DescribeAssociation",
                "ssm:GetDocument",
                "ssm:ListDocuments",
                "ssm:DescribeDocument",
                "ssm:ListResourceDataSync",
                "ssm:DescribePatchBaselines",
                "ssm:GetPatchBaseline",
                "ssm:DescribeMaintenanceWindows",
                "ssm:DescribeMaintenanceWindowTasks",
                "ssm:GetOpsSummary",
                "organizations:DeregisterDelegatedAdministrator",
                "organizations:DescribeAccount",
                "organizations:DescribeOrganization",
                "organizations:ListDelegatedAdministrators",
                "organizations:ListRoots",
                "organizations:ListParents",
                "organizations:ListOrganizationalUnitsForParent",
                "organizations:DescribeOrganizationalUnit",
                "organizations:ListAWSServiceAccessForOrganization",
                "s3:GetBucketLocation",
                "s3:ListAllMyBuckets",
                "s3:ListBucket",
                "resource-groups:ListGroups",
                "iam:ListRoles",
                "iam:ListRolePolicies",
                "iam:GetRole",
                "iam:CreatePolicy",
                "organizations:RegisterDelegatedAdministrator",
                "organizations:EnableAWSServiceAccess",
                "cloudformation:TagResource"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:RollbackStack",
                "cloudformation:CreateStack",
                "cloudformation:UpdateStack",
                "cloudformation:DeleteStack"
            ],
            "Resource": [
                "arn:aws:cloudformation:*:*:stack/StackSet-AWS-QuickSetup-*",
                "arn:aws:cloudformation:*:*:stack/AWS-QuickSetup-*",
                "arn:aws:cloudformation:*:*:type/resource/*",
                "arn:aws:cloudformation:*:*:stack/StackSet-SSMQuickSetup"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "cloudformation:CreateStackSet",
                "cloudformation:UpdateStackSet",
                "cloudformation:DeleteStackSet",
                "cloudformation:DeleteStackInstances",
                "cloudformation:CreateStackInstances",
                "cloudformation:StopStackSetOperation"
            ],
            "Resource": [
                "arn:aws:cloudformation:*:*:stackset/AWS-QuickSetup-*",
                "arn:aws:cloudformation:*:*:stackset/SSMQuickSetup",
                "arn:aws:cloudformation:*:*:type/resource/*",
                "arn:aws:cloudformation:*:*:stackset-target/AWS-QuickSetup-*:*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateRole",
                "iam:DeleteRole",
                "iam:AttachRolePolicy",
                "iam:DetachRolePolicy",
                "iam:GetRolePolicy",
                "iam:PutRolePolicy"
            ],
            "Resource": [
                "arn:aws:iam::*:role/AWS-QuickSetup-*",
                "arn:aws:iam::*:role/service-role/AWS-QuickSetup-*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::111122223333:role/AWS-QuickSetup-*",
            "Condition": {
                "StringEquals": {
	            "iam:PassedToService": [
	                "ssm-quicksetup.amazonaws.com",
	                "cloudformation.amazonaws.com"
	            ]
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:DeleteAssociation",
                "ssm:CreateAssociation",
                "ssm:StartAssociationsOnce"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "ssm:StartAutomationExecution",
            "Resource": [
                "arn:aws:ssm:*:*:document/AWS-EnableExplorer",
                "arn:aws:ssm:*:*:automation-execution/*"
            ]
        },
        {
            "Effect": "Allow",
            "Action": [
                "ssm:GetOpsSummary",
                "ssm:CreateResourceDataSync",
                "ssm:UpdateResourceDataSync"
            ],
            "Resource": "arn:aws:ssm:*:*:resource-data-sync/AWS-QuickSetup-*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Condition": {
                "StringEquals": {
                    "iam:AWSServiceName": [
                        "accountdiscovery.ssm.amazonaws.com",
                        "ssm.amazonaws.com",
                        "ssm-quicksetup.amazonaws.com",
                        "stacksets.cloudformation.amazonaws.com"
                    ]
                }
            },
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateServiceLinkedRole"
            ],
            "Resource": "arn:aws:iam::*:role/aws-service-role/stacksets.cloudformation.amazonaws.com/AWSServiceRoleForCloudFormationStackSetsOrgAdmin"
        }
    ]
}
```

------

要将用户限制为只读权限，请仅允许对 Quick Setup API 执行 `ssm-quicksetup:List*` 和 `ssm-quicksetup:Get*` 操作。

在引导期间，Quick Setup 将代表您创建以下 AWS Identity and Access Management（IAM）角色：
+ `AWS-QuickSetup-LocalExecutionRole` – 授予 CloudFormation 使用任何模板（不包括补丁策略模板）和创建必要资源的权限。
+ `AWS-QuickSetup-LocalAdministrationRole` - 授予 AWS CloudFormation 担任 `AWS-QuickSetup-LocalExecutionRole` 的权限。
+ `AWS-QuickSetup-PatchPolicy-LocalExecutionRole` – 授予 AWS CloudFormation 使用补丁策略模板和创建必要资源的权限。
+ `AWS-QuickSetup-PatchPolicy-LocalAdministrationRole` - 授予 AWS CloudFormation 担任 `AWS-QuickSetup-PatchPolicy-LocalExecutionRole` 的权限。

如果您正在注册管理账户（用于在 AWS Organizations 中创建组织的账户），Quick Setup 还会代表您创建以下角色：
+ `AWS-QuickSetup-SSM-RoleForEnablingExplorer` - 授予 `AWS-EnableExplorer` 自动化 Runbook 权限。`AWS-EnableExplorer` 运行手册可配置 Explorer（Systems Manager 中的一项工具）来显示多个 AWS 账户和 AWS 区域的信息。
+ `AWSServiceRoleForAmazonSSM` - 服务链接角色，用于授予对由 Systems Manager 管理和使用的 AWS 资源的访问权限。
+ `AWSServiceRoleForAmazonSSM_AccountDiscovery` – 服务相关角色，用于向 Systems Manager 授予在同步数据时调用 AWS 服务来查找 AWS 账户信息的权限。有关更多信息，请参阅 [使用角色为 OpsCenter 和 Explorer 收集 AWS 账户 信息](using-service-linked-roles-service-action-2.md)。

在引导管理账户时，Quick Setup 将在 AWS Organizations 和 CloudFormation 之间启用受信任的访问权限，来部署整个组织的 Quick Setup 配置。要启用受信任访问权限，您的管理账户必须具有管理员权限。在完成引导后，便不再需要管理员权限。有关更多信息，请参阅[启用 Organizations 受信任的访问权限](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-orgs-enable-trusted-access.html)。

有关 AWS Organizations 账户类型的更多信息，请参阅《AWS Organizations 用户指南》**中的 [AWS Organizations 术语和概念](https://docs.aws.amazon.com/organizations/latest/userguide/orgs_getting-started_concepts.html)。

**注意**  
Quick Setup 使用 CloudFormation StackSets 通过 AWS 账户 和区域来部署您的配置。如果目标账户数量乘以区域数超过 10000，则配置部署失败。我们建议检查您的用例并创建使用较少目标的配置，以适应组织的增长。堆栈实例不会部署到组织的管理账户。有关更多信息，请参阅[创建具有服务托管权限的堆栈集时的注意事项](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/stacksets-getting-started-create.html?icmpid=docs_cfn_console#stacksets-orgs-considerations)。

## 以编程方式使用 Quick Setup API 时的手动初始设置
<a name="quick-setup-api-manual-onboarding"></a>

如果您使用控制台操作 Quick Setup，则该服务会为您处理开户步骤。如果您计划使用 SDK 或 AWS CLI 操作 Quick Setup API，则仍然可以使用控制台为您完成开户步骤，这样您就不必手动执行这些步骤。但是，有些客户需要在不与控制台交互的情况下以编程方式完成 Quick Setup 的开户步骤。如果此方法适合您的使用案例，您必须完成以下步骤。所有这些步骤都必须通过您的 AWS Organizations 管理账户完成。

**若要完成 Quick Setup 的手动开户**

1. 使用 Organizations 激活 CloudFormation 的可信访问权限。这为管理账户提供为您的组织创建和管理 StackSets 所需的权限。您可以使用 CloudFormation 的 `ActivateOrganizationsAccess` API 操作来完成此步骤。有关更多信息，请参阅 *AWS CloudFormation API 参考*中的[ActivateOrganizationsAccess](https://docs.aws.amazon.com/AWSCloudFormation/latest/APIReference/API_ActivateOrganizationsAccess.html)。

1. 使用 Organizations 启用 Systems Manager 的集成。这允许 Systems Manager 在您组织的所有账户中创建服务相关角色。这也允许 Systems Manager 在您的组织和账户内代表您执行操作。您可以使用 AWS Organizations 的 `EnableAWSServiceAccess` API 操作来完成此步骤。*Systems Manager 的服务主体是 `ssm.amazonaws.com`。有关更多信息，请参阅 AWS Organizations API 参考*中的 [EnableAWSServiceAccess](https://docs.aws.amazon.com/organizations/latest/APIReference/API_EnableAWSServiceAccess.html)。

1. 为 Explorer 创建所需的 IAM 角色。这就允许 Quick Setup 针对您的配置创建控制面板，以便您查看部署和关联状态。创建 IAM 角色并附加 `AWSSystemsManagerEnableExplorerExecutionPolicy` 托管策略。修改该角色的信任策略，使其符合以下内容。将每个*账户 ID* 替换为您的信息。

------
#### [ JSON ]

****  

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Principal": {
                   "Service": "ssm.amazonaws.com"
               },
               "Action": "sts:AssumeRole",
               "Condition": {
                   "StringEquals": {
                       "aws:SourceAccount": "111122223333"
                   },
                   "ArnLike": {
                       "aws:SourceArn": "arn:*:ssm:*:111122223333:automation-execution/*"
                   }
               }
           }
       ]
   }
   ```

------

1. 更新 Explorer 的 Quick Setup 服务设置。您可以使用 Quick Setup 的 `UpdateServiceSettings` API 操作来完成此步骤。针对 `ExplorerEnablingRoleArn` 请求参数指定您在上一步中创建的 IAM 角色的 ARN。有关更多信息，请参阅 *Quick Setup API 参考*中的 [UpdateServiceSettings](https://docs.aws.amazon.com/quick-setup/latest/APIReference/API_UpdateServiceSettings.html)。

1. 创建必需的 IAM 角色以供 CloudFormation StackSets 使用。您必须创建*执行*角色和*管理*角色。

   1. 创建执行角色。执行角色应至少附加一个 `AWSQuickSetupDeploymentRolePolicy` 或 `AWSQuickSetupPatchPolicyDeploymentRolePolicy` 托管策略。如果您只是在创建补丁策略配置，则可以使用 `AWSQuickSetupPatchPolicyDeploymentRolePolicy` 托管策略。所有其他配置都使用 `AWSQuickSetupDeploymentRolePolicy` 策略。修改该角色的信任策略，使其符合以下内容。使用您的信息替换每个*账户 ID* 和*管理角色名称*

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "AWS": "arn:aws:iam::111122223333:role/administration role name"
                  },
                  "Action": "sts:AssumeRole"
              }
          ]
      }
      ```

------

   1. 创建管理角色。权限策略必须符合以下内容。使用您的信息替换每个*账户 ID* 和*执行角色名称*

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Action": [
                      "sts:AssumeRole"
                  ],
                  "Resource": "arn:*:iam::111122223333:role/execution role name",
                  "Effect": "Allow"
              }
          ]
      }
      ```

------

      修改该角色的信任策略，使其符合以下内容。将每个*账户 ID* 替换为您的信息。

------
#### [ JSON ]

****  

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Service": "cloudformation.amazonaws.com"
                  },
                  "Action": "sts:AssumeRole",
                  "Condition": {
                      "StringEquals": {
                          "aws:SourceAccount": "111122223333"
                      },
                      "ArnLike": {
                          "aws:SourceArn": "arn:aws:cloudformation:*:111122223333:stackset/AWS-QuickSetup-*"
                      }
                  }
              }
          ]
      }
      ```

------

# Systems Manager 的代入角色配置
<a name="quick-setup-assume-role"></a>

## 要为 Systems Manager 快速设置功能创建代入角色，请执行以下操作：
<a name="create-assume-role"></a>

Systems Manager 快速设置功能需要一个允许 Systems Manager 在您的账户中安全地执行操作的角色。此角色向 Systems Manager 授予在您的实例上运行命令以及代表您配置 EC2 实例、IAM 角色和其他 Systems Manager 资源所需的权限。

1. 通过 [https://console.aws.amazon.com/iam/](https://console.aws.amazon.com/iam/) 打开 IAM 控制台。

1. 在导航窗格中选择**策略**，然后选择**创建策略**。

1. 使用下面的 JSON 添加 `SsmOnboardingInlinePolicy` 策略。（此策略启用将实例配置文件权限附加到您指定的实例所需的操作。例如，允许创建实例配置文件并将其与 EC2 实例关联）。

1. 完成后，在左侧导航窗格中选择**角色**，然后选择**创建角色**。

1. 对于**可信实体类型**，请保留默认值（服务）。

1. 在**使用案例**下，选择 **Systems Manager**，然后选择**下一步**。

1. 在**添加权限**页面上：

1. 添加 `SsmOnboardingInlinePolicy` 策略。

1. 选择**下一步**。

1. 对于**角色名称**，输入一个描述性名称（例如，`AmazonSSMRoleForAutomationAssumeQuickSetup`）。

1. （可选）添加帮助识别和组织角色的标签。

1. 选择**创建角色**。

**重要**  
该角色必须包括与 `ssm.amazonaws.com` 的信任关系。当您在步骤 4 中选择 Systems Manager 作为服务时，系统会自动进行配置。

创建角色后，可以在配置快速设置功能时将其选中。该角色使 Systems Manager 能够代表您管理 EC2 实例、IAM 角色和其他 Systems Manager 资源并运行命令，同时通过特定的有限权限维护安全。

## 权限策略
<a name="permissions-policies"></a>

**`SsmOnboardingInlinePolicy`**  
以下策略定义了 Systems Manager 快速设置功能的权限：

```
{
    "Version": "2012-10-17" 		 	 	 ,
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "iam:CreateInstanceProfile",
                "iam:ListInstanceProfilesForRole",
                "ec2:DescribeIamInstanceProfileAssociations",
                "iam:GetInstanceProfile",
                "iam:AddRoleToInstanceProfile"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": [
                "ec2:AssociateIamInstanceProfile"
            ],
            "Resource": "arn:aws:ec2:*:*:instance/*",
            "Condition": {
                "Null": {
                    "ec2:InstanceProfile": "true"
                },
                "ArnLike": {
                    "ec2:NewInstanceProfile": "arn:aws:iam::*:instance-profile/[INSTANCE_PROFILE_ROLE_NAME]"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": "iam:PassRole",
            "Resource": "arn:aws:iam::*:role/[INSTANCE_PROFILE_ROLE_NAME]",
            "Condition": {
                "StringEquals": {
                    "iam:PassedToService": "ec2.amazonaws.com"
                }
            }
        }
    ]
        }
```

**信任关系**  
*这是通过上述步骤自动添加的*

```
{
    "Version": "2012-10-17" 		 	 	 ,
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "ssm.amazonaws.com"
            },
            "Action": "sts:AssumeRole"
        }
     ]
        }
```

# 对Quick Setup使用委派管理员
<a name="quick-setup-delegated-administrator"></a>

在为 Quick Setup 注册委托管理员账户后，在该账户中拥有相应权限的用户将可以创建、更新、查看和删除以 AWS Organizations 结构中组织单位为目标的配置管理器。此委托管理员账户还可以管理之前由组织的管理账户创建的配置管理器。

组织中的管理账户可以将组织中的任何账户指定为委托管理员。将某个账户注册为 Quick Setup 的委托管理员后，该账户会自动成为 AWS CloudFormation StackSets 和 Systems Manager Explorer 的委托管理员，因为 Quick Setup 配置的部署和监控将需要这些服务。

**注意**  
目前，Quick Setup的委派管理员不支持补丁策略配置类型。必须在组织的管理账户中创建和维护组织的补丁策略配置。有关更多信息，请参阅 [创建补丁策略](quick-setup-patch-manager.md#create-patch-policy)。

以下主题介绍了如何注册和取消注册Quick Setup的委派管理员。

**Topics**
+ [注册Quick Setup的委派管理员](quick-setup-register-delegated-administrator.md)
+ [取消注册Quick Setup的委派管理员](quick-setup-deregister-delegated-administrator.md)

# 注册Quick Setup的委派管理员
<a name="quick-setup-register-delegated-administrator"></a>

使用以下过程注册Quick Setup的委派管理员。

**注册Quick Setup委派管理员**

1. 登录到您的 AWS Organizations 管理账户。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 选择**设置**。

1. 在 **Delegated administrator for Quick Setup (Explorer 的委派管理员)** 部分，验证您是否已配置所需的服务链接角色和服务访问选项。如有必要，请选择 **Create role (创建角色)** 和 **Enable access (启用访问权限)** 按钮来配置这些选项。

1. 对于 **Account ID (账户 ID)**，输入 AWS 账户 ID。此账户必须是 AWS Organizations 中的成员账户。

1. 选择**注册委托管理员**。

# 取消注册Quick Setup的委派管理员
<a name="quick-setup-deregister-delegated-administrator"></a>

使用以下过程来取消注册Quick Setup的委派管理员。

**取消注册Quick Setup委派管理员**

1. 登录到您的 AWS Organizations 管理账户。

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 选择**设置**。

1. 在**Quick Setup的委派管理员**部分中，从**操作**下拉菜单中选择**取消注册**。

1. 选择**确认**。

# 了解 Quick Setup 术语和详细信息
<a name="quick-setup-using"></a>

Quick Setup是 AWS Systems Manager 中的一项工具，其在Quick Setup主页的**配置管理器**表中显示了您在所有 AWS 区域创建的所有配置管理器的结果。在此页面上，您可以**查看每个配置的详细信息**，从 **Actions**（操作）下拉列表中删除配置，或 **Create**（创建）配置。**配置管理器**表包含以下信息：
+ **名称** - 配置管理器的名称（如果在创建时提供）。
+ **Configuration type**（配置类型）– 在创建配置时选择的配置类型。
+ **版本** - 当前部署的配置类型的版本。
+ **Organizational units**（组织单位）– 显示配置部署到的组织单位 (OU)（如果您选择了一组 **Custom**（自定义）目标。） 组织单位和自定义目标仅适用于组织的管理账户。管理账户是您用于在 AWS Organizations 中创建组织的账户。
+ **部署类型** – 指示该部署是适用于整个组织（`Organizational`）还是仅适用于您的账户（`Local`）。
+ **Regions**（区域）– 配置部署到的区域，前提是您选择了一组 **Custom**（自定义）目标或 **Current account**（当前账户）内的目标。
+ **Deployment status**（部署状态）– 部署状态指示 AWS CloudFormation 是否已成功部署目标或堆栈实例。目标实例和堆栈实例包含您在配置创建过程中选择的配置选项。
+ **Association status**（关联状态）– 关联状态是由您创建的配置创建的所有关联的状态。必须成功运行所有目标的关联，否则状态为 **Failed**（失败）。

  Quick Setup创建并运行每个配置目标的State Manager关联。State Manager是 AWS Systems Manager 中的一项工具。

要查看部署到您当前正在浏览的区域的配置，请选择**配置**选项卡。

## 配置详细信息
<a name="quick-setup-details"></a>

**Configuration details**（配置详细信息）页面显示有关配置及其相关联的部署的信息。在此页面中，您可以编辑配置选项、更新目标或删除配置。您还可以查看每个配置部署的详细信息，以获取有关这些关联的更多信息。

根据配置类型，会显示以下一个或多个状态图：

**配置部署状态**  
显示已成功、失败、正在运行或挂起的部署数。部署发生在包含受配置影响的节点的指定目标账户和区域中。

**配置关联状态**  
显示已成功、失败或待处理的 State Manager 关联的数量。Quick Setup 在每个部署中为选定的配置选项创建关联。

**设置状态**  
显示配置类型执行的操作数量及其当前状态。

**资源合规性**  
显示符合配置指定策略的资源数量。

**Configuration details**（配置详细信息）表显示有关配置部署的信息。通过选择部署然后选择 **View details**（查看详细信息），您可以查看有关每个部署的更多详细信息。每个部署的详细信息页面显示部署到该部署中的节点的关联。

## 编辑和删除配置
<a name="quick-setup-edit-delete"></a>

您可以通过选择 **Actions**（操作）然后选择 **Edit configuration options**（编辑配置选项）编辑 **Configuration details**（配置详细信息）页面中的某个配置的配置选项。向配置添加新选项时，Quick Setup 运行部署并创建新的关联。从配置中删除选项时，Quick Setup 运行部署并删除任何相关的关联。

**注意**  
您可随时编辑账户的 Quick Setup 配置。要编辑**组织**配置，**配置状态**必须为 **Success**（成功）或 **Failed**（失败）。

您还可以通过选择 **Actions**（操作）和 **Add OUs**（添加 OU）、**Add Regions**（添加区域）、**Remove OUs**（删除 OU）或 **Remove Regions**（删除区域）来更新包含在您的配置中的目标。如果账户未配置为管理账户，或者仅为当前账户创建了配置，则无法更新目标组织单位（OU）。删除区域或 OU 会从这些区域或 OU 中删除关联。

Quick Setup 会定期发布新版本的配置。您可以选择**升级配置**选项将您的配置升级到最新版本。

您可以通过选择配置，然后选择 **Actions**（操作）和 **Delete configuration**（删除配置）从 Quick Setup 中删除配置。您还可以在 **Actions**（操作）下拉列表下选择 **Configuration details**（配置详细信息）页面，然后选择 **Delete configuration**（删除配置），从而删除配置。然后，Quick Setup 将提示您 **Remove all OUs and Regions**（删除所有 OU 和区域），完成此操作可能需要一些时间。删除配置还会删除所有相关关联。此两步删除过程将从所有账户和区域中删除所有已部署的资源，然后删除配置。

## 配置合规性
<a name="quick-setup-compliance"></a>

您可以在 Explorer 或 Compliance（都是 AWS Systems Manager 中的工具）中查看实例是否符合配置创建的关联。要了解有关合规性的更多信息，请参阅 [了解有关合规性的详细信息](compliance-about.md)。要了解有关查看 Explorer 中的合规性的更多信息，请参阅 [AWS Systems Manager Explorer](Explorer.md)。

# 使用 Quick Setup API 管理配置和部署
<a name="quick-setup-api"></a>

您可以使用 Quick Setup 提供的 API，通过 AWS CLI 或您的首选 SDK 创建和管理配置与部署。您还可以使用 CloudFormation 创建用于部署配置的配置管理器资源。使用 API，您可以创建用于部署配置*定义*的配置管理器。配置定义包含部署特定配置类型的所有必要信息。有关使用 Quick Setup API 的更多信息，请参阅[快速设置 API 参考](https://docs.aws.amazon.com/quick-setup/latest/APIReference/)。

以下示例演示如何使用 AWS CLI 和 CloudFormation 创建配置管理器。

------
#### [ AWS CLI ]

```
aws ssm-quicksetup create-configuration-manager \
--name configuration manager name \
--description Description of your configuration manager
--configuration-definitions JSON string containing configuration defintion
```

以下是包含补丁策略配置定义的 JSON 字符串示例。

```
'{"Type":"AWSQuickSetupType-PatchPolicy","LocalDeploymentAdministrationRoleArn":"arn:aws:iam::123456789012:role/AWS-QuickSetup-StackSet-Local-AdministrationRole","LocalDeploymentExecutionRoleName":"AWS-QuickSetup-StackSet-Local-ExecutionRole","Parameters":{"ConfigurationOptionsInstallNextInterval":"true","ConfigurationOptionsInstallValue":"cron(0 2 ? * SAT#1 *)","ConfigurationOptionsPatchOperation":"ScanAndInstall","ConfigurationOptionsScanNextInterval":"false","ConfigurationOptionsScanValue":"cron(0 1 * * ? *)","HasDeletedBaseline":"false","IsPolicyAttachAllowed":"true","OutputBucketRegion":"","OutputLogEnableS3":"false","OutputS3BucketName":"","OutputS3KeyPrefix":"","PatchBaselineRegion":"us-east-1","PatchBaselineUseDefault":"custom","PatchPolicyName":"dev-patch-policy","RateControlConcurrency":"5","RateControlErrorThreshold":"0%","RebootOption":"RebootIfNeeded","ResourceGroupName":"","SelectedPatchBaselines":"{\"ALMA_LINUX\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-0cb0c4966f86b059b\",\"label\":\"AWS-AlmaLinuxDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Alma Linux Provided by AWS.\",\"disabled\":false},\"AMAZON_LINUX_2\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-0be8c61cde3be63f3\",\"label\":\"AWS-AmazonLinux2DefaultPatchBaseline\",\"description\":\"Baseline containing all Security and Bugfix updates approved for Amazon Linux 2 instances\",\"disabled\":false},\"AMAZON_LINUX_2023\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-05c9c9bf778d4c4d0\",\"label\":\"AWS-AmazonLinux2023DefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Amazon Linux 2023 Provided by AWS.\",\"disabled\":false},\"DEBIAN\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-09a5f8eb62bde80b1\",\"label\":\"AWS-DebianDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Debian Provided by AWS.\",\"disabled\":false},\"MACOS\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-0ee4f94581368c0d4\",\"label\":\"AWS-MacOSDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for MacOS Provided by AWS.\",\"disabled\":false},\"ORACLE_LINUX\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-06bff38e95fe85c02\",\"label\":\"AWS-OracleLinuxDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Oracle Linux Server Provided by AWS.\",\"disabled\":false},\"REDHAT_ENTERPRISE_LINUX\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-0cbb3a633de00f07c\",\"label\":\"AWS-RedHatDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Redhat Enterprise Linux Provided by AWS.\",\"disabled\":false},\"ROCKY_LINUX\":{\"value\":\"arn:aws:ssm:us-east-1:123456789012:patchbaseline/pb-03ec98bc512aa3ac0\",\"label\":\"AWS-RockyLinuxDefaultPatchBaseline\",\"description\":\"Default Patch Baseline for Rocky Linux Provided by AWS.\",\"disabled\":false},\"UBUNTU\":{\"value\":\"pb-06e3563bd35503f2b\",\"label\":\"custom-UbuntuServer-Blog-Baseline\",\"description\":\"Default Patch Baseline for Ubuntu Provided by AWS.\",\"disabled\":false},\"WINDOWS\":{\"value\":\"pb-016889927b2bb8542\",\"label\":\"custom-WindowsServer-Blog-Baseline\",\"disabled\":false}}","TargetInstances":"","TargetOrganizationalUnits":"ou-9utf-example","TargetRegions":"us-east-1,us-east-2","TargetTagKey":"Patch","TargetTagValue":"true","TargetType":"Tags"}}' \
```

------
#### [ CloudFormation ]

```
AWSTemplateFormatVersion: '2010-09-09'
Resources:
SSMQuickSetupTestConfigurationManager:
Type: "AWS::SSMQuickSetup::ConfigurationManager"
Properties:
    Name: "MyQuickSetup"
    Description: "Test configuration manager"
    ConfigurationDefinitions:
    - Type: "AWSQuickSetupType-CFGRecording"
      Parameters:
        TargetAccounts:
            Ref: AWS::AccountId
        TargetRegions:
            Ref: AWS::Region
        LocalDeploymentAdministrationRoleArn: !Sub "arn:aws:iam::${AWS::AccountId}:role/AWS-QuickSetup-StackSet-ContractTest-AdministrationRole"
        LocalDeploymentExecutionRoleName: "AWS-QuickSetup-StackSet-ContractTest-ExecutionRole"
    Tags:
        foo1: "bar1"
```

------

# 支持的 Quick Setup 配置类型
<a name="quick-setup-config-types"></a>

**支持的配置类型**  
Quick Setup 将指导您为多个 Systems Manager 和其他 AWS 服务 配置操作最佳实践，并自动部署这些配置。Quick Setup 控制面板显示配置部署状态的实时视图。

您可以通过与 AWS Organizations 集成在单个 AWS 账户中或跨多个 AWS 账户 和区域中使用 Quick Setup。跨多个账户使用 Quick Setup 有助于确保您的组织保持一致的配置。

Quick Setup 支持以下配置类型。
+ [使用 Quick Setup 设置 Amazon EC2 主机管理](quick-setup-host-management.md)
+ [使用 Quick Setup 为组织设置默认主机管理配置](quick-setup-default-host-management-configuration.md)
+ [使用 Quick Setup 创建 AWS Config 配置记录器](quick-setup-config.md)
+ [使用 Quick Setup 部署 AWS Config 一致性包](quick-setup-cpack.md)
+ [使用 Quick Setup 补丁策略为组织中的实例配置修补](quick-setup-patch-manager.md)
+ [Change Manager 组织设置](change-manager-organization-setup.md)
+ [使用 Quick Setup 设置 DevOps Guru](quick-setup-devops.md)
+ [使用 Quick Setup 部署 Distributor 软件包](quick-setup-distributor.md)
+ [按计划使用 Quick Setup 自动停止和启动 EC2 实例](quick-setup-scheduler.md)
+ [OpsCenter 组织设置](OpsCenter-quick-setup-cross-account.md)
+ [使用 Quick Setup 配置 AWS 资源探索器](Resource-explorer-quick-setup.md)

# 使用 Quick Setup 设置 Amazon EC2 主机管理
<a name="quick-setup-host-management"></a>

使用Quick Setup（AWS Systems Manager 中的一项工具）在 Amazon Elastic Compute Cloud（Amazon EC2）实例上快速配置必要的安全角色和常用的 Systems Manager 工具。可通过与 AWS Organizations 集成在单个账户中或跨多个账户和 AWS 区域使用 Quick Setup。这些工具帮助您管理和监控实例的运行状况，同时提供开始使用所需的最低权限。

如果您不熟悉 Systems Manager 的服务和功能，建议您先查看《*AWS Systems Manager 用户指南*》，然后再使用 Quick Setup 创建配置。有关 Systems Manager 的更多信息，请参阅 [什么是 AWS Systems Manager？](what-is-systems-manager.md)。

**重要**  
如果以下任一项适用于您，则 Quick Setup 可能不是适合 EC2 管理使用的正确工具：  
您第一次尝试创建 EC2 实例，以尝试 AWS 功能。
您仍然是 EC2 实例管理的新客户。
相反，建议您浏览以下内容：  
[Amazon EC2 入门](https://aws.amazon.com/ec2/getting-started)
《Amazon EC2 用户指南》**中的[使用新启动实例向导启动实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ec2-launch-instance-wizard.html)
《Amazon EC2 用户指南》**中的[教程：Amazon EC2 Linux 实例入门](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/EC2_GetStarted.html)
如果您已经熟悉 EC2 实例管理，并且希望简化多个 EC2 实例的配置和管理，请使用 Quick Setup。无论您的组织有几十个、数千个还是数百万个 EC2 实例，都可以使用以下 Quick Setup 过程一次性为它们配置多个选项。

**注意**  
借助此配置类型，您可以为 AWS Organizations 中定义的整个组织、仅部分组织账户和区域或单个账户设置多个选项。其中一个选项是每两周检查并应用 SSM Agent 更新。如果您是组织管理员，则还可以选择使用默认主机管理配置类型，每两周更新一次代理，从而更新组织中的*所有* EC2 实例。有关信息，请参阅[使用 Quick Setup 为组织设置默认主机管理配置](quick-setup-default-host-management-configuration.md)。

## 配置 EC2 实例的主机管理选项
<a name="host-management-configuration"></a>

要设置主机管理，请在 AWS Systems Manager Quick Setup 控制台中执行以下任务。

**打开“主机管理配置”页面**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**主机管理**卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

**配置 Systems Manager 主机管理选项**
+ 要配置 Systems Manager 功能，请在**配置选项**部分的 **Systems Manager** 组中选择要为配置启用的选项：

     
**每两周更新一次 Systems Manager（SSM）代理**  
启用 Systems Manager，每两周检查一次是否存在新版本的代理。如果存在新版本，Systems Manager 会自动将托管式节点上的代理更新为发布的最新版本。Quick Setup 不会在尚不存在代理的实例上安装此代理。有关哪些 AMIs 预装了 SSM Agent 的信息，请参阅 [查找预装了 SSM Agent 的 AMIs](ami-preinstalled-agent.md)。  
建议您选择此选项，以确保您的节点始终运行最新版本的 SSM Agent。有关 SSM Agent 的更多信息（包括有关如何手动安装该代理的信息），请参阅 [使用 SSM Agent](ssm-agent.md)。  
**每 30 分钟从实例中收集一次清单**  
启用 Quick Setup 配置以下类型的元数据收集：  
  + **AWS 组件** - EC2 驱动程序、代理和版本等。
  + **应用程序** - 应用程序名称、发布者和版本等。
  + **节点详细信息** - 系统名称、操作系统（OS）名称、操作系统版本、上次启动时间、DNS、域、工作组和操作系统架构等。
  + **网络配置** - IP 地址、MAC 地址、DNS、网关和子网掩码等。
  + **服务** - 名称、显示名称、状态、相关服务、服务类型和启动类型等（仅限 Windows Server 节点）。
  + **Windows 角色** - 名称、显示名称、路径、功能类型和安装状态等（仅限 Windows Server 节点）。
  + **Windows 更新** - 补丁 ID、安装者和安装日期等（仅限 Windows Server 节点）。
有关 Inventory（AWS Systems Manager 中的一项工具）的更多信息，请参阅 [AWS Systems Manager 清单](systems-manager-inventory.md)。  
即使您仅选择了几个节点，**Inventory collection**（清单收集）选项也可能需要长达 10 分钟才能完成。  
**每天扫描实例以查找缺少的补丁**  
启用Patch Manager（Systems Manager 中的一项工具），每天扫描节点并在**合规性**页面中生成报告。该报告根据*默认补丁基准*显示满足补丁合规性的节点数。该报告包含一份关于每个节点及其合规性状态的列表。  
有关修补操作和补丁基准的信息，请参阅 [AWS Systems Manager Patch Manager](patch-manager.md)。  
要查看补丁合规信息，请参阅 Systems Manager [合规性](https://console.aws.amazon.com/systems-manager/compliance)页面。  
有关在一个配置中修补多个账户和区域中的托管节点的信息，请参阅 [Quick Setup 中的补丁策略配置](patch-manager-policies.md) 和 [使用 Quick Setup 补丁策略为组织中的实例配置修补](quick-setup-patch-manager.md)。  
Systems Manager 支持多种方法来扫描托管节点，以满足补丁合规性。若同时执行上述方法中的多种方法，您看到的补丁合规信息将始终是最近一次扫描的结果。先前扫描的结果将被覆盖。如果扫描方法使用不同的补丁基准，有不同的批准规则，那么补丁合规信息可能会出现意外变更。有关更多信息，请参阅 [识别创建补丁合规性数据的执行](patch-manager-compliance-data-overwrites.md)。

**配置 Amazon CloudWatch 主机管理选项**
+ 要配置 CloudWatch 功能，请在**配置选项**部分的 **Amazon CloudWatch** 组中选择要为配置启用的选项：

     
**安装和配置 CloudWatch 代理**  
在 Amazon EC2 实例上安装统一的 CloudWatch 代理的基本配置。代理将从 Amazon CloudWatch 的实例中收集指标和日志文件。将合并此信息以快速确定实例的运行状况。有关 CloudWatch 代理基本配置的更多信息，请参阅 [CloudWatch 代理预定义指标集](https://docs.aws.amazon.com/AmazonCloudWatch/latest/monitoring/create-cloudwatch-agent-configuration-file-wizard.html#cloudwatch-agent-preset-metrics)。可能会增加成本。有关更多信息，请参阅 [Amazon CloudWatch 定价](https://aws.amazon.com/cloudwatch/pricing/)。  
**每 30 天更新一次 CloudWatch 代理**  
启用 Systems Manager，每 30 天检查一次是否存在新版本的 CloudWatch 代理。如果存在新版本， Systems Manager 会自动在实例上更新代理。我们建议您选择该选项，以确保您的实例始终运行最新版本的 CloudWatch 代理。

**配置 Amazon EC2 启动代理的主机管理选项**
+ 要配置 Amazon EC2 启动代理功能，请在**配置选项**部分的 **Amazon EC2 启动代理**组中选择要为配置启用的选项：

     
**每 30 天更新一次 EC2 启动代理**  
启用 Systems Manager，每 30 天检查一次实例上安装的启动代理是否存在新版本。如果有新版本可用，则 Systems Manager 会在实例上更新代理。我们建议您选择该选项，以确保您的实例始终运行最新版本的适用启动代理。对于 Amazon EC2 Windows 实例，此选项支持 EC2Launch、EC2Launch v2 和 EC2Config。对于 Amazon EC2 Linux 实例，此选项支持 `cloud-init`。对于 Amazon EC2 Mac 实例，此选项支持 `ec2-macos-init`。Quick Setup 不支持更新安装在启动代理不支持的操作系统或 AL2023 上的启动代理。  
有关这些初始化代理的更多信息，请参阅以下主题：  
  +  [使用 EC2Launch v2 配置 Windows 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2launch-v2.html) 
  +  [使用 EC2Launch 配置 Windows 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2launch.html) 
  +  [使用 EC2Config 服务配置 Windows 实例](https://docs.aws.amazon.com/AWSEC2/latest/WindowsGuide/ec2config-service.html) 
  +  [cloud-init 文档](https://cloudinit.readthedocs.io/en/22.2.2/index.html) 
  +  [ec2-macos-init](https://github.com/aws/ec2-macos-init) 

**选择要通过“主机管理配置”更新的 EC2 实例**
+ 在**目标**部分，选择用于确定要部署配置的账户和区域的方法：
**注意**  
无法创建定位同一 AWS 区域的多个 Quick Setup 主机管理配置。

------
#### [ Entire organization ]

  配置已部署到所有组织单位（OU）和组织中的 AWS 区域。

**注意**  
仅当正在从组织的管理账户配置主机管理时，**整个组织**选项才可用。

------
#### [ Custom ]

  1. 在**目标 OU** 部分，选择要部署“主机管理配置”的 OU。

  1. 在**目标区域**部分，选择要部署“主机管理配置”的区域。

------
#### [ Current account ]

  选择其中一个区域选项，然后按照该选项的步骤进行操作。

   

**当前区域**  
选择如何仅将当前区域中的实例作为目标：  
  + **所有实例** –“主机管理配置”会自动将当前区域中每个 EC2 实例作为目标。
  + **标签** – 选择**添加**，并输入添加到要作为目标的实例的键和可选值。
  + **资源组** – 对于**资源组**，选择包含要作为目标的 EC2 实例的现有资源组。
  + **手册** – 在**实例**部分中，选中要作为目标的每个 EC2 实例的复选框。

**选择区域**  
通过选择以下选项之一，选择如何将指定区域中的实例作为目标：  
  + **所有实例** – 将指定区域中的所有实例作为目标。
  + **标签** – 选择**添加**，并输入已添加到要作为目标的实例的键和可选值。
在**目标区域**部分，选择要部署“主机管理配置”的区域。

------

**指定实例配置文件选项**
+ *仅限**整个组织**和**自定义**目标。*

  在**实例配置文件选项**部分，选择是要将必需的 IAM 策略添加至已附加到实例的现有实例配置文件，还是允许 Quick Setup 使用所选配置所需权限创建 IAM 策略和实例配置文件。

指定好所有配置选项后，选择**创建**。

# 使用 Quick Setup 为组织设置默认主机管理配置
<a name="quick-setup-default-host-management-configuration"></a>

借助Quick Setup（AWS Systems Manager 中的一项工具），您可以为自己在 AWS Organizations 中添加到组织的所有账户和区域激活默认主机管理配置。这样可以确保组织中所有 Amazon Elastic Compute Cloud（EC2）实例上的 SSM Agent 保持更新，并且可以连接到 Systems Manager。

**开始前的准备工作**  
您必须满足以下要求才能启用此设置。
+ 组织中要管理的所有 EC2 实例上都已安装了最新版本的 SSM Agent。
+ 要管理的 EC2 实例使用的是实例元数据服务版本 2（IMDSv2）。
+ 您使用具有管理员权限的 AWS Identity and Access Management（IAM）身份（用户、角色或组）登录组织的管理账户（如在 AWS Organizations 中所指定）。

**使用默认 EC2 实例管理角色**  
默认主机管理配置将使用 Systems Manager 的 `default-ec2-instance-management-role` 服务设置。该角色具有您希望提供给组织中所有账户的权限，从而便于在实例上的 SSM Agent 与云端 Systems Manager 服务之间进行通信。

如果您已经使用 [https://docs.aws.amazon.com/cli/latest/reference/ssm/update-service-setting.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/update-service-setting.html) CLI 命令设置了该角色，则默认主机管理配置将使用该角色。如果您尚未设置，Quick Setup 将为您创建并应用该角色。

要检查是否已经为您的组织指定了该角色，请使用 [https://docs.aws.amazon.com/cli/latest/reference/ssm/get-service-setting.html](https://docs.aws.amazon.com/cli/latest/reference/ssm/get-service-setting.html) 命令。

## 启用每两周自动更新 SSM Agent
<a name="dhmc-enable-automatic-updates"></a>

按照以下过程为整个 AWS Organizations 组织启用“默认主机管理配置”选项。

**启用每两周自动更新 SSM Agent**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**默认主机管理配置**选项片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在**配置选项**部分中，选择**启用每两周自动更新 SSM Agent**。

1. 选择 **Create**（创建）。

# 使用 Quick Setup 创建 AWS Config 配置记录器
<a name="quick-setup-config"></a>

借助Quick Setup（AWS Systems Manager 中的一项工具），您可以快速创建由 AWS Config 提供支持的配置记录器。使用配置记录器在您的资源配置中检测更改，并将这些更改捕获为配置项。如果您不熟悉 AWS Config，建议您在使用 Quick Setup 创建配置之前查看《*AWS Config 开发人员指南*》内容，了解有关该服务的更多信息 有关 AWS Config 的更多信息，请参阅《*AWS Config 开发人员指南*》中的[什么是 AWS Config？](https://docs.aws.amazon.com/config/latest/developerguide/WhatIsConfig.html)。

预设情况下，配置记录器会记录正在运行 AWS Config 的 AWS 区域内所有受支持的资源。您可以自定义配置，以仅记录指定的资源类型。有关更多信息，请参阅《*AWS Config 开发人员指南*》中的[选择 AWS Config 记录的资源](https://docs.aws.amazon.com/config/latest/developerguide/select-resources.html)。

当 AWS Config 开始记录配置时，我们就会向您收取服务使用费。有关定价信息，请参阅 [AWS Config 定价](https://aws.amazon.com/config/pricing/)。

**注意**  
如果您已经创建了配置记录器，Quick Setup 不会停止记录或对已记录资源类型进行任何更改。如果您选择使用 Quick Setup 记录其他资源类型，则该服务会将它们附加到您现有的记录器组中。删除Quick Setup **Config 记录**配置类型时，配置记录器不会停止工作。将继续记录更改，并且在停止配置记录器之前会一直收取服务使用费。要了解有关管理配置记录器的更多信息，请参阅《*AWS Config 开发人员指南*》中的[管理配置记录器](https://docs.aws.amazon.com/config/latest/developerguide/stop-start-recorder.html)。

要设置 AWS Config 记录，请在 AWS Systems Manager 控制台中执行以下任务。

**使用 Quick Setup 设置 AWS Config 记录**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**配置记录**卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在**配置选项**部分中，执行以下操作：

   1. 对于**选择要记录的 AWS 资源类型**，指定是记录所有支持的资源还是仅记录您选择的资源类型。

   1. 对于**交付设置**，指定是新建 Amazon Simple Storage Service（Amazon S3）存储桶，还是选择要向其发送配置快照的现有存储桶。

   1. 对于**通知选项**，选择您的首选通知选项。AWS Config 将使用 Amazon Simple Notification Service（Amazon SNS）通知您与您的资源有关的重要 AWS Config 事件。如果选择**使用现有 SNS 主题**选项，则必须在要使用的账户中提供现有 Amazon SNS 主题的 AWS 账户 ID 和名称。如果要定位多个 AWS 区域，则每个区域中的主题名称必须相同。

1. 在**计划**部分中，选择 Quick Setup 修复对资源所做的不同于配置的更改时的所需频率。**默认值**选项运行一次。如果您不希望 Quick Setup 修复对资源所做的不同于配置的更改，请在**自定义**下选择选择**禁用修复**。

1. 在**目标**部分中，选择以下选项之一以确定用于记录的账户和区域。
**注意**  
如果您使用单一账户，用于组织和组织单位 (OU) 的选项将不可用。您可以选择是将此配置应用于账户 AWS 区域 中的所有区域，还是仅将此配置应用于您选择的区域。
   + **Entire organization**（整个组织）：组织中的所有账户和区域。
   + **Custom**（自定义）：仅限您指定的 OU 和区域。
     + 在**目标 OU** 部分中，选择要允许进行记录的 OU。
     + 在**目标区域**部分中，选择要允许进行记录的区域。
   + **Current account**（当前账户）：只有您在当前登录的账户中指定的区域才是目标区域。选择下列选项之一：
     + **Current Region**（当前区域）：仅以在控制台中选择的区域中的托管节点为目标。
     + **选择区域**：选择要将记录配置应用到的各个区域。

1. 选择**创建**。

# 使用 Quick Setup 部署 AWS Config 一致性包
<a name="quick-setup-cpack"></a>

一致性包是 AWS Config 规则和修复操作的集合。可在 AWS Organizations 中通过 Quick Setup 将一致性包部署为账户和 AWS 区域或整个组织中的单个实体。这有助于使用通用框架和打包模型大规模管理 AWS 资源的配置合规性，即从策略定义一直到审计和汇总报告。

要部署一致性包，请在 AWS Systems Manager Quick Setup 控制台中执行以下任务。

**注意**  
必须先启用 AWS Config 记录，然后再部署此配置。有关更多信息，请参阅《*AWS Config 开发人员指南*》中的[一致性包](https://docs.aws.amazon.com/config/latest/developerguide/conformance-packs.html)。

**使用 Quick Setup 部署一致性包**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**一致性包**卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在**选择配置包**部分中，选择要部署的一致性包。

1. 在**计划**部分中，选择 Quick Setup 修复对资源所做的不同于配置的更改时的所需频率。**默认值**选项运行一次。如果不希望 Quick Setup 修复对资源所做的不同于配置的更改，请在**自定义**下选择**禁用**。

1. 在**目标**部分中，选择是要将一致性包部署到整个组织、其中一些 AWS 区域 还是当前登录的账户。

   如果选择**整个组织**，继续执行步骤 8。

   如果选择**自定义**，继续执行步骤 7。

1. 在**目标区域**部分中，选中要部署一致性包的区域的复选框。

1. 选择**创建**。

# 使用 Quick Setup 补丁策略为组织中的实例配置修补
<a name="quick-setup-patch-manager"></a>

借助Quick Setup（AWS Systems Manager 中的一项工具），您可以创建由Patch Manager提供支持的补丁策略。补丁策略定义了自动修补 Amazon Elastic Compute Cloud (Amazon EC2) 实例和其他托管节点时要使用的计划和基准。使用单一补丁策略配置，您可以为贵组织中多个 AWS 区域 的所有账户定义修补、仅为所选的账户和区域定义修补，或为单个账户区域对定义修补。有关补丁策略的更多信息，请参阅 [Quick Setup 中的补丁策略配置](patch-manager-policies.md)。

**先决条件**  
要使用 Quick Setup 为节点定义补丁策略，该节点必须是*托管节点*。有关管理节点的更多信息，请参阅 [为组织设置 Systems Manager 统一控制台](systems-manager-setting-up-organizations.md)。

**重要**  
**补丁合规性扫描方法** – Systems Manager 支持多种方法来扫描托管式节点，可以满足补丁合规性。若同时执行上述方法中的多种方法，您看到的补丁合规信息将始终是最近一次扫描的结果。先前扫描的结果将被覆盖。如果扫描方法使用不同的补丁基准，有不同的批准规则，那么补丁合规信息可能会出现意外变更。有关更多信息，请参阅 [识别创建补丁合规性数据的执行](patch-manager-compliance-data-overwrites.md)。  
**关联合规性状态和补丁策略** – Quick Setup 补丁策略下的托管式节点的修补状态与该节点的 State Manager 关联执行状态相匹配。如果关联执行状态为 `Compliant`，则还会将托管式节点的修补状态标记为 `Compliant`。如果关联执行状态为 `Non-Compliant`，则还会将托管式节点的修补状态标记为 `Non-Compliant`。

## 支持补丁策略配置的区域
<a name="patch-policies-supported-regions"></a>

以下区域当前支持 Quick Setup 中的补丁策略配置：
+ 美国东部（俄亥俄州）(us-east-2)
+ 美国东部（弗吉尼亚州北部）(us-east-1)
+ 美国西部（北加利福尼亚）(us-west-1)
+ 美国西部（俄勒冈州）(us-west-2)
+ 亚太地区（孟买）(ap-south-1)
+ 亚太地区（首尔）(ap-northeast-2)
+ 亚太地区（新加坡）(ap-southeast-1)
+ 亚太地区（悉尼）(ap-southeast-2)
+ 亚太地区（东京）(ap-northeast-1)
+ 加拿大（中部）(ca-central-1)
+ 欧洲地区（法兰克福）(eu-central-1)
+ 欧洲地区（爱尔兰）(eu-west-1)
+ 欧洲地区（伦敦）(eu-west-2)
+ 欧洲地区（巴黎）（eu-west-3）
+ 欧洲地区（斯德哥尔摩）(eu-north-1)
+ 南美洲（圣保罗）（sa-east-1）

## 补丁策略 S3 存储桶的权限
<a name="patch-policy-s3-bucket-permissions"></a>

创建补丁策略时，Quick Setup 会创建一个 Amazon S3 存储桶，其中包含一个名为 `baseline_overrides.json` 的文件。此文件存储了有关为补丁策略指定的补丁基准的信息。

S3 存储桶以 `aws-quicksetup-patchpolicy-account-id-quick-setup-configuration-id` 格式命名。

例如：`aws-quicksetup-patchpolicy-123456789012-abcde`

如果您要为组织创建补丁策略，则存储桶将在组织的管理账户中创建。

对于以下两种使用案例，您必须向其他 AWS 资源提供使用 AWS Identity and Access Management（IAM）policy 访问此 S3 存储桶的权限：
+ [情况 1：将您自己的实例配置文件或服务角色与托管式节点一起使用，而不是 Quick Setup 提供的实例配置文件或服务角色](#patch-policy-instance-profile-service-role)
+ [情况 2：使用 VPC 端点连接到 Systems Manager](#patch-policy-vpc)

无论哪种情况，您需要的权限策略位于下面的 [Quick Setup S3 存储桶的策略权限](#patch-policy-bucket-permissions)。

### 情况 1：将您自己的实例配置文件或服务角色与托管式节点一起使用，而不是 Quick Setup 提供的实例配置文件或服务角色
<a name="patch-policy-instance-profile-service-role"></a>

补丁策略配置包括一个选项，用于**将所需的 IAM policy 添加到附加于实例的现有实例配置文件中**。

如果您不选择此选项，但想要 Quick Setup 使用此补丁策略修补托管式节点，则必须确保实施以下内容：
+ IAM 托管式策略 `AmazonSSMManagedInstanceCore` 必须附加到用于向托管式节点提供 Systems Manager 权限的 [IAM [实例配置文件](setup-instance-permissions.md)或 IAM 服务角色](hybrid-multicloud-service-role.md)。
+ 您必须将访问补丁策略存储桶的权限添加为 IAM 实例配置文件或 IAM 服务角色的内联策略。您可以提供对所有 `aws-quicksetup-patchpolicy` 存储桶的通配符访问权限，或仅对为组织或账户创建的特定存储桶提供通配符访问权限，如前面的代码示例所示。
+ 您必须使用以下键值对标记 IAM 实例配置文件或 IAM 服务角色。

  `Key: QSConfigId-quick-setup-configuration-id, Value: quick-setup-configuration-id`

  *quick-setup-configuration-id* 表示应用于创建补丁策略配置时使用的 AWS CloudFormation 堆栈的参数值。要检索此 ID，请执行以下操作：

  1. 通过以下网址打开 CloudFormation 控制台：[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/)。

  1. 选择用于创建补丁策略的堆栈名称。名称的格式，例 `StackSet-AWS-QuickSetup-PatchPolicy-LA-q4bkg-52cd2f06-d0f9-499e-9818-d887cEXAMPLE`。

  1. 选择**参数**选项卡。

  1. 在**参数**列表的**密钥**列中，找到密钥 **QSConfigurationId**。在其行的**值**列中，找到配置 ID，例如 `abcde`。

     在此示例中，对于要应用于实例配置文件或服务角色的标签，密钥为 `QSConfigId-abcde`，值为 `abcde`。

有关向 IAM 角色添加标签的信息，请参阅《IAM 用户指南》**中的[标记 IAM 角色](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_roles.html#id_tags_roles_procs-console)和[管理实例配置文件（AWS CLI 或 AWS API）的标签](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_tags_instance-profiles.html#id_tags_instance-profile_procs-cli-api)。

### 情况 2：使用 VPC 端点连接到 Systems Manager
<a name="patch-policy-vpc"></a>

如果您使用 VPC 端点连接到 Systems Manager，则 S3 的 VPC 端点策略必须允许访问 Quick Setup 补丁策略 S3 存储桶。

有关为 S3 的 VPC 端点策略添加权限的信息，请参阅《Amazon S3 用户指南》**中的[使用桶策略控制从 VPC 端点的访问](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-bucket-policies-vpc-endpoint.html)。

### Quick Setup S3 存储桶的策略权限
<a name="patch-policy-bucket-permissions"></a>

您可以提供对所有 `aws-quicksetup-patchpolicy` 存储桶的通配符访问权限，或仅对为组织或账户创建的特定存储桶提供通配符访问权限。要为下述两种情况提供必要的权限，请使用任一格式。

------
#### [ All patch policy buckets ]

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToAllPatchPolicyRelatedBuckets",
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::aws-quicksetup-patchpolicy-*"
    }
  ]
}
```

------

------
#### [ Specific patch policy bucket ]

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "AccessToMyPatchPolicyRelatedBucket",
      "Effect": "Allow",
      "Action": "s3:GetObject",
      "Resource": "arn:aws:s3:::aws-quicksetup-patchpolicy-111122223333-quick-setup-configuration-id"
    }
  ]
}
```

------

**注意**  
创建补丁策略配置后，您可以在 S3 控制台中找到存储桶的全名。例如：`aws-quicksetup-patchpolicy-123456789012-abcde`

------

## 补丁策略操作中的随机补丁基准 ID
<a name="qs-patch-baselines-and-compliance"></a>

补丁策略的修补操作使用 `AWS-RunPatchBaseline` SSM Command 文档中的 `BaselineOverride` 参数。

您使用 `AWS-RunPatchBaseline` 在修补策略*之外*进行修补时，可以使用 `BaselineOverride` 指定要在操作期间使用的补丁基准列表，这些基准不同于指定的默认基准。您在名为 `baseline_overrides.json` 的文件中创建此列表，并将其手动添加到您拥有的 Amazon S3 存储桶，如 [使用基准覆盖参数](patch-manager-baselineoverride-parameter.md) 中所述。

但是，对于基于补丁策略的修补操作，Systems Manager 会自动创建 S3 存储桶并向其中添加 `baseline_overrides.json` 文件。然后，Quick Setup每次运行修补操作（使用 Run Command 工具）时，系统都会为每个补丁基准生成一个随机 ID。对于每个补丁策略修补操作，此 ID 都是不同的，并且它代表的补丁基准不会在您的账户中存储或访问。

因此，您将不会在修补日志中看到配置中选择的补丁基准 ID。这适用于 AWS 托管式补丁基准和您可能选择的自定义补丁基准。日志中报告的基准 ID 是为此特定修补操作生成的基准 ID。

此外，如果您尝试在 Patch Manager 中查看有关使用随机 ID 生成的补丁基准的详细信息，系统会报告此补丁基准不存在。此为预期行为，可以安全忽略。

## 创建补丁策略
<a name="create-patch-policy"></a>

要创建补丁策略，请在 Systems Manager 控制台中执行以下任务。

**使用 Quick Setup 创建补丁策略**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

   如果您正在为组织设置修补，请确保您已登录到该组织的管理账户。您无法使用委派管理员账户或成员账户设置策略。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在 **Patch Manager**（补丁管理器）选项卡上，选择 **Create**（创建）。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在 **Configuration name**（配置名称）中输入名称以帮助识别补丁策略。

1. 在**扫描和安装**部分的**补丁操作**下，选择补丁策略是**扫描**指定目标还是在指定目标桑**扫描并安装**补丁。

1. 在 **Scanning schedule**（扫描计划）下，选择 **Use recommended defaults**（使用推荐的默认值）或 **Custom scan schedule**（自定义扫描计划）。默认扫描计划将在世界标准时间每天凌晨 1 点扫描目标。
   + 如果选择 **Custom scan schedule**（自定义扫描计划），请选择 **Scanning frequency**（扫描频率）。
   + 如果您选择 **Daily**（每日），请以 UTC 为单位输入要扫描目标的时间。
   + 如果选择 **Custom CRON Expression**（自定义 CRON 表达式），请以 **CRON 表达式**的形式输入计划。有关为 Systems Manager 设置 CRON 表达式的更多信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

     此外，选择 **Wait to scan targets until first CRON interval**（等到第一个 CRON 间隔才扫描目标）。默认情况下，在节点成为目标时 Patch Manager 立即对其进行扫描。

1. 如果选择 **Scan and install**（扫描并安装），请选择向指定目标安装补丁时要使用的 **Installation schedule**（安装计划）。如果您选择 **Use recommended defaults**（使用推荐的默认值），则 Patch Manager 将在世界标准时间星期天凌晨 2 点安装补丁。
   + 如果选择 **Custom install schedule**（自定义安装计划），请选择 **Installation frequency**（安装频率）。
   + 如果您选择 **Daily**（每日），请输入要对目标更新安装的时间。
   + 如果选择 **Custom CRON expression**（自定义 CRON 表达式），请以 **CRON 表达式**的形式输入计划。有关为 Systems Manager 设置 CRON 表达式的更多信息，请参阅 [参考：适用于 Systems Manager 的 Cron 和 Rate 表达式](reference-cron-and-rate-expressions.md)。

     此外，清除 **Wait to install updates until first CRON interval**（等到第一个 CRON 间隔才安装更新），以便在节点成为目标时立即在节点上安装更新。默认情况下，Patch Manager 等到第一个 CRON 间隔出现才会安装更新。
   + 安装补丁后，请选择 **Reboot if needed**（需要时重新启动）以重新启动节点。建议在安装后重新启动，但可能会导致可用性问题。

1. 在 **Patch baseline**（补丁基准）部分中，选择扫描和更新目标时要使用的补丁基准。

   默认情况下，Patch Manager 使用预定义的补丁基准。有关更多信息，请参阅 [预定义基准](patch-manager-predefined-and-custom-patch-baselines.md#patch-manager-baselines-pre-defined)。

   如果您选择 **Custom patch baseline**（自定义补丁基准），请为不想使用预定义 AWS 补丁基准的操作系统更改所选补丁基准。
**注意**  
如果您使用 VPC 端点连接到 Systems Manager，确保 S3 的 VPC 端点策略必须允许访问此 S3 存储桶。有关更多信息，请参阅 [补丁策略 S3 存储桶的权限](#patch-policy-s3-bucket-permissions)。
**重要**  
如果您在 Quick Setup 中使用[补丁策略配置](patch-manager-policies.md)，则系统会每小时与 Quick Setup 同步一次您对自定义补丁基准所做的更新。  
如果删除了补丁策略中引用的自定义补丁基准，那么补丁策略的 Quick Setup **Configuration details**（配置详细信息）页面上会显示一个横幅。横幅将通知您，补丁策略引用的补丁基准已不存在，且后续的修补操作将失败。在这种情况下，返回 Quick Setup **Configurations**（配置）页面，选择 Patch Manager 配置，然后选择 **Actions**（操作），**Edit configuration**（编辑配置）。已删除的补丁基准名称将突出显示，您必须为受影响的操作系统选择新的补丁基准。

1. （可选）在 **Patching log storage**（修补日志存储）部分中，选择 **Write output to S3 bucket**（将输出写入 S3 存储桶），将补丁操作日志存储在 Amazon S3 存储桶中。
**注意**  
如果您要为组织设置补丁策略，则您的组织的管理账户必须至少具有此存储桶的只读权限。策略中包含的所有组织单位都必须具有存储桶的写入权限。有关向不同账户授予存储桶访问权限的信息，请参阅 *Amazon Simple Storage Service 用户指南*中的[示例 2：存储桶所有者授予跨账户存储桶权限](https://docs.aws.amazon.com/AmazonS3/latest/userguide/example-walkthroughs-managing-access-example2.html)。

1. 选择**浏览 S3**，以选择要在其中存储补丁日志输出的存储桶。管理账户必须具有对此存储桶的读取权限。在 **Targets**（目标）部分配置的所有非管理账户和目标都必须具有对所提供的 S3 存储桶的写入权限才能进行记录。

1. 在 **Targets**（目标）部分中，选择以下选项之一以确定此补丁策略操作的账户和区域。
**注意**  
如果您使用单一账户，用于组织和组织单位 (OU) 的选项将不可用。您可以选择是将此配置应用于账户 AWS 区域 中的所有区域，还是仅将此配置应用于您选择的区域。  
如果您之前为自己的账户指定了主区域，但尚未加入新的 Quick Setup 主机体验，则无法将该区域从**目标**配置中排除。
   + **Entire organization**（整个组织）：组织中的所有账户和区域。
   + **Custom**（自定义）：仅限您指定的 OU 和区域。
     + 在 **Target OUs**（目标组织单位）部分，选择要设置补丁策略的组织单位。
     + 在 **Target Regions**（目标区域）部分，选择要设置补丁策略的区域。
   + **Current account**（当前账户）：只有您在当前登录的账户中指定的区域才是目标区域。选择下列选项之一：
     + **Current Region**（当前区域）：仅以在控制台中选择的区域中的托管节点为目标。
     + **Choose Regions**（选择区域）：选择要将补丁策略应用到的各个区域。

1. 对于 **Choose how you want to target instances**（选择您希望如何定位实例），请选择以下选项之一来标记要修补的节点：
   + **All managed nodes**（所有托管节点）：选定 OU 和区域中的所有托管节点。
   + **Specify the resource group**（指定资源组）：从列表中选择资源组的名称以将其关联资源作为目标。
**注意**  
目前，仅单个账户配置支持选择资源组。要修补多个账户中的资源，请选择不同的目标选项。
   + **Specify a node tag**（指定节点标签）：只有使用您指定的键值对标记的节点才会在您的目标账户和区域中得到修补。
   + **Manual**（手动）：从列表中手动选择所有指定账户和区域的托管节点。
**注意**  
此选项目前仅支持 Amazon EC2 实例。您可以在补丁策略配置中最多手动添加 25 个实例。

1. 在 **Rate control**（速率控制）部分，执行以下操作：
   + 对于 **Concurrency**（并发），输入要同时运行补丁策略的节点数量或百分比。
   + 对于 **Error threshold**（错误阈值），输入在补丁策略失败之前可能出现错误的节点数量或百分比。

1. 选择**将所需的 IAM policy 添加到附加到实例的现有实例配置文件**复选框。

   此选择会将此 Quick Setup 配置创建的 IAM policy 应用于已附加实例配置文件（EC2 实例）或服务角色（混合激活节点）的节点。若您的托管式节点已经附加实例配置文件或服务角色，但它不包含使用 Systems Manager 所需的所有权限，我们推荐选择该选项。

   此处的选择将应用于稍后在此补丁策略配置应用的账户和区域中创建的托管节点。
**重要**  
如果您不选中此复选框，但想要 Quick Setup 使用此补丁策略修补托管式节点，则必须确保实施以下内容：  
向您的 [IAM 实例配置文件](setup-instance-permissions.md)或 [IAM 服务角色](hybrid-multicloud-service-role.md)添加权限，以访问为补丁策略创建的 S3 存储桶  
使用特定的键值对标记 IAM 实例配置文件或 IAM 服务角色。  
有关信息，请参阅[情况 1：将您自己的实例配置文件或服务角色与托管式节点一起使用，而不是 Quick Setup 提供的实例配置文件或服务角色](#patch-policy-instance-profile-service-role)。

1. 选择**创建**。

   在创建补丁策略后要查看补丁状态，您可以从 [https://console.aws.amazon.com/systems-manager/quick-setup](https://console.aws.amazon.com/systems-manager/quick-setup) 页面访问配置。

# 使用 Quick Setup 设置 DevOps Guru
<a name="quick-setup-devops"></a>

可通过使用 Quick Setup 快速配置 DevOps Guru 选项。Amazon DevOps Guru 是由机器学习 (ML) 支持的服务，可轻松提高应用程序的运行性能和可用性。DevOps Guru 会检测到与正常操作模式不同的行为，因此可尽早识别运行问题，以免影响客户。DevOps Guru 会自动从 AWS 应用程序提取数据，并提供单一控制面板，用于可视化运行数据中的问题。无需手动设置或具备机器学习专业知识即可开始使用 DevOps Guru，以提高应用程序可用性和可靠性。

可以在以下 AWS 区域 中使用 Quick Setup 配置 DevOps Guru：
+ 美国东部（弗吉尼亚州北部）
+ 美国东部（俄亥俄州）
+ 美国西部（俄勒冈州）
+ 欧洲地区（法兰克福）
+ 欧洲地区（爱尔兰）
+ 欧洲地区（斯德哥尔摩）
+ 亚太地区（新加坡）
+ 亚太地区（悉尼）
+ 亚太地区（东京）

有关定价信息，请参阅 [Amazon DevOps Guru 定价](https://aws.amazon.com/devops-guru/pricing/)。

要设置 DevOps Guru，请在 AWS Systems Manager Quick Setup 控制台中执行以下操作。

**使用 Quick Setup 设置 DevOps Guru**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，选择 **Quick Setup**。

1. 在 **DevOps Guru** 卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在**配置选项**部分，选择要分析的 AWS 资源类型以及通知首选项。

   如果未选择**分析我的组织中所有账户内的所有 AWS 资源**选项，则可以稍后在 DevOps Guru 控制台中选择要分析的 AWS 资源。DevOps Guru 会分析不同的 AWS 资源类型（例如 Amazon Simple Storage Service (Amazon S3) 存储桶和 Amazon Elastic Compute Cloud (Amazon EC2) 实例），这些资源类型将按两个定价组进行分类。您需要为每个活动资源支付已分析的 AWS 资源小时数。仅当资源在一小时内生成指标、事件或日志条目时，该资源才处于活动状态。为特定 AWS 资源类型支付的价格取决于价格组。

   如果选择了**启用 SNS 通知**选项，将在使用配置定位的组织单元 (OU) 的每个 AWS 账户中创建 Amazon Simple Notification Service (Amazon SNS) 主题。DevOps Guru 将使用该主题通知您重要的 DevOps Guru 事件，例如新建洞察。如果不启用此选项，则可以稍后在 DevOps Guru 控制台中添加主题。

   如果选择**启用 AWS Systems Manager OpsItems** 选项，则将为相关的 Amazon EventBridge 事件和 Amazon CloudWatch 警报创建操作工作项 (OpsItems)。

1. 在**计划**部分中，选择 Quick Setup 修复对资源所做的不同于配置的更改时的所需频率。**默认值**选项运行一次。如果不希望 Quick Setup 修复对资源所做的不同于配置的更改，请在**自定义**下选择**禁用**。

1. 在**目标**部分中，选择是允许 DevOps Guru 分析其中一些组织单位 (OU) 中的还是当前登录的账户中的资源。

   如果选择**自定义**，继续执行步骤 8。

   如果选择**当前账户**，继续执行步骤 9。

1. 在**目标 OU** 和**目标区域**部分中，选中要使用 DevOps Guru 的 OU 和区域的复选框。

1. 选择当前账户中要使用 DevOps Guru 的区域。

1. 选择**创建**。

# 使用 Quick Setup 部署 Distributor 软件包
<a name="quick-setup-distributor"></a>

Distributor 是 AWS Systems Manager 中的一项工具。Distributor 软件包是可以作为单个实体部署的可安装软件或资产的集合。可以在 AWS Organizations 中使用 Quick Setup 将 Distributor 软件包部署到 AWS 账户和 AWS 区域或整个组织中。目前，只能使用 Quick Setup 部署 EC2Launch v2 代理、Amazon Elastic File System（Amazon EFS）实用工具包和 Amazon CloudWatch 代理。有关 Distributor 的更多信息，请参阅 [AWS Systems Manager Distributor](distributor.md)。

要部署 Distributor 软件包，请在 AWS Systems Manager Quick Setup 控制台中执行以下任务。

**使用Quick Setup 部署 Distributor 软件包**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**分发**卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在**配置选项**部分中，选择要部署的软件包。

1. 在**目标**部分中，选择是将软件包部署到整个组织、其中一些组织单位 (OU) 还是当前登录的账户。

   如果选择**整个组织**，继续执行步骤 8。

   如果选择**自定义**，继续执行步骤 7。

1. 在**目标 OU** 部分中，选中要部署软件包的 OU 和区域的复选框。

1. 选择 **Create（创建）**。

# 按计划使用 Quick Setup 自动停止和启动 EC2 实例
<a name="quick-setup-scheduler"></a>

借助Quick Setup（AWS Systems Manager 中的一项工具），您可以配置资源调度器自动启动和停止 Amazon Elastic Compute Cloud（Amazon EC2）实例。

此 Quick Setup 配置可根据您指定的计划启动和停止实例，从而帮助您降低运营成本。该工具可帮助您避免在不需要时运行实例而产生的不必要成本。

例如，您目前可能让实例持续运行，即使它们每周运行 5 天、每天只运行 10 个小时。相反，您可以安排实例每天下班后停止运行。由于运行时间从 168 小时减少到 50 小时，实例运行成本将节省 70%。使用 Quick Setup 不会收取任何费用。但是，根据您设置的资源和使用限制，可能会产生成本，但不收取用于设置配置的服务费用。

使用资源调度器，您可以选择根据自己定义的调度在多个 AWS 区域和 AWS 账户自动停止和启动实例。该 Quick Setup 配置使用您指定的标签密钥和值以 Amazon EC2 实例为目标。资源调度程序只会停止或启动具有与配置中指定的值匹配的标记的实例。请注意，如果附加到实例的 Amazon EBS 卷已加密，则必须将 AWS KMS 密钥所需的权限添加到 IAM 角色中，资源调度器才能启动实例。

**每种配置的最大实例数**  
单个配置每个区域最多可调度 5000 个实例。如果您的用例要求在给定区域中调度超过 5000 个实例，则必须创建多个配置。相应地标记实例，以便每个配置最多管理 5000 个实例。创建多个资源调度程序 Quick Setup 配置时，必须指定不同的标签密钥值。例如，一种配置可以使用 `Environment` 标签键和 `Production` 标签值，而另一种配置则使用 `Environment` 标签键和 `Development` 标签值。

**调度行为**  
以下几点介绍了调度配置的某些行为：
+ 只有当带标签的实例处于 `Stopped` 状态时，资源调度程序才会启动这些实例。同样，只有实例处于 `running` 状态时才会停止。资源调度程序在事件驱动的模型上运行，并且仅在您指定的时间启动或停止实例。例如，您创建了一个在上午 9 点启动实例的计划。资源调度程序在上午 9 点启动所有与您指定的标签关联且处于 `Stopped` 状态的实例。如果稍后手动停止实例，资源调度程序将不会再次启动它们以保持 `Running` 状态。同样，如果在实例按计划停止后进行手动启动，则资源调度程序不会再次停止该实例。
+ 如果创建的调度开始时间晚于停止时间（24 小时制），资源调度器假定实例会过夜运行。例如，您创建了一个计划，上午 9 点启动实例，上午 7 点停止实例。资源调度程序在上午 9 点启动所有与您指定的标签关联且处于 `Stopped` 状态的实例，并在第二天上午 7 点停止实例。对于整夜运行计划，开始时间为您为计划选择的日期。但停止时间为计划的第二天。
+ 创建调度配置时，为满足调度的要求，可能会更改实例的当前状态。

  *例如，假设今天是星期三，您指定托管式实例的调度仅在周二和周四上午 9:00 开始，下午 5:00 停止。*实例当前的运行时间已超出规定的运行时间，因此这些实例会在配置创建后停止。这些实例要等到下一个规定的时间，即周四上午 9:00 才会再次运行。

  如果实例当前处于 `Stopped` 状态，并且您指定了调度使实例在当前时间运行，则资源调度器会在创建配置后启动实例。

如果您删除配置，将不再根据先前定义的计划停止和启动实例。在极少数情况下，由于 API 操作失败，可能无法成功停止或启动实例。

要设置 Amazon EC2 实例调度。请在 AWS Systems Manager Quick Setup 控制台中执行以下任务。

**使用 Quick Setup 设置实例调度**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**资源调度器**卡片上，选择**创建**。
**提示**  
如果您的账户中已经有一个或多个配置，请先选择**库**选项卡或**配置**部分的中的**创建**按钮以查看卡片。

1. 在 **Instance tag**（实例标签）部分，指定要应用于与计划关联的实例的标签密钥和值。

1. 在 **Schedule options**（计划选项）部分，指定您想要启动和停止实例的时区、日期和时间。

1. 在 **Targets**（目标）部分，选择是为 **Custom**（自定义）组织单位 (OU) 还是您登录的 **Current account**（当前账户）设置调度：
   + **Custom**（自定义）：在 **Target OUs**（目标组织单位）部分，选择要设置主机管理的组织单位。然后，在 **Target Regions**（目标区域）部分，选择要设置计划的区域。
   + **当前账户** - 选择**当前区域**或**选择区域**。如果您选择了 **Choose Regions**（选择区域），请选择要在其中设置调度的 **Target Regions**（目标区域）。

1. 验证 **Summary**（摘要）部分中的计划信息。

1. 选择**创建**。

# 使用 Quick Setup 配置 AWS 资源探索器
<a name="Resource-explorer-quick-setup"></a>

您可以使用Quick Setup（AWS Systems Manager 中的一项工具）快速配置 AWS 资源探索器，进而搜索并发现 AWS 账户或整个 AWS 组织中的资源。您可以使用名称、标签和 ID 等元数据来搜索资源。AWS 资源探索器 使用*索引*来快速响应搜索查询。资源探索器使用各种数据来源创建并维护索引，进而收集 AWS 账户 中关于资源的信息。

资源探索器的 Quick Setup 可自动执行索引配置过程。有关 AWS 资源探索器 的更多信息，请参阅《AWS 资源探索器 用户指南》中[什么是 AWS 资源探索器？](https://docs.aws.amazon.com/resource-explorer/latest/userguide/welcome.html)的内容。

在 Quick Setup 期间，资源探索器执行以下操作：
+ 在您的 AWS 账户 中的每一个 AWS 区域 中创建索引。
+ 更新您指定为账户聚合器索引的区域中的索引。
+ 在聚合器索引区域中创建一个默认视图。此视图没有筛选条件，因此它会返回在索引中找到的所有资源。

**最小权限**

要执行下列程序中的步骤，您必须具有以下权限：
+ **操作**：`resource-explorer-2:*` – **资源**：无特定资源（`*`）
+ **操作**：`iam:CreateServiceLinkedRole` – **资源**：无特定资源（`*`）

**配置资源探索器**

1. 访问 [https://console.aws.amazon.com/systems-manager/](https://console.aws.amazon.com/systems-manager/)，打开 AWS Systems Manager 控制台。

1. 在导航窗格中，请选择 **Quick Setup**。

1. 在**资源探索器**卡片上，选择**创建**。

1. 在**聚合器索引区域**部分，选择要包含**聚合器索引**的区域。您应该选择适合用户地理位置的区域。

1. （可选）选中**替换除上面所选区域以外的区域中的现有聚合器索引**复选框。

1. 在**目标**部分，选择包含要发现的资源的目标**组织**或特定**组织单位（OU）**。

1. 在**区域**部分，选择要包含在配置中的**区域**。

1. 查看配置摘要，然后选择**创建**。

支持在**资源探索器**页面上监控配置状态。

# 对 Quick Setup 结果进行故障排除
<a name="quick-setup-results-troubleshooting"></a>

利用以下信息，帮助排查Quick Setup（AWS Systems Manager 中的一项工具）出现的问题。本主题介绍了依据 Quick Setup 问题类型来解决问题的特定任务。

**问题：部署失败**  
如果 CloudFormation 堆栈集在创建过程中失败，则部署失败。使用以下步骤调查部署失败。

1. 导航至 [AWS CloudFormation 控制台](https://console.aws.amazon.com/cloudformation)。

1. 请选择您的 Quick Setup 配置创建的堆栈。**Stack name**（堆栈名称）包括 `QuickSetup`，后跟您选择的配置类型，例如 `SSMHostMgmt`。
**注意**  
CloudFormation 有时会删除失败的堆栈部署。如果堆栈未提供在 **Stacks**（堆栈）表中，请从筛选条件列表中选择 **Deleted**（已删除）。

1. 请查看 **Status**（状态）和 **Status reason**（状态原因）。有关堆栈状态的更多信息，请参阅 *AWS CloudFormation 用户指南*中的[堆栈状态代码](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/cfn-console-view-stack-data-resources.html#cfn-console-view-stack-data-resources-status-codes)。

1. 要了解失败的确切步骤，请查看 **Events**（事件）选项卡并查看每个事件的**状态**。

1. 请查看 *AWS CloudFormation 用户指南*中的[故障排除](https://docs.aws.amazon.com/AWSCloudFormation/latest/UserGuide/troubleshooting.html)。

1. 如果您无法使用 CloudFormation 故障排除步骤解决部署失败，请删除配置并重新配置它。

**问题：关联失败**  
如果设置过程中有任何关联失败，则您的配置的 **Configuration details**（配置详细信息）页面上的 **Configuration details**（配置详细信息）表将会显示 **Configuration status**（配置状态）为 **Failed**（失败）。使用以下步骤对失败的关联进行故障排除。

1. 在 **Configuration details**（配置详细信息）表中，请选择失败的配置，然后选择 **View Details**（查看详细信息）。

1. 复制**关联名称**。

1. 导航到 **State Manager**，然后将关联名称粘贴到搜索字段中。

1. 选择关联，然后选择 **Execution history**（执行历史记录）选项卡。

1. 在**执行 ID** 下面，选择失败的关联执行。

1. **Association execution targets**（关联执行目标）页面列出运行关联的所有节点。为无法运行的执行选择**输出**按钮。

1. 在**输出**页面中，选择**步骤 - 输出**以在命令执行中查看该步骤的错误消息。每个步骤可能会显示不同的错误消息。请查看所有步骤的错误消息以帮助解决问题。
如果查看步骤输出无法解决问题，您可以尝试重新创建关联。要重新创建关联，请先在 State Manager 中删除失败的关联。删除关联后，编辑配置并选择您删除的选项，然后选择 **Update**（更新）。  
要调查**组织**配置的**失败**关联，必须登录存在失败关联的账户，然后使用以下失败关联过程，如前所述。当查看来自管理账户的结果时，**关联 ID** 不是指向目标账户的超链接。

**问题：偏差状态**  
在查看配置的详细信息页面时，您可以查看每个部署的偏差状态。当用户对与通过 Quick Setup 进行的选择冲突的服务或功能进行更改时，会发生配置偏差。如果在初始配置之后关联发生了更改，则表格将显示一个警告图标，指示已偏差的项目数量。您可以通过将鼠标悬停在图标上来确定造成偏差的原因。
在 State Manager 中删除关联时，相关部署会显示偏差警告。要修复此问题，请编辑配置并选择删除关联时删除的选项。请选择 **Update**（更新）并等待部署完成。