建立要Step Functions使用的Lambda狀態機 AWS CDK - AWS Step Functions

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

建立要Step Functions使用的Lambda狀態機 AWS CDK

本教學課程說明如何建AWS Step Functions立包含使用的AWS Lambda函數的狀態機器AWS Cloud Development Kit (AWS CDK)。這AWS CDK是一個基礎設施即代碼(IAC)框架,可以讓你使用一個完整的編程語言定義 AWS 基礎設施。您可以使用其中一種支援的語言撰寫應用程式,其中包含一或多個堆疊。CDK然後,您可以將其合成為AWS CloudFormation模板並將其部署到您的 AWS 帳戶。我們將使用此方法來定義包含Lambda函數的Step Functions狀態機器,然後使用 AWS Management Console 來運行狀態機器。

在開始本教學課程之前,您必須依照開AWS CDK發AWS Cloud Development Kit (AWS CDK) 人員指南中的 [AWS CDK-先決條件] 中所述設定您的開發環境。然後,AWS CDK使用以下命令安裝在AWS CLI:

npm install -g aws-cdk

本自學課程產生的結果與使用建立 Step Functions 的 Lambda 狀態機 AWS CloudFormation. 但是,在本教程中,AWS CDK不需要您創建任何IAM角色; 為您AWS CDK做到了。該AWS CDK版本還包括一個Succeed步驟來說明如何向狀態機添加其他步驟。

提示

若要將啟動工作流程使用的範例無伺服器應AWS CDK用Step Functions程式部署 TypeScript 至您的工作流程 AWS 帳戶,請參閱 AWS Step Functions 工作坊AWS CDK的單元 10-部署

步驟 1:設定您的 AWS CDK 專案

  1. 如果您願意,請在主目錄或其他目錄中執行下列命令,為新AWS CDK應用程式建立目錄。

    重要

    請務必命名目錄step。AWS CDK應用程式範本會使用目錄名稱來產生來源檔案和類別的名稱。若使用不同名稱,您的應用程式將與本教學課程不相符。

    TypeScript
    mkdir step && cd step
    JavaScript
    mkdir step && cd step
    Python
    mkdir step && cd step
    Java
    mkdir step && cd step
    C#

    確保您已安裝 .NET 6.0 或更高版本。如需資訊,請參閱支援的版本

    mkdir step && cd step
  2. 使用 cdk init 指令初始化應用程式。指定所需的範本 (「app」) 和程式設計語言,如下列範例所示。

    TypeScript
    cdk init --language typescript
    JavaScript
    cdk init --language javascript
    Python
    cdk init --language python

    專案初始化後,啟動專案的虛擬環境並安裝AWS CDK的基準相依性。

    source .venv/bin/activate python -m pip install -r requirements.txt
    Java
    cdk init --language java
    C#
    cdk init --language csharp

步驟 2:用AWS CDK來建立狀態機

首先,我們將介紹定義Lambda函數和Step Functions狀態機器的各個代碼片段。然後,我們將解釋如何將它們放在您的AWS CDK應用程序中。最後,您將看到如何合成和部署這些資源。

建立 Lambda 函數

下列AWS CDK程式碼會定義Lambda函式,並以內嵌方式提供其原始程式碼。

TypeScript
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) });
JavaScript
const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) });
Python
hello_function = lambda_.Function( self, "MyLambdaFunction", code=lambda_.Code.from_inline(""" exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }"""), runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", timeout=Duration.seconds(25))
Java
final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}")) .runtime(Runtime.NODEJS_18_X) .handler("index.handler") .timeout(Duration.seconds(25)) .build();
C#
var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps { Code = Code.FromInline(@"` exports.handler = (event, context, callback) => { callback(null, 'Hello World!'); }"), Runtime = Runtime.NODEJS_12_X, Handler = "index.handler", Timeout = Duration.Seconds(25) });

你可以在這個簡短的示例代碼中看到:

  • 函數的邏輯名稱,MyLambdaFunction.

  • 函數的原始程式碼,以字串形式嵌入到應用程式的原始AWS CDK程式碼中。

  • 其他函數屬性,例如要使用的執行階段 (節點 18.x)、函數的進入點和逾時。

建立 狀態機器

我們的狀態機有兩種狀態:Lambda函數任務和Succeed狀態。該函數要求我們創建一個調Step Functions任務用我們的函數。此任務狀態用作狀態的狀態機器中的第一個步驟。成功狀態會使用工作狀態的next()方法新增至狀態機器。下列程式碼會先叫用名為的函數MyLambdaTask,然後使用該next()方法定義名為GreetedWorld的成功狀態。

TypeScript
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) });
JavaScript
const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) });
Python
state_machine = sfn.StateMachine( self, "MyStateMachine", definition=tasks.LambdaInvoke( self, "MyLambdaTask", lambda_function=hello_function) .next(sfn.Succeed(self, "GreetedWorld")))
Java
final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask") .lambdaFunction(helloFunction) .build() .next(new Succeed(this, "GreetedWorld"))) .build();
C#
var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }) .Next(new Succeed(this, "GreetedWorld"))) });

若要建置和部署AWS CDK應用程式

