本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用動作輸出作為輸入
您可以在執行手冊中定義各種自動化動作的輸出。這可讓您執行指令碼,或為其他 AWS 服務 叫用一次 API 操作,以便在稍後的動作中重複使用這些值作為輸入。Runbook 中的參數類型是靜態的。這意味著參數類型在定義後便無法變更。將參數與自動化動作搭配使用時,無法在動作的輸入中動態變更參數的類型。如果您需要將輸出值轉換為其他類型以用作稍後動作的輸入,請使用該aws:executeScript
動作。為函數指定要在中轉換InputPayload
的輸出。轉換函數中的類型,並使用return
語句輸出新轉換的值。
下面是一個執行手冊範例,示範如何定義動作輸出,並參照該值作為稍後動作的輸入。執行手冊會執行下列操作:
-
使用
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 EC2DescribeInstanceStatus
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 操作定義。您可以檢視 API 操作 (也稱為方法),方式是在以下服務參考
您可以在以下位置檢視每個自動化動作的結構描述:
結構描述包括使用各動作之必要欄位的描述。
使用 SelectorPropertySelector 欄位
每個 Automation 動作都需要您指定輸出 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
JSONPath 運算式是以「$」開頭的字串。用於在 JSON 元素中選取一個或多個元件。以下清單包括由 Systems Manager 自動化支援的 JSONPath 運算子相關資訊:
-
以點標記的子代 (.):與 JSON 物件搭配使用。此運算子會選取特定索引鍵的值。
-
Deep-scan (..):與 JSON 元素搭配使用。此運算子會在各層級掃描 JSON 元素並選取具有特定索引鍵之值的清單。此運算子的傳回類型一律為 JSON 陣列。在自動化動作輸出類型的內容中,運算子可以是 StringList 或 MapList。
-
Array-Index ([ ]):與 JSON 陣列搭配使用。此運算子會取得特定索引的值。
為了更全面了解 JSONPath 運算子,請檢閱以下 ec2 DescribeInstances
API 操作的 JSON 回應。在此回應下有幾個範例,顯示套用不同的 JSONPath 運算式到 DescribeInstances
API 操作之回應的不同結果。
{ "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 回應取得特定字串
JSONPath: $.Reservations[0].Instances[0].ImageId Returns: "ami-12345678" Type: String
JSONPath 範例 2:從 JSON 回應取得特定布林值
JSONPath: $.Reservations[0].Instances[0].BlockDeviceMappings[0].Ebs.DeleteOnTermination Returns: true Type: Boolean
JSONPath 範例 3:從 JSON 回應取得特定整數
JSONPath: $.Reservations[0].Instances[0].State.Code Returns: 16 Type: Integer
JSONPath 示例 4:深度掃描 JSON 響應,然後將所有值 VolumeId 作為 StringList
JSONPath: $.Reservations..BlockDeviceMappings..VolumeId Returns: [ "vol-000000000000", "vol-111111111111" ] Type: StringList
JSONPath 示例 5:獲取一個特定的 BlockDeviceMappings對象作為 StringMap
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
JSONPath: $.Reservations..Instances..State Returns: [ { "Code" : 16, "Name" : "running" }, { "Code" : 80, "Name" : "stopped" } ] Type: MapList