本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。
使用「地圖」狀態動態處理資料
此範例專案示範使用 Map 狀態的動態平行處理。
在此專案中,Step Functions 數使用 AWS Lambda 函數從 Amazon SQS 佇列中提取訊息,並將這些訊息的 JSON 陣列傳遞至Map
狀態。對於佇列中的每個訊息,狀態機器會將訊息寫入 DynamoDB,叫用另一個 Lambda 函數從 Amazon SQS 移除訊息,然後將訊息發佈到 Amazon SNS 主題。
如需Map
狀態和 Step Functions 服務整合的詳細資訊,請參閱下列內容:
步驟 1:建立狀態機器並佈建資源
-
開啟 Step Functions 主控台
,然後選擇建立狀態機器。 -
Dynamically process data with a Map state
在搜尋方塊中輸入,然後從傳回的搜尋結果中選擇「動態處理具有對應」狀態的資料。 -
選擇 Next (下一步) 繼續。
-
Step Functions 會列出您選取的範例專案中 AWS 服務 使用的項目。它也會顯示範例專案的工作流程圖表。將此項目部署到您的項目中, AWS 帳戶 或將其用作構建自己的項目的起點。根據您想要的進行方式,選擇 [執行示範] 或 [在其上建置]。
此範例專案會部署下列資源:
-
一種 Amazon SQS 佇列,地圖狀態會反覆讀取和移除訊息。
-
地圖狀態會反覆寫入訊息的 DynamoDB 表格。
-
一個 Amazon SNS 主題,Step Functions 會發佈從 Amazon SQS 佇列讀取的訊息。
-
兩種 AWS Lambda 功能
-
一个 AWS Step Functions 状态机
-
相關 AWS Identity and Access Management (IAM) 角色
下圖顯示了具有 Map 狀態範例專案之「動態」處理資料的工作流程圖形:
-
-
選擇「使用範本」繼續進行選取。
-
執行以下任意一項:
-
如果您選取「在其上建置」,「Step Functions」會為您選取的範例專案建立工作流程原型。Step Functions 不會部署工作流程定義中列出的資源。
在工作流程 Studio 中設計模式,從拖放狀態狀態瀏覽器以繼續建立您的工作流程原型。或者切換到程式碼模式提供類似 VS 代碼的集成代碼編輯器,用於在 Step Functions 控制台中更新狀態機器的Amazon States Language(ASL)定義。如需有關使用工作流程 Studio 建置狀態機器的詳細資訊,請參閱使用工作流程。
重要
請記得在執行工作流程之前,更新範例專案中使用之資源的預留位置 Amazon 資源名稱 (ARN)。
-
如果您選取 [執行示範],Step Functions 會建立唯讀範例專案,該專案使用 AWS CloudFormation 範本將該範本中列出的 AWS 資源部署到您的 AWS 帳戶.
提示
若要檢視範例專案的狀態機定義,請選擇 [程式碼]。
準備就緒後,請選擇 [部署並執行] 以部署範例專案並建立資源。
建立這些資源和相關 IAM 許可最多可能需要 10 分鐘的時間。部署資源時,您可以開啟 CloudFormation Stack ID 連結以查看正在佈建的資源。
建立範例專案中的所有資源之後,您可以在 [狀態機器] 頁面上看到列出的新範例專案。
重要
CloudFormation 範本中使用的每項服務可能會收取標準費用。
-
範例專案的資源部署完成後,您必須在執行狀態機器之前,將項目新增到 Amazon SQS 佇列並訂閱 Amazon SNS 主題。
步驟 2:訂閱 Amazon SNS 主題
-
開啟 Amazon SNS 主控台
。 -
選擇 Topics (主題),然後選擇
Map
狀態範例專案所建立的主題。該名稱將類似於-SNTOPIC-1CQO4HQ3 MapSampleProjIR1KN。
-
選擇建立訂閱。
Create subscription (建立訂閱) 頁面隨即顯示,並列出主題的 Topic ARN (主題 ARN)。
-
在 Protocol (通訊協定) 下方,選擇 Email (電子郵件)。
-
在 Endpoint (端點) 下方,輸入電子郵件地址來訂閱主題。
-
選擇建立訂閱。
注意
您必須在電子郵件中確認訂閱,訂閱才會生效。
-
開啟相關帳戶中的 Subscription Confirmation (訂閱確認) 電子郵件,接著開啟 Confirm subscription (確認訂閱) URL。
即會顯示 Subscription confirmed! (訂閱確認!) 頁面。
步驟 3:將訊息新增至 Amazon SQS 佇列
-
開啟 Amazon SQS 主控台
。 -
選擇
Map
狀態範例專案所建立的佇列。該名稱將類似於 MapSampleProj-SQUUE- 1vzdorn7。
-
選擇傳送及接收訊息。
-
在 [傳送和接收訊息] 頁面上,輸入訊息並選擇 [傳送訊息]。
-
輸入其他訊息並選擇 [傳送訊息]。繼續輸入更多訊息,直到 Amazon SQS 佇列中有多則訊息為止。
步驟 4:運行狀態機
注意
Amazon SNS 中的佇列最終是一致的。為了獲得最佳結果,請在填入佇列和執行狀態機器之間等待幾分鐘。
-
在 [狀態電腦] 頁面上,選擇您的範例專案。
-
在範例專案頁面上,選擇 [開始執行]。
-
在 [開始執行] 對話方塊中,執行下列動作:
-
(選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。
注意
Step Functions 允許您為狀態機器,執行和活動以及包含非 ASCII 字符的標籤創建名稱。這些非 ASCII 名稱不適用於 Amazon CloudWatch。若要確保您可以追蹤 CloudWatch 量度,請選擇僅使用 ASCII 字元的名稱。
-
(選擇性) 在「輸入」方塊中,以 JSON 格式輸入輸入值以執行工作流程。
如果您選擇執行示範,則不需要提供任何執行輸入。
注意
如果您部署的示範專案包含預先填入的執行輸入資料,請使用該輸入來執行狀態機器。
-
選擇 Start execution (開始執行)。
-
Step Functions 主控台會將您導向至標題為執行 ID 的頁面。此頁面稱為「執行詳細資訊」頁面。在此頁面上,您可以在執行進行時或完成後複查執行結果。
若要複查執行結果,請在「圖形」檢視中選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需有關可在「執行詳細資訊」頁面檢視之執行資訊的詳細資訊,請參閱執行詳細資訊頁面 — 介面概觀。
-
狀態機代碼示例
此範例專案中的狀態機器會直接將參數傳遞至這些資源,與 Amazon SQS、Amazon SNS 和 Lambda 整合。
瀏覽此範例狀態機器,瞭解 Step Functions 如何透過連線至Resource
欄位中的 Amazon 資源名稱 (ARN) 並傳遞Parameters
至服務 API 來控制 Lambda、DynamoDB、Amazon SNS。
如需如何 AWS Step Functions 控制其他 AWS 服務的詳細資訊,請參閱AWS Step Functions 搭配其他服務使用。
{
"Comment": "An example of the Amazon States Language for reading messages from an SQS queue and iteratively processing each message.",
"StartAt": "Read messages from SQS Queue",
"States": {
"Read messages from SQS Queue": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"OutputPath": "$.Payload",
"Parameters": {
"FunctionName": "MapSampleProj-ReadFromSQSQueueLambda-1MY3M63RMJVA9"
},
"Next": "Are there messages to process?"
},
"Are there messages to process?": {
"Type": "Choice",
"Choices": [
{
"Variable": "$",
"StringEquals": "No messages",
"Next": "Finish"
}
],
"Default": "Process messages"
},
"Process messages": {
"Type": "Map",
"Next": "Finish",
"ItemsPath": "$",
"Parameters": {
"MessageNumber.$": "$$.Map.Item.Index",
"MessageDetails.$": "$$.Map.Item.Value"
},
"Iterator": {
"StartAt": "Write message to DynamoDB",
"States": {
"Write message to DynamoDB": {
"Type": "Task",
"Resource": "arn:aws:states:::dynamodb:putItem",
"ResultPath": null,
"Parameters": {
"TableName": "MapSampleProj-DDBTable-YJDJ1MKIN6C5",
"ReturnConsumedCapacity": "TOTAL",
"Item": {
"MessageId": {
"S.$": "$.MessageDetails.MessageId"
},
"Body": {
"S.$": "$.MessageDetails.Body"
}
}
},
"Next": "Remove message from SQS queue"
},
"Remove message from SQS queue": {
"Type": "Task",
"Resource": "arn:aws:states:::lambda:invoke",
"InputPath": "$.MessageDetails",
"ResultPath": null,
"Parameters": {
"FunctionName": "MapSampleProj-DeleteFromSQSQueueLambda-198J2839ZO5K2",
"Payload": {
"ReceiptHandle.$": "$.ReceiptHandle"
}
},
"Next": "Publish message to SNS topic"
},
"Publish message to SNS topic": {
"Type": "Task",
"Resource": "arn:aws:states:::sns:publish",
"InputPath": "$.MessageDetails",
"Parameters": {
"Subject": "Message from Step Functions!",
"Message.$": "$.Body",
"TopicArn": "arn:aws:sns:us-east-1:012345678910:MapSampleProj-SNSTopic-1CQO4HQ3IR1KN"
},
"End": true
}
}
}
},
"Finish": {
"Type": "Succeed"
}
}
}
IAM 範例
範例專案產生的此範例 AWS Identity and Access Management (IAM) 政策包含執行狀態機器及相關資源所需的最低權限。我們建議您僅在 IAM 政策中加入必要的許可。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"lambda:InvokeFunction"
],
"Resource": [
"arn:aws:lambda:us-east-1:012345678901:function:MapSampleProj-ReadFromSQSQueueLambda-1MY3M63RMJVA9",
"arn:aws:lambda:us-east-1:012345678901:function:MapSampleProj-DeleteFromSQSQueueLambda-198J2839ZO5K2"
],
"Effect": "Allow"
},
{
"Action": [
"dynamodb:PutItem"
],
"Resource": [
"arn:aws:dynamodb:us-east-1:012345678901:table/MapSampleProj-DDBTable-YJDJ1MKIN6C5"
],
"Effect": "Allow"
},
{
"Action": [
"sns:Publish"
],
"Resource": [
"arn:aws:sns:us-east-1:012345678901:MapSampleProj-SNSTopic-1CQO4HQ3IR1KN"
],
"Effect": "Allow"
}
]
}
如需將 Step Functions 與其他 AWS 服務搭配使用時如何設定 IAM 的詳細資訊,請參閱整合式服務的 IAM 政策。