在新建立的AWS CDK專案中,編輯包含堆疊定義的檔案,使其看起來像下列範例程式碼。您將從前面的章節中識別Lambda函數和Step Functions狀態機的定義。

  1. 更新堆疊,如下列範例所示。

    TypeScript

    lib/step-stack.ts使用下面的代碼更新。

    import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; export class StepStack extends cdk.Stack { constructor(app: cdk.App, id: string) { super(app, id); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) }); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) }); } }
    JavaScript

    lib/step-stack.js使用下面的代碼更新。

    import * as cdk from 'aws-cdk-lib'; import * as lambda from 'aws-cdk-lib/aws-lambda'; import * as sfn from 'aws-cdk-lib/aws-stepfunctions'; import * as tasks from 'aws-cdk-lib/aws-stepfunctions-tasks'; export class StepStack extends cdk.Stack { constructor(app, id) { super(app, id); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_18_X, handler: "index.handler", timeout: cdk.Duration.seconds(3) }); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) }); } }
    Python

    step/step_stack.py使用下面的代碼更新。

    from aws_cdk import ( Duration, Stack, aws_stepfunctions as sfn, aws_stepfunctions_tasks as tasks, aws_lambda as lambda_ ) class StepStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) hello_function = lambda_.Function( self, "MyLambdaFunction", code=lambda_.Code.from_inline(""" exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }"""), runtime=lambda_.Runtime.NODEJS_18_X, handler="index.handler", timeout=Duration.seconds(25)) state_machine = sfn.StateMachine( self, "MyStateMachine", definition=tasks.LambdaInvoke( self, "MyLambdaTask", lambda_function=hello_function) .next(sfn.Succeed(self, "GreetedWorld")))
    Java

    src/main/java/com.myorg/StepStack.java使用下面的代碼更新。

    package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.Duration; import software.amazon.awscdk.services.lambda.Code; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Runtime; import software.amazon.awscdk.services.stepfunctions.StateMachine; import software.amazon.awscdk.services.stepfunctions.Succeed; import software.amazon.awscdk.services.stepfunctions.tasks.LambdaInvoke; public class StepStack extends Stack { public StepStack(final Construct scope, final String id) { this(scope, id, null); } public StepStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); final Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}")) .runtime(Runtime.NODEJS_18_X) .handler("index.handler") .timeout(Duration.seconds(25)) .build(); final StateMachine stateMachine = StateMachine.Builder.create(this, "MyStateMachine") .definition(LambdaInvoke.Builder.create(this, "MyLambdaTask") .lambdaFunction(helloFunction) .build() .next(new Succeed(this, "GreetedWorld"))) .build(); } }
    C#

    scr/Step/StepStack.cs使用下面的代碼更新。

    using Amazon.CDK; using Constructs; using Amazon.CDK.AWS.Lambda; using Amazon.CDK.AWS.StepFunctions; using Amazon.CDK.AWS.StepFunctions.Tasks; namespace Step { public class StepStack : Stack { internal StepStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var helloFunction = new Function(this, "MyLambdaFunction", new FunctionProps { Code = Code.FromInline(@"exports.handler = (event, context, callback) => { callback(null, 'Hello World!'); }"), Runtime = Runtime.NODEJS_18_X, Handler = "index.handler", Timeout = Duration.Seconds(25) }); var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { DefinitionBody = DefinitionBody.FromChainable(new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }) .Next(new Succeed(this, "GreetedWorld"))) }); } } }
  2. 保存源文件,然後在應用程序的主目錄中運行cdk synth命令。

    AWS CDK運行該應用程序並從中合成AWS CloudFormation模板。 AWS CDK然後顯示範本。

    注意

    如果您曾經 TypeScript 建立AWS CDK專案,執行命cdk synth令可能會傳回下列錯誤。

    TSError: ⨯ Unable to compile TypeScript: bin/step.ts:7:33 - error TS2554: Expected 2 arguments, but got 3.

    修改bin/step.ts檔案,如下列範例所示,以解決此錯誤。

    #!/usr/bin/env node import 'source-map-support/register'; import * as cdk from 'aws-cdk-lib'; import { StepStack } from '../lib/step-stack'; const app = new cdk.App(); new StepStack(app, 'StepStack'); app.synth();
  3. 若要將 Lambda 函數和 Step Functions 數狀態機器部署到您的 AWS 帳戶,請發出問題cdk deploy。系統會要求您核准 AWS CDK 已產生的 IAM 政策。

步驟 3:啟動狀態機執行

建立狀態機之後,您就可以開始執行它。

開始狀態機器執行

  1. 開啟 Step Functions 主控台,然後選擇您使用建立的狀態機器名稱AWS CDK。

  2. 在 [狀態機器] 頁面上,選擇 [開始執行]。

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

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

    注意

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

  4. 選擇 Start Execution (開始執行)

    您的狀態機的執行開始,並顯示一個顯示正在運行執行的新頁面。

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

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

步驟 4:清除

測試完狀態機之後,我們建議您移除狀態機和相關 Lambda 函數,以釋放 AWS 帳戶. 在應用程序的主目錄中運行該cdk destroy命令以刪除狀態機。

後續步驟

若要深入瞭解如何使用開發 AWS 基礎架構AWS CDK,請參閱AWS CDK開發人員指南

如需有關以所選語言編寫 AWS CDK 應用程式的資訊,請參閱:

TypeScript

AWS CDK在中使用 TypeScript

JavaScript

AWS CDK在中使用 JavaScript

Python

AWS CDK在 Python 中使用

Java

AWS CDK在 Java 中使用

C#

AWS CDK在 C# 中使用

如需本教學課程中使用之「 AWS 建構程式庫」模組的詳細資訊,請參閱下列 AWS CDK API 參考概觀: