AWS CDK を使用してStep Functions 用の Lambda ステートマシンを作成 - AWS Step Functions

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

AWS CDK を使用してStep Functions 用の Lambda ステートマシンを作成

このチュートリアルでは、AWS Step FunctionsAWS Lambdaを使用して関数を含むステートマシンを作成する方法を説明しますAWS Cloud Development Kit (AWS CDK)。AWS CDK は、本格的なプログラミング言語を使用して、AWS インフラストラクチャを定義することができるコードとしての Infrastructure as Code (IAC) フレームワークです。1 つ以上のスタックを含む CDK がサポートする言語の 1 つでアプリを作成できます。その後、AWS CloudFormationAWSそれをテンプレートに合成してアカウントにデプロイできます。AWS Step FunctionsAWS Lambdaこのメソッドを使用して関数を含むステートマシンを定義し、次にを使用してステートマシンの実行を開始します。AWS Management Console

このチュートリアルを開始する前に、「はじめに AWS CDK-前提条件」AWS CDK の説明に従って開発環境を設定する必要があります。次に、次のコマンドを実行して、AWS CDKをにインストールします。AWS CLI

npm install -g aws-cdk

このチュートリアルでは、と同じ結果が得られますAWS CloudFormation を使用して Step Functions 用の Lambda ステートマシンを作成する。ただし、このチュートリアルでは、IAM AWS CDK AWS CDK ロールを作成する必要はなく、が自動的に作成します。AWS CDK バージョンには、ステートマシンにさらにステップを追加する方法を説明する成功ステップも含まれています。

ヒント

AWS CDKwith を使用して Step Functions TypeScript ワークフローを開始するサンプルサーバーレスアプリケーションをデプロイするにはAWS アカウント、The AWS Step Functions Workshop の「モジュール 10-AWS CDK デプロイによるデプロイ」を参照してください。

ステップ 1:AWS CDK プロジェクトを設定する

まず、新しい AWS CDK アプリケーションのディレクトリを作成し、プロジェクトを初期化します。

注記

必ずディレクトリの名前はディレクトリ step としてください。AWS 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

プロジェクトが初期化されたら、プロジェクトの仮想環境をアクティブにし、AWS 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

次に、AWS LambdaAWS 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

アプリをビルドするには、Java IDE の Build mvn compile コマンドを実行するか、使用します。

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 を使用して指定されたパッケージをインストールすることもできます。インストールするには、[ツール] > [NuGetパッケージマネージャ] > [NuGetソリューション用パッケージの管理] からアクセスできます。

これらのモジュールをインストールしたら、AWS 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: AWS CDK を使用して Lambda ステートマシンを作成する

最初に、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_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

  • AWS CDK アプリケーションのソースコードに文字列として埋め込まれている関数のソースコード。

  • 使用するランタイム (Node 12.x)、関数のエントリポイント、タイムアウトなど、その他の関数属性。

Lambda ステートマシンを作成するには

ステートマシンには、Lambda 関数タスクと成功の状態の 2 つの状態があります。この関数では、タスク関数を呼び出すステップ関数を作成する必要があります。このタスクステートは、ステートマシンの最初のステップとして使用されます。成功状態は、next()そのタスクのメソッドを使用してステートマシンに追加されます。次のコードは両方とも関数を呼び出しMyLambdaTasknext()メソッドを使用して成功状態を次のように設定します。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")) });

AWS CDK アプリケーションを構築してデプロイするには

AWS 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_cdk.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.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 synthアプリケーションのメインディレクトリでコマンドを実行します。AWS CDKはアプリを実行し、AWS CloudFormationそこからテンプレートを合成します。AWS CDK次に、テンプレートが表示されます。

Lambda 関数と Step Functions ステートマシンを実際に AWS アカウントにデプロイするには、cdk deploy を発行します。AWS CDK が生成されたIAM ポリシーを承認するよう求められます。

ステップ 3: ステートマシンの実行をスタートする

Lambda ステートマシンを作成したら、実行を開始できます。

ステートマシンの実行をスタートするには

  1. Step Functions コンソールを開いて、AWS CDK を使用して作成したステートマシンの名前を選択します。

  2. MyStateMachine-ABCDEFGHIJ1K ページで、「新規実行」を選択します。

    [New execution] (新しい実行) ページが表示されます。

  3. (オプション) 実行内容を識別するために、「名前」ボックスに名前を指定できます。デフォルトでは、Step Functions は一意の実行名を自動的に生成します。

    注記

    Step Functions では、非 ASCII 文字を含むステートマシン、実行、およびアクティビティ名を作成できます。これらのASCII以外の名前はAmazonでは使用できません。CloudWatchCloudWatchメトリクスを確実に追跡できるようにするには、ASCII 文字のみを使用する名前を選択してください。

  4. [Start Execution] (実行のスタート) を選択します。

    ステートマシンの新しい実行がスタートされ、実行中の実行が表示されている新しいページが表示されます。

  5. (オプション) [Execution Details] (実行の詳細) で、[Execution Status] (実行ステータス) および [Started] (開始済み) と [Closed] (終了済み) のタイムスタンプをレビューします。

  6. 実行結果を表示するには、[Output] (出力) タブを選択します。

ステップ 4: クリーンアップする

ステートマシンをテストしたら、ステートマシンと関連する Lambda 関数の両方を削除して、内のリソースを解放することをお勧めします。AWS アカウントcdk destroyアプリのメインディレクトリでコマンドを実行して、ステートマシンを削除します。

次のステップ

AWS CDK を使用して AWS インフラストラクチャの開発の詳細については、AWS CDK デベロッパーガイドを参照してください。

お好みの言語で AWS CDK アプリケーションを書く方法についての情報は、以下を参照してください:

TypeScript

AWS CDKインとの連携 TypeScript

JavaScript

AWS CDKインとの連携 JavaScript

Python

Python で AWS CDK を捜査 

Java

Java で AWS CDK を操作

C#

C# で AWS CDK を操作

このチュートリアルで使用する AWS ライブラリモジュールの構築についての詳細は、以下に示す AWS CDK API リファレンスの概要を参照してください。