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

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

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

本教程介绍如何创建Amazon Step Functions状态机Amazon Lambda使用执行函数Amazon Cloud Development Kit (CDK)。这些区域有:Amazon CDK是一个基础架构即代码 (IAC) 框架,它允许您定义Amazon基础设施使用完整的编程语言。您可以使用 CDK 支持的语言之一编写应用程序(包含一个或多个堆栈),然后将其合成为Amazon CloudFormation模板并将其部署到Amazonaccount. 我们将使用它定义Amazon Step Functions状态机Amazon Lambda函数,然后使用Amazon Web Services Management Console启动执行。

在开始学习本教程之前,请设置Amazon CDK开发环境,如入门Amazon CDK-先决条件,然后安装Amazon CDK通过发布:

npm install -g aws-cdk

本教程生成的结果基本上与为 Step Functions 创建 Lambda 状态机使用Amazon CloudFormation。该教程和本教程之间的主要区别在于Amazon CDK不需要您创建任何 IAM 角色;Amazon CDK为您执行该操作。这些区域有:Amazon CDK版本还包括一个 “成功” 步骤,以说明如何向状态机添加其他步骤。

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

首先,为您的新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
注意

请确保将目录命名为step。这些区域有:Amazon CDK应用程序模板使用目录的名称生成源文件和类的名称。如果您使用其他名称,您的应用将不会与本教程相匹配。

现在安装构造库模块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

编辑项目的pom.xml将以下依赖项添加到现有<dependencies>容器。

<dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>stepfunctions</artifactId> <version>${cdk.version}</version> </dependency> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>stepfunctions-tasks</artifactId> <version>${cdk.version}</version> </dependency> <dependency> <groupId>software.amazon.awscdk</groupId> <artifactId>lambda</artifactId> <version>${cdk.version}</version> </dependency>

Maven 会在下次构建应用程序时自动安装这些依赖关系。要构建,请发出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 图形用户界面安装指示的软件包,可通过工具 >NuGet 软件包管理器 >管理解决方案的 NuGet 软件包

安装完这些模块后,您可以在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 步:使用Amazon CDK创建 Lambda 状态机

首先,我们将介绍定义 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.hnadler", Timeout = Duration.Seconds(25) });

你可以在这个简短的片段中看到:

  • 函数的逻辑名称MyLambdaFunction

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

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

创建 Lambda 状态机

我们的状态机有两种状态:Lambda 函数任务和成功状态。该函数要求我们创建一个 Step FunctionsTask调用我们的函数,然后使用它作为状态机的第一步。成功状态将使用该任务的next()方法。这个代码如下所示。

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.hnadler", 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 synth在应用程序的主目录中。这些区域有:Amazon CDK运行应用程序并合成Amazon CloudFormation模板,然后显示该模板。

要将 Lambda 函数和 Step Functions 状态机实际部署到Amazon帐户, 问题cdk deploy。系统将要求您批准Amazon CDK已生成。

第 3 步:启动状态机执行

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

启动状态机执行

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

  2. MyStateMachine-ABCDEFGHIJ1K 页面上,选择 New execution

    此时将显示 New execution 页面。

  3. (可选)为了帮助识别您的执行,您可以在输入执行名称。如果未输入 ID,则 “Step Functions” 将自动生成一个唯一 ID。

    注意

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

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

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

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

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

第 4 步:清除

当你完成状态机的尝试后,你可以使用Amazon CDK。问题cdk destroy在您的应用程序的主目录中。

后续步骤

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

有关写作的信息Amazon CDK应用程序,请参阅:

TypeScript

使用Amazon CDK在 TypeScript 中

JavaScript

使用Amazon CDKJavaScript 中的

Python

使用Amazon CDKPython 中

Java

使用Amazon CDKJava 中的

C#

使用Amazon CDK在 C# 中

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