使用 State Manager 以根據觸發執行自動化 - AWS Systems Manager

使用 State Manager 以根據觸發執行自動化

您可以透過將 State Manager 與 Runbook 建立關聯來啟動自動化。State Manager 是 AWS Systems Manager 的功能。透過建立與 Runbook 的 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、和 WiWindows AMIs。

使用下列程序,透過 AWS Systems Manager 主控台和 AWS Command Line Interface (AWS CLI) 建立執行自動化工作流程的 State Manager 關聯。

開始之前

使用 State Manager 執行自動化前,請注意以下重要的詳細資訊。

  • 在您建立關聯,使用 Runbook 之前,請先確認您已設定 Automation (AWS Systems Manager 的一項功能) 的許可。如需更多詳細資訊,請參閱 設定自動化

  • 使用 Runbook 的 State Manager 關聯會影響您 AWS 帳戶 中同時執行的自動化作業的最大數量。一次最多可執行 100 個並行自動化作業。如需資訊,請參閱《Amazon Web Services 一般參考》中的 Systems Manager 服務配額

  • Systems Manager 會自動建立服務連結角色,以便 State Manager 擁有呼叫 Systems Manager Automation 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. 開啟位於 AWS Systems Managerhttps://console.aws.amazon.com/systems-manager/ 的 主控台。https://console.aws.amazon.com/systems-manager/

  2. 在導覽窗格中,選擇 State Manager,然後選擇 Create association (建立關聯)

  3. Name (名稱) 欄位中指定名稱。此為選用操作,但建議您採用。

  4. Document (文件) 清單中,選擇 Runbook。使用搜尋列來篩選 Document type : Equal : Automation Runbook。若要查看更多 Runbook,請使用搜尋列右側的號碼。

    注意

    您可以選擇 Runbook 名稱檢視 Runbook 資訊。

  5. 選擇 Simple execution (簡易執行),透過為這些目標指定資源 ID,在一或多個目標上執行自動化。選擇 Rate control (速率控制),透過指定標籤或 AWS 等定位選項,在 AWS Resource Groups 資源機群上執行自動化。您也可以透過指定並行和錯誤閾值,控制在資源上的自動化操作。

    如果選擇 Rate control (速率控制),便會顯示 Targets (目標) 部分。

  6. Targets (目標) 部分,選擇將資源設為目標的方法。

    1. (必要) 在 Parameter (參數) 清單中,選擇一個參數。Parameter (參數) 清單中的項目,是由您在此程序一開始所選取 Runbook 中的參數決定。藉由選擇參數,您就會定義自動化執行的資源類型。

    2. (必要) 在 Targets (目標) 清單中,選擇將資源設為目標的方法。

      • Resource Group (資源群組):從 Resource Group (資源群組) 清單中選擇群組名稱。如需有關在 Runbook 中鎖定 AWS Resource Groups 的詳細資訊,請參閱 將 AWS Resource Groups 設為目標

      • Tags (標籤):在提供的欄位中輸入標籤鍵和 (選擇性) 標籤值。選擇 Add (新增)。如需有關在 Runbook 中鎖定標籤的詳細資訊,請參閱 將標籤設為目標

      • Parameter Values (參數值):在 Input parameters (輸入參數) 部分輸入值。如果您指定多個值,Systems Manager 會於每個指定的值執行子自動化。

        例如,假設您的 Runbook 包括 InstanceID 參數。如果您在執行自動化時以 InstanceID (InstanceID) 參數的值為目標,則 Systems Manager 會針對每個指定的執行個體 ID 值執行子自動化。當自動化完成執行每個指定的執行個體,或是自動化失敗,父自動化就會完成。您最多可將 50 個參數值設為目標。如需有關在 Runbook 中設定參數值目標的詳細資訊,請參閱 將參數值設為目標

  7. Input Parameters (輸入參數) 部分,指定所需的輸入參數。

    如果選擇使用標籤或資源群組將資源設為目標,您可能不必選擇 Input parameters (輸入參數) 部分中的某些選項。例如,假設您選擇 AWS-RestartEC2Instance Runbook,而您選擇使用標籤將執行個體設為目標,則您不必在 Input parameters (輸入參數) 部分中指定或選擇執行個體 ID。自動化會使用您指定的標籤找出要重新啟動的執行個體。

    重要

    您必須在 AutomationAssumeRole 欄位指定角色 ARN。State Manager 使用擔任角色呼叫自動化 Runbook 中指定的 AWS 服務並代表您執行自動化關聯。如需更多詳細資訊,請參閱 使用 IAM 服務角色執行自動化

  8. Specify schedule (指定排程) 部分,如果想以固定間隔執行關聯,請選擇 On Schedule (依排程)。如果選擇此選項,然後使用 Cron 或 Rate 表達式,利用提供的選項建立排程。如需 State Manager 適用的 Cron 和 Rate 表達式的詳細資訊,請參閱關聯的 Cron 與 Rate 運算式

    注意

    Rate 表達式是執行 Runbook 的 State Manager 關聯所偏好的排程機制。Rate 表達式可在您達到自動化同時執行最大數量下提供更多執行關聯的靈活性。使用速率排程時,Systems Manager 便能在收到同時自動化已達最大值且遭調節的通知後立即重試自動化。

    如果您希望執行一次關聯,請選擇 No schedule (無排程)

  9. (選用) 在 Rate Control (速率控制) 部分,選擇 Concurrency (並行) 和 Error threshold (錯誤閾值) 選項,以控制在您的 AWS 資源上的自動化部署。

    1. Concurrency (並行) 部分,選擇一個選項:

      • 選擇 targets (目標),輸入可以同時執行自動化的目標絕對數量。

      • 選擇 percentage (百分比),輸入可以同時執行自動化的目標集百分比。

    2. Error threshold (錯誤閾值) 部分,選擇一個選項:

      • 選擇 errors (錯誤),輸入在 Automation 停止傳送自動化至其他資源之前允許的錯誤絕對數量。

      • 選擇 percentage (百分比),輸入在 Automation 停止傳送自動化至其他資源之前允許的錯誤百分比。

    如需有關使用目標和速率控制與自動化的詳細資訊,請參閱執行使用目標和速率控制的自動化

  10. 選擇 Create Association (建立關聯)

    重要

    建立關聯時,關聯便會立即在指定的目標上執行。接著關聯會依照您選擇的 Cron 或 Rate 表達式執行。如果您選擇 No schedule (無排程),關聯不會再次執行。

