使用 Step Functions 創建活動狀態機 - AWS Step Functions

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 Step Functions 創建活動狀態機

本教學課程會說明如何使用 Java 和 AWS Step Functions,建立以活動為基礎的狀態機器。活動可讓您控制從狀態機器執行的其他位置的 Worker 程式碼。如需概觀,請參閱 Step Functions 的工作原理 中的 活動

為了完成本教學,您需要以下項目:

  • 適用於 Java 的 開發套件。本教學課程中的範例活動是一個 Java 應用程式,它使用與通訊 AWS。 AWS SDK for Java

  • AWS 環境或標準 AWS 組態檔案中的認證。如需詳細資訊,請參閱AWS SDK for Java 開發人員指南的「設定 AWS 認證」。

步驟 1:建立活動

您必須讓 Step Functions 知道您要建立其 Worker (程式) 的活動。Step Functions 會使用建立活動身分的 Amazon 資源名稱 (ARN) 回應。使用此身分來協調狀態機器和工作者之間傳遞的資訊。

重要

確保您的活動任務與狀態機位於相同的 AWS 帳戶下。

  1. 在「Step Functions」主控台的左側導覽窗格中,選擇「活動」。

  2. 選擇 Create activity (建立活動)

  3. 輸入活動的 [名稱],例如get-greeting,然後選擇 [建立活動]。

  4. 建立活動任務時,請記下其 ARN,如以下範例所示。

    arn:aws:states:us-east-1:123456789012:activity:get-greeting

步驟 2:建立狀態機

建立狀態機器以決定何時呼叫您的活動,以及您的工作者何時應執行其主要工作、收集並傳回結果。若要建立狀態機,您將使用程式碼編輯器的工作流程工作室。

  1. 在 [Step Functions] 主控台的左側導覽窗格中,選擇 [狀態機器]。

  2. 在 [狀態機器] 頁面上,選擇 [建立狀態機器]。

  3. 在「選擇範本」對話方塊中,選取「空白」。

  4. 選擇選取。這會在設計模式中開啟工作流程工作室

  5. 在本教程中,您將在代碼編輯器中編寫狀態機的Amazon States Language(ASL)定義。若要這麼做,請選擇 [程式碼]。

  6. 刪除現有的樣板代碼並粘貼以下代碼。請記得將此程式碼中的範例 ARN 取代為您先前在欄位中建立的活動任務Resource ARN。

    { "Comment": "An example using a Task state.", "StartAt": "getGreeting", "Version": "1.0", "TimeoutSeconds": 300, "States": { "getGreeting": { "Type": "Task", "Resource": "arn:aws:states:us-east-1:123456789012:activity:get-greeting", "End": true } } }

    這是使用Amazon States Language(ASL)對狀態機的描述。它定義名為 getGreeting 的單一 Task 狀態。如需詳細資訊,請參閱狀態機器結構

  7. 在上圖形視覺化窗格,請確定您新增的 ASL 定義的工作流程圖看起來與下圖類似。

  8. 指定狀態機的名稱。若要執行此操作,請選擇的預設狀態機器名稱旁邊的編輯圖示MyStateMachine。然後,在 [狀態機器組態] 中,在 [狀態機器名稱] 方塊中指定名稱

    針對本教學課程,輸入名稱 ActivityStateMachine

  9. (選擇性) 在狀態機器組態中,指定其他工作流程設定,例如狀態機器類型及其執行角色。

    在本教學課程中,請保留狀態機器設定中的所有預設選項。

    如果您先前已使用狀態機器的正確許可建立 IAM 角色,並且想要使用它,請在 [權限] 中選取 [選擇現有角色],然後從清單中選取角色。或選取 [輸入角色 ARN],然後為該 IAM 角色提供 ARN。

  10. 在 [確認角色建立] 對話方塊中,選擇 [確認] 以繼續。

    您也可以選擇 [檢視角色設定] 以返回 [狀態機器組態]。

    注意

    如果您刪除 Step Functions 建立的 IAM 角色,則 Step Functions 稍後無法重新建立。同樣地,如果您修改角色 (例如,透過從 IAM 政策中的主體移除 Step Functions),Step Functions 稍後無法還原其原始設定。

步驟 3:實作工作者

建立工作者。工作者是一種程式,負責:

  • 輪詢使用 GetActivityTask API 動作之活動的 Step Functions。

  • 使用您的程式碼執行活動工作 (例如,以下程式碼中的 getGreeting() 方法)。

  • 使用 SendTaskSuccessSendTaskFailureSendTaskHeartbeat API 動作傳回結果。

注意

如需活動工作者的更完整範例,請參閱 Ruby 中的範例活動工作者。此範例根據最佳實務提供實作,可供您的活動工作者參考。此程式碼會實作可為輪詢器和活動工作者設定執行緒數量的消費者-生產者模式。

