翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。
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)
});
この短いコード例を見るとわかります。
Lambda ステートマシンを作成するには
ステートマシンには、Lambda 関数タスクと成功の状態の 2 つの状態があります。この関数では、タスク関数を呼び出すステップ関数を作成する必要があります。このタスクステートは、ステートマシンの最初のステップとして使用されます。成功状態は、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"))
});
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 ステートマシンを作成したら、実行を開始できます。
ステートマシンの実行をスタートするには
-
Step Functions コンソールを開いて、AWS CDK を使用して作成したステートマシンの名前を選択します。
-
MyStateMachine-ABCDEFGHIJ1K
ページで、「新規実行」を選択します。
[New execution] (新しい実行) ページが表示されます。
(オプション) 実行内容を識別するために、「名前」ボックスに名前を指定できます。デフォルトでは、Step Functions は一意の実行名を自動的に生成します。
Step Functions では、非 ASCII 文字を含むステートマシン、実行、およびアクティビティ名を作成できます。これらのASCII以外の名前はAmazonでは使用できません。CloudWatchCloudWatchメトリクスを確実に追跡できるようにするには、ASCII 文字のみを使用する名前を選択してください。
-
[Start Execution] (実行のスタート) を選択します。
ステートマシンの新しい実行がスタートされ、実行中の実行が表示されている新しいページが表示されます。
-
(オプション) [Execution Details] (実行の詳細) で、[Execution Status] (実行ステータス) および [Started] (開始済み) と [Closed] (終了済み) のタイムスタンプをレビューします。
-
実行結果を表示するには、[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 リファレンスの概要を参照してください。