使用状态管理器运行触发器的自动化 - AWS Systems Manager
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用状态管理器运行触发器的自动化

您可以通过创建与 Runbook 的状态管理器关联来启动自动化。通过使用 Runbook 创建 State Manager 关联,您可以将不同类型的 AWS 资源指定为目标。例如,您可以创建强制 AWS 资源进入预期状态的关联,包括:

  • 将 Systems Manager 角色附加到 EC2 实例以使其成为托管实例

  • 对安全组强制实施所需的入口和出口规则。

  • 创建或删除 Amazon DynamoDB (DynamoDB) 备份。

  • 创建或删除 Amazon Elastic Block Store (Amazon EBS) 快照。

  • 禁用 Amazon Simple Storage Service (Amazon S3) 存储桶的读写权限。

  • 启动、重新启动或停止托管实例和 Amazon Relational Database Service (Amazon RDS) 实例。

  • 将修补程序应用到 Linux,macOS和窗口 AMI。

使用以下过程创建状态管理器关联,该关联使用 AWS Systems Manager 控制台和 AWS Command Line Interface (AWS CLI) 运行自动化。

开始前的准备工作

请注意以下重要详细信息,然后再使用 State Manager 运行自动化。

  • 在创建使用 Runbook 的关联之前,请验证是否已为 Systems Manager Automation 配置了权限。有关更多信息,请参阅 设置 Automation

  • 使用 Runbook 的状态 Manager 关联将计入在 AWS 账户中并发运行的 Automation 的最大数。最多可以运行 100 个并发自动化。想要了解有关信息,请参阅Systems Manager 服务配额中的Amazon Web Services 常规参考

  • Systems Manager 自动创建服务相关角色,以使状态管理员有权调用 Systems Manager Automation API 操作。如果您需要,您可以从 AWS CLI 或适用于 PowerShell 的 AWS Tools 中运行以下命令以自行创建服务相关角色。

    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

创建关联以运行 Automation(控制台)

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

创建运行 Automation 的状态管理器关联

  1. 通过以下网址打开 AWS Systems Manager:https://console.aws.amazon.com/systems-manager/

  2. 在导航窗格中,选择状态管理器,然后选择创建关联

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

  4. 文档列表中,选择 Runbook。使用搜索栏来筛选文档类型:等于:自动化运行手册。要查看更多运行手册,请使用搜索栏右侧的数字。

    注意

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

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

    如果您选择 Rate control (速率控制)Targets (目标) 部分将显示。

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

    1. (必需)在 Parameter (参数) 列表中,选择一个参数。中的项目参数列表由您在此过程开始时选择的 Runbook 中的参数确定。通过选择参数,可以定义在其上运行 Automation 的资源的类型。

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

      • Resource Group:从Resource Group列出。有关在 Runbook 中设置 AWS Resource Groups 目标的更多信息,请参阅瞄准 AWS Resource Groups

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

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

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

  7. Input parameters (输入参数) 部分,指定所需的输入参数。

    如果选择使用标签或资源组将资源设置为目标,则不需要选择 Input parameters (输入参数) 部分中的某些选项。例如,如果选择 AWS-RestARTEC2Instance 运行手册,并且选择使用标签将实例设置为目标,则无需在输入参数部分. 自动化过程通过使用您指定的标签来定位要重新启动的实例。

    重要

    您必须在AutomationAssumeRole字段。状态管理器使用担任角色来调用 Runbook 中指定的 AWS 服务并代表您运行 Automation 关联。有关更多信息,请参阅 使用 IAM 服务角色运行 Automation

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

    注意

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

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

  9. (可选)在速率控制部分,选择。并发错误阈值选项来控制跨 AWS 资源的自动化部署。

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

      • 选择targets输入可同时运行 Automation 的目标的绝对数量。

      • 选择percentage输入可同时运行 Automation 的目标集的百分比。

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

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

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

    有关使用 Automation 的目标和速率控制的更多信息,请参阅 运行使用目标和速率控制的 Automation

  10. 选择创建关联

    重要

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

创建关联以运行 Automation(命令行)

以下过程介绍了如何使用 AWS CLI(在 Linux 或 Windows 上)或适用于 PowerShell 的 AWS 工具创建运行自动化的状态管理器关联。

创建关联以运行 Automation

  1. 安装并配置 AWS CLI 或适用于 PowerShell 的 AWS 工具(如果尚未执行该操作)。

    想要了解有关信息,请参阅安装或升级 AWS 命令行工具

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

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

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

  3. 运行以下命令以查看有关 Runbook 的详细信息。

    Linux & macOS
    aws ssm describe-document \ --name runbook_name

    记下要用于 --automation-target-parameter-name 选项的参数名称(例如 InstanceId)。此参数确定在其上运行 Automation 的资源的类型。

    Windows
    aws ssm describe-document ^ --name document_name

    记下要用于 --automation-target-parameter-name 选项的参数名称(例如 InstanceId)。此参数确定在其上运行 Automation 的资源的类型。

    PowerShell
    Get-SSMDocumentDescription ` -Name document_name

    记下要用于 AutomationTargetParameterName 选项的参数名称(例如 InstanceId)。此参数确定在其上运行 Automation 的资源的类型。

  4. 创建一个命令以使用状态管理器关联运行 Automation。以下是一些为您提供帮助的模板命令。

    使用标签设置目标

    Linux & macOS
    aws ssm create-association \ --association-name AssociationName \ --targets Key=tag:TagKey,Values=TagValue \ --name RunbookName \ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) \ --automation-target-parameter-name (parameter to target) \ --schedule "cron_or_rate_expression"
    注意

    如果您使用 AWS CLI 创建关联,请使用--targets参数指定关联的目标实例。不要使用 --instance-id 参数。--instance-id 参数是一个旧参数。

    Windows
    aws ssm create-association ^ --association-name AssociationName ^ --targets Key=tag:TagKey,Values=TagValue ^ --name RunbookName ^ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) ^ --automation-target-parameter-name (parameter to target) ^ --schedule "cron_or_rate_expression"
    注意

    如果您使用 AWS CLI 创建关联,请使用--targets参数指定关联的目标实例。不要使用 --instance-id 参数。--instance-id 参数是一个旧参数。

    PowerShell
    $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target $Targets.Key = "tag:TagKey" $Targets.Values = "TagValue" New-SSMAssociation ` -AssociationName "AssociationName" ` -Target $Targets ` -Name "RunbookName" ` -Parameters @{ "AutomationAssumeRole"="arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM; (Additional parameters, if any)" } ` -AutomationTargetParameterName "parameter_to_target" ` -ScheduleExpression "cron_or_rate_expression"
    注意

    如果您使用 AWS Tools 适用于 PowerShell 创建关联,请使用Target参数指定关联的目标实例。不要使用 InstanceId 参数。InstanceId 参数是一个旧参数。

    使用参数值设置目标

    Linux & macOS
    aws ssm create-association \ --association-name AssociationName \ --targets Key=ParameterValues,Values=value_1,value_2,value_3 \ --name RunbookName \ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) \ --automation-target-parameter-name (parameter to target) \ --schedule "cron_or_rate_expression"
    Windows
    aws ssm create-association ^ --association-name AssociationName ^ --targets Key=ParameterValues,Values=value_1,value_2,value_3 ^ --name RunbookName ^ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) ^ --automation-target-parameter-name (parameter to target) ^ --schedule "cron_or_rate_expression"
    PowerShell
    $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target $Targets.Key = "ParameterValues" $Targets.Values = "value_1","value_2","value_3" New-SSMAssociation ` -AssociationName "AssociationName" ` -Target $Targets ` -Name "RunbookName" ` -Parameters @{ "AutomationAssumeRole"="arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM; (Additional parameters, if any)"} ` -AutomationTargetParameterName "parameter_to_target" ` -ScheduleExpression "cron_or_rate_expression"

    使用 AWS Resource Groups 进行定位

    Linux & macOS
    aws ssm create-association \ --association-name AssociationName \ --targets Key=ResourceGroup,Values=Resource_Group_name \ --name RunbookName \ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) \ --automation-target-parameter-name (parameter to target) \ --schedule "cron_or_rate_expression"
    Windows
    aws ssm create-association ^ --association-name AssociationName ^ --targets Key=ResourceGroup,Values=Resource_Group_name ^ --name RunbookName ^ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) ^ --automation-target-parameter-name (parameter to target) ^ --schedule "cron_or_rate_expression"
    PowerShell
    $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target $Targets.Key = "ResourceGroup" $Targets.Values = "Resource_Group_Name" New-SSMAssociation ` -AssociationName "AssociationName" ` -Target $Targets ` -Name "RunbookName" ` -Parameters @{ "AutomationAssumeRole"="arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM; (Additional parameters, if any)"} ` -AutomationTargetParameterName "parameter_to_target" ` -ScheduleExpression "cron_or_rate_expression"

    定位多个账户和区域

    Linux & macOS
    aws ssm create-association \ --association-name AssociationName \ --targets Key=ResourceGroup,Values=Resource_Group_name \ --name RunbookName \ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) \ --automation-target-parameter-name (parameter to target) \ --schedule "cron_or_rate_expression" \ --target-locations Accounts=111122223333,444455556666,444455556666,Regions=us-east-1,us-east-2
    Windows
    aws ssm create-association ^ --association-name AssociationName ^ --targets Key=ResourceGroup,Values=Resource_Group_name ^ --name RunbookName ^ --parameters AutomationAssumeRole=arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM,(Additional parameters, if any) ^ --automation-target-parameter-name (parameter to target) ^ --schedule "cron_or_rate_expression" ^ --target-locations Accounts=111122223333,444455556666,444455556666,Regions=us-east-1,us-east-2
    PowerShell
    $Targets = New-Object Amazon.SimpleSystemsManagement.Model.Target $Targets.Key = "ResourceGroup" $Targets.Values = "Resource_Group_Name" New-SSMAssociation ` -AssociationName "AssociationName" ` -Target $Targets ` -Name "RunbookName" ` -Parameters @{ "AutomationAssumeRole"="arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM; (Additional parameters, if any)"} ` -AutomationTargetParameterName "parameter_to_target" ` -ScheduleExpression "cron_or_rate_expression" ` -TargetLocations @{ "Accounts"=["111122223333,444455556666,444455556666"], "Regions"=["us-east-1,us-east-2"]

    该命令返回新关联的详细信息,类似于以下内容。

    Linux & macOS
    {
        "AssociationDescription": {
            "ScheduleExpression": "cron(0 7 ? * MON *)",
            "Name": "AWS-StartEC2Instance",
            "Parameters": {
                "AutomationAssumeRole": [
                    "arn:aws:iam::123456789012:role/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM"
                ]
            },
            "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/aws-service-role/ssm.amazonaws.com/AWSServiceRoleForAmazonSSM"
                ]
            },
            "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 文档关联。

故障排除状态管理器自动化

Systems Manager Automation 要求每个账户、每个区域最多 100 个并发自动化和 1,000 个排队自动化。如果使用 Runbook 的状态管理器关联显示已失败和详细的状态AutomationExecutionLimitExceeded,则自动化可能已达到限制。因此,Systems Manager 将限制 Automation。要解决此问题,请执行以下操作:

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

  • 删除状态为Pending。通过删除这些自动化,将清除当前队列。