實作工作者

  1. 建立名為 GreeterActivities.java 的檔案。

  2. 新增以下程式碼至其中。

    import com.amazonaws.ClientConfiguration; import com.amazonaws.auth.EnvironmentVariableCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.stepfunctions.AWSStepFunctions; import com.amazonaws.services.stepfunctions.AWSStepFunctionsClientBuilder; import com.amazonaws.services.stepfunctions.model.GetActivityTaskRequest; import com.amazonaws.services.stepfunctions.model.GetActivityTaskResult; import com.amazonaws.services.stepfunctions.model.SendTaskFailureRequest; import com.amazonaws.services.stepfunctions.model.SendTaskSuccessRequest; import com.amazonaws.util.json.Jackson; import com.fasterxml.jackson.databind.JsonNode; import java.util.concurrent.TimeUnit; public class GreeterActivities { public String getGreeting(String who) throws Exception { return "{\"Hello\": \"" + who + "\"}"; } public static void main(final String[] args) throws Exception { GreeterActivities greeterActivities = new GreeterActivities(); ClientConfiguration clientConfiguration = new ClientConfiguration(); clientConfiguration.setSocketTimeout((int)TimeUnit.SECONDS.toMillis(70)); AWSStepFunctions client = AWSStepFunctionsClientBuilder.standard() .withRegion(Regions.US_EAST_1) .withCredentials(new EnvironmentVariableCredentialsProvider()) .withClientConfiguration(clientConfiguration) .build(); while (true) { GetActivityTaskResult getActivityTaskResult = client.getActivityTask( new GetActivityTaskRequest().withActivityArn(ACTIVITY_ARN)); if (getActivityTaskResult.getTaskToken() != null) { try { JsonNode json = Jackson.jsonNodeOf(getActivityTaskResult.getInput()); String greetingResult = greeterActivities.getGreeting(json.get("who").textValue()); client.sendTaskSuccess( new SendTaskSuccessRequest().withOutput( greetingResult).withTaskToken(getActivityTaskResult.getTaskToken())); } catch (Exception e) { client.sendTaskFailure(new SendTaskFailureRequest().withTaskToken( getActivityTaskResult.getTaskToken())); } } else { Thread.sleep(1000); } } } }
    注意

    此範例中的 EnvironmentVariableCredentialsProvider 類別假設已設定 AWS_ACCESS_KEY_ID (或 AWS_ACCESS_KEY) 和 AWS_SECRET_KEY (或 AWS_SECRET_ACCESS_KEY) 環境變數。如需有關向工廠提供所需認證的詳細資訊,請參閱《開發AWS SDK for Java 人員指南》AWSCredentialsProvider中的「AWS SDK for Java API 參考和「設定 AWS 認證和開發區域」中的。

    根據預設, AWS SDK 最多會等待 50 秒,從伺服器接收資料以進行任何作業。此 GetActivityTask 操作是長時間輪詢操作,將等待最多 60 秒,以取得下一個可用任務。若要避免收到SocketTimeoutException錯誤訊息, SocketTimeout 請設定為 70 秒。

  3. GetActivityTaskRequest().withActivityArn() 建構函數的參數清單,將 ACTIVITY_ARN 值取代為您先前建立的活動任務 ARN。

步驟 4:運行狀態機

當您開始執行狀態機器時,Worker 會輪詢 Step Functions 的活動,執行其工作 (使用您提供的輸入),並傳回其結果。

  1. ActivityStateMachine頁面上,選擇 [開始執行]。

    此時會顯示「開始執行」對話方塊。

  2. 在 [開始執行] 對話方塊中,執行下列動作:

    1. (選擇性) 若要識別您的執行項目,您可以在「名稱」(Name) 方塊中指定執行項目的名稱。默認情況下,Step Functions 自動生成一個唯一的執行名稱。

      注意

      Step Functions 可讓您建立狀態機器、執行項目和活動的名稱,以及包含非 ASCII 字元的標籤。這些非 ASCII 名稱不適用於 Amazon CloudWatch。若要確保您可以追蹤 CloudWatch 量度,請選擇僅使用 ASCII 字元的名稱。

    2. 在 [入] 方塊中,輸入下列 JSON 輸入以執行您的工作流程。

      { "who": "AWS Step Functions" }
    3. 選擇 Start execution (開始執行)

    4. 「Step Functions」主控台會將您引導至標題為執行 ID 的頁面。此頁面稱為「執行詳細資訊」頁面。在此頁面上,您可以在執行進行時或完成之後複查執行結果。

      若要複查執行結果,請在「圖形」檢視中選擇個別狀態,然後選擇步驟詳情窗格上的個別索引標籤,分別檢視每個狀態的詳細資訊,包括輸入、輸出和定義。如需有關可在「執行詳細資訊」頁面檢視之執行資訊的詳細資訊,請參閱執行詳細資訊頁面 — 介面概觀

步驟 5:執行和停用工作者

若要讓工作者輪詢您的活動狀態機器,您必須執行工作者。

  1. 在命令列上,導覽至您建立 GreeterActivities.java 的目錄。

  2. 要使用 AWS SDK,請將libthird-party目錄的完整路徑添加到構建文件的依賴項和 Java 中CLASSPATH。如需詳細資訊,請參閱AWS SDK for Java 開發人員指南中的下載和解壓縮 SDK

  3. 編譯檔案。

    $ javac GreeterActivities.java
  4. 執行 檔案。

    $ java GreeterActivities
  5. 在「Step Functions」主控台上,瀏覽至「執行詳細資訊」頁面。

  6. 執行完成時,請檢查執行結果。

  7. 停用工作者。