建立執行自動化的關聯 (命令列)

以下程序說明如何使用 AWS CLI (在 Linux 或 Windows 上) 或 AWS Tools for PowerShell 來建立執行自動化的 State Manager 關聯。

建立執行自動化的關聯

  1. 如果您尚未安裝並設定 AWS CLI 或 AWS Tools for PowerShell,請進行相應的操作。

    如需相關資訊,請參閱安裝或升級 AWS 命令列工具

  2. 執行以下命令來檢視文件清單。

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

    記下您要用於關聯的 Runbook 名稱。

  3. 執行以下命令來檢視您建立的 Runbook 詳細資訊。

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

    記下您希望用於 InstanceId 選項的參數名稱 (例如 --automation-target-parameter-name)。此參數會決定自動化執行的資源類型。

    Windows
    aws ssm describe-document ^ --name document_name

    記下您希望用於 InstanceId 選項的參數名稱 (例如 --automation-target-parameter-name)。此參數會決定自動化執行的資源類型。

    PowerShell
    Get-SSMDocumentDescription ` -Name document_name

    記下您希望用於 InstanceId 選項的參數名稱 (例如 AutomationTargetParameterName)。此參數會決定自動化執行的資源類型。

  4. 使用 State Manager 關聯建立執行自動化的命令。以下是一些可帶來協助的範本命令。

    使用標籤設定目標

    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 for 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文件中取消該執行個體的關聯。

State Manager 自動化故障診斷

Systems Manager Automation 強制執行 100 個並行自動化,以及每個區域每個帳戶 1,000 個排入佇列的自動化限制。如果使用 Runbook 的 State Manager 關聯狀態顯示為 Failed (失敗) 和 AutomationExecutionLimitExceeded 的詳細狀態,則您可能已達到自動化的限制。因此,Systems Manager 會調節自動化。要解決此問題,請依照下列步驟:

  • 為您的關聯使用不同的 Rate 或 Cron 表達式。例如,如果關聯排程每隔 30 分鐘執行,則變更表達式可每一或二小時執行一次。

  • 刪除狀態為 Pending (待定) 的現有自動化。透過刪除這些自動化,即可清除目前的佇列。