使用为Step Functions 创建 Lambda 状态机Amazon CDK - Amazon Step Functions
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 Amazon Web Services 服务入门

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

使用为Step Functions 创建 Lambda 状态机Amazon CDK

本教程向您展示如何使用创建包含Amazon Lambda函数的Amazon Step Functions状态机Amazon Cloud Development Kit (Amazon CDK)。Amazon CDK 是一个基础架构即代码 (IAC) 框架,可以让您用完整的编程语言定义 Amazon 基础设施使。您可使用 CDK 支持的语言之一编写应用程序,包含一个或多个堆栈。然后,您可以将其合成为Amazon CloudFormation模板并将其部署到您的Amazon账户。我们将使用此方法定义包含Amazon Lambda函数的Amazon Step Functions状态机,然后Amazon Web Services Management Console使用启动状态机的执行。

在开始本教程之前,必须按照 Amazon CDK-先决条件入门中所述设置Amazon CDK开发环境然后,Amazon CDK使用以下命令在以下位置安装Amazon CLI:

npm install -g aws-cdk

本教程产生的结果与相同使用为Step Functions 创建 Lambda 状态机Amazon CloudFormation。但是,在本教程中,Amazon CDK不需要您创建任何 IAM 角色;而是为您创建任何 IAM 角色。Amazon CDK该Amazon CDK版本还包含 “成功” 步骤,用于说明如何向状态机添加其他步骤。

您还可以部署无服务器应用程序,使用启动 Step Functions 工作流程Amazon CDK。要使用with将示例无服务器应用程序部署 TypeScript 到您的服务器上Amazon CDK,请参阅 TheAmazon Web Services 账户 Workshop 的模块 10-使用该Amazon Step Functions模块进行Amazon CDK部署

步骤 1:设置您的Amazon CDK项目

首先,为您的新Amazon CDK应用程序创建目录并初始化项目。

注意

请确保命名目录的目录step。Amazon CDK应用程序模板使用目录的名称来生成源文件和类的名称。如果您使用其他名称,则您的应用将与本教程不匹配。

TypeScript
mkdir step cd step cdk init --language typescript
JavaScript
mkdir step cd step cdk init --language javascript
Python
mkdir step cd step cdk init --language python

初始化项目后,激活项目的虚拟环境并安装 Amazon CDK 的基线依赖关系。

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

接下来,安装Amazon Lambda和的构造库模块Amazon Step Functions。

TypeScript
npm install @aws-cdk/aws-lambda @aws-cdk/aws-stepfunctions @aws-cdk/aws-stepfunctions-tasks
JavaScript
npm install @aws-cdk/aws-lambda @aws-cdk/aws-stepfunctions @aws-cdk/aws-stepfunctions-tasks
Python
python -m pip install aws-cdk.aws-lambda aws-cdk.aws-stepfunctions python -m pip install aws-cdk.aws-stepfunctions-tasks
Java

要构建您的应用程序,请运行mvn compile或使用 Java IDE 的构建命令。

C#
dotnet add src\Step package Amazon.CDK.AWS.Lambda dotnet add src\Step package Amazon.CDK.AWS.Stepfunctions dotnet add src\Step package Amazon.CDK.AWS.Stepfunctions.Tasks

您还可以使用 Visual Studio NuGet GUI 安装指定的程序包,可通过 T ools >NuGet Package Manager > Manag e P NuGet ackage Man ager

安装这些模块后,您可以通过导入以下软件包在Amazon CDK应用程序中使用它们:

TypeScript
@aws-cdk/aws-lambda @aws-cdk/aws-stepfunctions @aws-cdk/aws-stepfunctions-tasks
JavaScript
@aws-cdk/aws-lambda @aws-cdk/aws-stepfunctions @aws-cdk/aws-stepfunctions-tasks
Python
aws_cdk.aws_lambda aws_cdk.aws_stepfunctions aws_cdk.aws_stepfunctions_tasks
Java
software.amazon.awscdk.services.lambda software.amazon.awscdk.services.stepfunctions software.amazon.awscdk.services.stepfunctions.tasks
C#
Amazon.CDK.AWS.Lambda Amazon.CDK.AWS.StepFunctions Amazon.CDK.AWS.StepFunctions.Tasks

步骤 2:使用创建 Lambda 状态机Amazon CDK

首先,我们将介绍定义 Lambda 函数和 Step Functions 状态机的各个代码片段。然后,我们将解释如何在您的Amazon CDK应用程序中将它们组合在一起。最后,您将看到如何合成和部署这些资源。

创建 Lambda 函数

以下Amazon 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_12_X, handler: "index.handler", timeout: cdk.Duration.seconds(25) });
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_12_X, handler: "index.handler", timeout: cdk.Duration.seconds(25) });
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_12_X, handler="index.handler", timeout=cdk.Duration.seconds(25))
Java
Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );}")) .runtime(Runtime.NODEJS_12_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

  • 函数的源代码,以字符串形式嵌入到Amazon CDK应用程序的源代码中。

  • 其他函数属性,例如要使用的运行时间(节点 12.x)、函数的入口点和超时。

创建 Lambda 状态机

我们的状态机有两种状态:我们的 Lambda 函数任务和成功状态。该函数要求我们创建一个调用我们的函数任务的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
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 { Definition = new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }).next(new Succeed(this, "GreetedWorld")) });

