使用 State Manager 关联调度自动化 - AWS Systems Manager

使用 State Manager 关联调度自动化

您可以通过创建与运行手册的 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 运行自动化。

  • 您必须先验证是否已为 AWS Systems Manager 的功能自动化配置了权限,然后才能创建运行某个运行手册的关联。有关更多信息,请参阅 设置自动化

  • 运行多个运行手册的 State Manager 关联将计入在您的 AWS 账户 中并发运行的自动化的最大数。一次最多可以运行 100 个并发自动化。有关信息,请参阅《Amazon Web Services 一般参考》中的 Systems Manager service quotas

  • 运行自动化时,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

创建运行自动化的关联(控制台)

以下过程介绍了如何使用 Systems Manager 控制台创建运行自动化的 State Manager 关联。

创建 State Manager 关联以运行自动化
  1. 访问 https://console.aws.amazon.com/systems-manager/,打开 AWS Systems Manager 控制台。

  2. 在导航窗格中,选择 State Manager,然后选择创建关联

  3. 名称 字段中指定名称。您可以自由选择,但我们建议您这样做。

  4. 文档列表中,选择运行手册。使用搜索栏来筛选 Document type : Equal : Automation 运行手册。使用搜索栏右侧的数字可查看更多运行手册。

    注意

    您可以通过选择运行手册名称来查看有关该手册的信息。

  5. 选择简单执行来通过指定一个或多个目标的资源 ID 在这些目标上运行自动化。选择速率控制可以通过指定设置目标选项(如标签或 AWS Resource Groups)来在 AWS 资源队列上运行自动化。您还可以通过指定并发和错误阈值来控制跨各个资源的自动化的执行。

    如果您选择速率控制,将显示目标部分。

  6. 目标部分中,选择一种设置资源目标的方法。

    1. (必需)在参数 列表中,选择一个参数。参数列表中的项目由此过程开始时选择的运行手册中的参数确定。通过选择参数,可以定义自动化运行的资源类型。

    2. (必需)在目标列表中,选择一种设置资源目标的方法。

      • 资源组:从资源组列表中选择组的名称。有关在运行手册中将 AWS Resource Groups 设置为目标的更多信息,请参阅 设置目标 AWS Resource Groups

      • 标签:在提供的字段中输入标签键和标签值(可选)。选择添加。有关在运行手册中设置标签目标的更多信息,请参阅 设置目标标签

      • 参数值:在输入参数部分输入值。如果指定多个值,Systems Manager 将在指定的每个值上运行子自动化。

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

  7. 输入参数部分,指定所需的输入参数。

    如果选择使用标签或资源组将资源设置为目标,则不需要选择输入参数部分中的某些选项。例如,如果选择 AWS-RestartEC2Instance 运行手册,并且选择使用标签将实例设置为目标,则无需在输入参数部分中指定或选择实例 ID。自动化使用您指定的标签查找要重新启动的实例。

    重要

    您必须在 AutomationAssumeRole 字段中指定一个角色 ARN。State Manager 使用担任角色来调用运行手册中指定的 AWS 服务并代表您运行自动化关联。

  8. 如果您希望定期运行关联,请在指定计划部分中,选择按计划。如果您选择此选项,则使用提供的选项使用 Cron 或 Rate 表达式创建计划。有关 State Manager 的 Cron 和 Rate 表达式的更多信息,请参阅 适用于关联的 Cron 和 Rate 表达式

    注意

    Rate 表达式是运行多个运行手册的 State Manager 关联的首选计划机制。如果您达到了并发运行自动化的最大数,Rate 表达式会为运行关联提供更多灵活性。使用速率计划,Systems Manager 可以在收到并发自动化已达最大值并已被节流的通知后,立即重试自动化。

    如果您希望运行关联一次,请选择无计划

  9. (可选)在 Rate Control(速率控制)部分中,选择 Concurrency(并发)和 Error threshold(错误阈值)选项来控制跨各个 AWS 资源的自动化部署。

    1. 并发部分中,选择一个选项:

      • 选择目标,以输入可同时运行自动化的目标的绝对数量。

      • 选择百分比,以输入可同时运行自动化的目标集的百分比。

    2. 错误阈值部分中,选择一个选项:

      • 选择错误,以输入自动化停止将自动化发送到其他资源之前允许的错误绝对数量。

      • 选择百分比,以输入自动化停止将自动化发送到其他资源之前允许的错误的百分比。

    有关使用自动化的目标和速率控制的更多信息,请参阅 大规模运行自动化操作

  10. 选择创建关联

    重要

    在创建关联时,将针对指定目标立即运行关联。然后,关联基于您选择的 Cron 或 Rate 表达式运行。如果您选择了无计划,则关联不会再次运行。

创建关联以运行自动化(命令行)

以下过程介绍了如何使用 AWS CLI(在 Linux 或 Windows 上)或 AWS Tools for PowerShell 创建 State Manager 关联以运行自动化。

开始前的准备工作

在您完成以下过程之前,请确保创建了包含运行 Runbook 所需权限的 IAM 服务角色,并为自动化(AWS Systems Manager 的一项功能)配置了信任关系。有关更多信息,请参阅 任务 1:为自动化创建服务角色

创建关联以运行自动化
  1. 安装并配置 AWS CLI 或 AWS Tools for PowerShell(如果尚未执行该操作)。

    有关信息,请参阅安装或更新 AWS CLI 的最新版本以及安装 AWS Tools for PowerShell

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

    Linux & macOS
    aws ssm list-documents
    Windows
    aws ssm list-documents
    PowerShell
    Get-SSMDocumentList

    记下要用于关联的运行手册的名称。

  3. 运行以下命令以查看有关运行手册的详细信息。在下面的命令中,将 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)。此参数确定在其上运行自动化的资源的类型。

  4. 创建一个命令以使用 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 关联运行的自动化进行故障排除

Systems Manager 自动化强制要求每个账户、每个区域最多有 100 个并发自动化和 1000 个排队自动化。如果使用运行手册的 State Manager 关联显示已失败状态和详细状态 AutomationExecutionLimitExceeded,则表明您的自动化可能已达到了限制。因此,Systems Manager 会限制自动化。要解决此问题,请执行以下操作:

  • 为关联使用不同的 Rate 或 Cron 表达式。例如,如果关联计划为每 30 分钟运行一次,则更改表达式,使其每小时或每两小时运行一次。

  • 删除状态为待处理的现有自动化。通过删除这些自动化,将清除当前队列。