使用为 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 支持的语言之一编写应用程序包含一个或多个堆栈. T母鸡,您 能够将其合成为Amazon CloudFormation模板并将其部署到Amazonaccount. 我们将使用这种方法定义Amazon Step Functions状态机Amazon Lambda函数,然后使用Amazon Web Services Management Console启动执行。

优化前你开始本教程,你必须设置您的Amazon CDK开发环境,如中所述入门Amazon CDK-先决条件 T母鸡、安装Amazon CDK 在以下命令中:Amazon CLI:

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 GUI 安装指定的程序包,可通过Tools > NuGet Package Manager > Manage NuGet Packages for Solution 实现。

Once你已经安装SEE模块,您可以在您的中使用它们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 状态机的各段代码. T母鸡,我们将解释如何将它们放在一起您的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 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.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")) }); } } }

保存源文件.T母鸡中,运行 cdk synth 命令在应用程序的主目录中。这些区域有:Amazon CDK运行应用程序并合成Amazon CloudFormation从中的模板. 这些区域有:Amazon CDK 然后显示模板。

将 Lambda 函数和 Step Functions 状态机实际部署到您的Amazon账户,问题cdk deploy. 将要求您批准 Amazon CDK 生成的IAM策略。

第 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 步:清除

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

后续步骤

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

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

TypeScript

在 TypeScript 中使用 Amazon CDK

JavaScript

在 JavaScript 中使用 Amazon CDK

Python

在 Python 中使用 Amazon CDK

Java

在 Java 中使用 Amazon CDK

C#

在 C# 中使用 Amazon CDK

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