生成和部署Amazon CDK应用程序

在您新创建的Amazon CDK项目,编辑包含堆栈定义的文件,使其类似于以下示例代码。您将认识前面部分中 Lambda 函数和 Step Functions 状态机的定义。

TypeScript

lib/step-stack.ts使用以下代码更新:

import * as cdk from '@aws-cdk/core'; import * as lambda from '@aws-cdk/aws-lambda'; import * as sfn from '@aws-cdk/aws-stepfunctions'; import * as tasks from '@aws-cdk/aws-stepfunctions-tasks'; export class StepStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_12_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使用以下代码更新。

const cdk = require('@aws-cdk/core'); const lambda = require('@aws-cdk/aws-lambda'); const sfn = require('@aws-cdk/aws-stepfunctions'); const tasks = require('@aws-cdk/aws-stepfunctions-tasks'); class StepStack extends cdk.Stack { constructor(scope: cdk.Construct, id: string, props?: cdk.StackProps) { super(scope, id, props); const helloFunction = new lambda.Function(this, 'MyLambdaFunction', { code: lambda.Code.fromInline(` exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; `), runtime: lambda.Runtime.NODEJS_12_X, handler: "index.handler", timeout: cdk.Duration.seconds(25) }); const stateMachine = new sfn.StateMachine(this, 'MyStateMachine', { definition: new tasks.LambdaInvoke(this, "MyLambdaTask", { lambdaFunction: helloFunction }).next(new sfn.Succeed(this, "GreetedWorld")) }); } } module.exports = { StepStack }
Python

step/step_stack.py使用以下代码更新。

from aws_cdk import core as cdk from aws_cdk import aws_lambda as lambda_ from aws_cdk import aws_stepfunctions as sfn from aws_cdk import aws_stepfunctions_tasks as tasks class StepStack(cdk.Stack): def __init__(self, scope: cdk.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_12_X, handler="index.handler", timeout=cdk.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.amazon.awscdk.core.Construct; import software.amazon.awscdk.core.Stack; import software.amazon.awscdk.core.StackProps; import software.amazon.awscdk.core.Duration; import software.amazon.awscdk.services.lambda.Function; import software.amazon.awscdk.services.lambda.Code; 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); Function helloFunction = Function.Builder.create(this, "MyLambdaFunction") .code(Code.fromInline( "exports.handler = (event, context, callback) => { callback(null, 'Hello World!' );")) .runtime(Runtime.NODEJS_12_X) .handler("index.handler") .timeout(Duration.seconds(25)) .build(); 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 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_12_X, Handler = "index.handler", Timeout = Duration.Seconds(25) }); var stateMachine = new StateMachine(this, "MyStateMachine", new StateMachineProps { Definition = new LambdaInvoke(this, "MyLambdaTask", new LambdaInvokeProps { LambdaFunction = helloFunction }).Next(new Succeed(this, "GreetedWorld")) }); } } }

保存源文件。cdk synthAmazon CDK运行应用程序并从中合成一个Amazon CloudFormation模板。Amazon CDK然后显示模板。

要将 Lambda 函数和 Step Functions 状态机实际部署到您的Amazon账户,请发出cdk deploy。将要求您批准 Amazon CDK 生成的 IAM policy。

步骤 3:启动状态机执行

在创建您的Lambda 状态机之后,您就可以开始执行。

启动状态机执行

  1. 打开 Step Functions 控制台并选择您使用创建的状态机的名称Amazon CDK。

  2. MyStateMachine-ABCDEFGHIJ1K 页面上,选择 “新建执行”。

    此时将显示 New execution 页面。

  3. (可选)要识别您的执行情况,可以在 “名称” 框中为其指定名称。默认情况下,Step Functions 会自动生成唯一的执行名称。

    注意

    Step Functions 允许您创建包含非 ASCII 字符的状态机、执行和活动名称。这些非 ASCII 名称不适用于亚马逊 CloudWatch。为确保您可以跟踪 CloudWatch 指标,请选择仅使用 ASCII 字符的名称。

  4. 选择 Start Execution (开始执行)

    此时将启动新的状态机执行,并显示一个说明正在运行的执行的新页面。

  5. (可选)在 Execution Details (执行详细信息) 中,查看 Execution Status (执行状态) 以及 Started (已开始)Closed (已关闭) 时间戳。

  6. 要查看执行结果,请选择 Output

步骤 4:清理

测试完状态机后,我们建议您同时删除状态机和相关的 Lambda 函数,以释放您的状态机中的资源Amazon Web Services 账户。在应用程序的主目录中运行cdk destroy命令以删除您的状态机。

后续步骤

要了解有关使用 Amazon CDK 开发 Amazon 基础设施的信息,请参阅Amazon CDK开发人员指南

有关使用所选语言编写 Amazon CDK 应用程序的信息,请参阅:

TypeScript

与 inAmazon CDK 合作 TypeScript

JavaScript

与 inAmazon CDK 合作 JavaScript

Python

在 Python 中使用 Amazon CDK

Java

在 Java 中使用 Amazon CDK

C#

在 C# 中使用 Amazon CDK

有关 Amazon 本教程中使用的构造库模块,请参阅下面的 Amazon CDK API 参考概述。