AWS Step Functions
開発者ガイド

AWS CloudFormation を使用して Lambda ステートマシンを作成する

このチュートリアルでは、基本的な AWS Lambda 関数を作成する方法、およびステートマシンの実行を自動的に開始する方法を説明します。スタック (IAM ロール、Lambda 関数、およびステートマシン) の作成には AWS CloudFormation コンソールおよび YAML テンプレートを使用します。その後、AWS Step Functions コンソールを使用してステートマシンの実行を開始します。詳細については、AWS CloudFormation ユーザーガイドの「CloudFormation テンプレートの使用」および「AWS::StepFunctions::StateMachine リソース」を参照してください。

ステップ 1: AWS CloudFormation テンプレートのセットアップ

YAML テンプレート例を使用する前に、独立した部分を理解しておく必要があります。

Lambda 用に IAM ロールを作成するには

Lambda 関数の IAM ロールに関連付けられた信頼ポリシーを定義します。

YAMLJSON
YAML
LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole"
JSON
"LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } }

Lambda 関数を作成するには

Hello World というメッセージを出力する Lambda 関数の以下のプロパティを定義します。

重要

Lambda 関数が、ステートマシンと同じ AWS アカウントとリージョンにあることを確認します。

YAMLJSON
YAML
MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs4.3" Timeout: "25"
JSON
"MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs4.3", "Timeout": "25" } },

ステートマシンの実行用の IAM ロールを作成するには

ステートマシンの実行の IAM ロールに関連付けられた信頼ポリシーを定義します。

YAMLJSON
YAML
StatesExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: StatesExecutionPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "lambda:InvokeFunction" Resource: "*"
JSON
"StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::Sub": "states.${AWS::Region}.amazonaws.com" } ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "StatesExecutionPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } ] } } ] } },

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

Lambda ステートマシンを定義します。

YAMLJSON
YAML
MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World AWL example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
JSON
"MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World AWL example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } }

ステップ 2: AWS CloudFormation テンプレートを使用して Lambda ステートマシンを作成する

AWS CloudFormation テンプレートのさまざまな部分を理解した後、それらをひとつにまとめてテンプレートを使用し AWS CloudFormation スタックを作成できます。

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

  1. 以下のサンプルデータを YAML 例の MyStateMachine.yaml、あるいは JSON の MyStateMachine.json という名前のファイルにコピーします。

    YAMLJSON
    YAML
    AWSTemplateFormatVersion: "2010-09-09" Description: "An example template with an IAM role for a Lambda state machine." Resources: LambdaExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Principal: Service: lambda.amazonaws.com Action: "sts:AssumeRole" MyLambdaFunction: Type: "AWS::Lambda::Function" Properties: Handler: "index.handler" Role: !GetAtt [ LambdaExecutionRole, Arn ] Code: ZipFile: | exports.handler = (event, context, callback) => { callback(null, "Hello World!"); }; Runtime: "nodejs4.3" Timeout: "25" StatesExecutionRole: Type: "AWS::IAM::Role" Properties: AssumeRolePolicyDocument: Version: "2012-10-17" Statement: - Effect: "Allow" Principal: Service: - !Sub states.${AWS::Region}.amazonaws.com Action: "sts:AssumeRole" Path: "/" Policies: - PolicyName: StatesExecutionPolicy PolicyDocument: Version: "2012-10-17" Statement: - Effect: Allow Action: - "lambda:InvokeFunction" Resource: "*" MyStateMachine: Type: "AWS::StepFunctions::StateMachine" Properties: DefinitionString: !Sub - |- { "Comment": "A Hello World AWL example using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "${lambdaArn}", "End": true } } } - {lambdaArn: !GetAtt [ MyLambdaFunction, Arn ]} RoleArn: !GetAtt [ StatesExecutionRole, Arn ]
    JSON
    { "AWSTemplateFormatVersion": "2010-09-09", "Description": "An example template with an IAM role for a Lambda state machine.", "Resources": { "LambdaExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": "lambda.amazonaws.com" }, "Action": "sts:AssumeRole" } ] } } }, "MyLambdaFunction": { "Type": "AWS::Lambda::Function", "Properties": { "Handler": "index.handler", "Role": { "Fn::GetAtt": [ "LambdaExecutionRole", "Arn" ] }, "Code": { "ZipFile": "exports.handler = (event, context, callback) => {\n callback(null, \"Hello World!\");\n};\n" }, "Runtime": "nodejs4.3", "Timeout": "25" } }, "StatesExecutionRole": { "Type": "AWS::IAM::Role", "Properties": { "AssumeRolePolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Service": [ { "Fn::Sub": "states.${AWS::Region}.amazonaws.com" } ] }, "Action": "sts:AssumeRole" } ] }, "Path": "/", "Policies": [ { "PolicyName": "StatesExecutionPolicy", "PolicyDocument": { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "lambda:InvokeFunction" ], "Resource": "*" } ] } } ] } }, "MyStateMachine": { "Type": "AWS::StepFunctions::StateMachine", "Properties": { "DefinitionString": { "Fn::Sub": [ "{\n \"Comment\": \"A Hello World AWL example using an AWS Lambda function\",\n \"StartAt\": \"HelloWorld\",\n \"States\": {\n \"HelloWorld\": {\n \"Type\": \"Task\",\n \"Resource\": \"${lambdaArn}\",\n \"End\": true\n }\n }\n}", { "lambdaArn": { "Fn::GetAtt": [ "MyLambdaFunction", "Arn" ] } } ] }, "RoleArn": { "Fn::GetAtt": [ "StatesExecutionRole", "Arn" ] } } } } }
  2. AWS CloudFormation コンソールにログインして、[Create Stack] を選択します。

  3. [Select Template] ページで、[Upload a template to Amazon S3] を選択します。MyStateMachine ファイルを選択し、[Next] を選択します。

  4. [Specify Details] ページで、[Stack name] に MyStateMachine を入力してから、[Next] を選択します。

  5. [Options] ページで、[Next] を選択します。

  6. [Review] ページで、[I acknowledge that AWS CloudFormation might create IAM resources.] を選択し、[Create] を選択します。

    AWS CloudFormation は MyStateMachine スタックの作成を開始し、[CREATE_IN_PROGRESS] のステータスが表示されます。プロセスが完了すると、AWS CloudFormation に [CREATE_COMPLETE] ステータスが表示されます。

  7. (省略可能) スタックのリソースを表示するには、スタックを選択して [Resources] タブを選択します。

    リソースの表示

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

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

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

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

  2. [MyStateMachine-ABCDEFGHIJ1K] ページで、[New execution] を選択します。

    [New execution] ページが表示されます。

  3. (オプション) 実行を特定できるように、[Enter an execution name] (実行名を入力) ボックスでその ID を指定できます。ID を入力しない場合、Step Functions は自動的に一意の ID を生成します。

    注記

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

  4. [Start Execution] を選択します。

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

  5. (省略可能) [Execution Details] セクションで、[Info] タブを選択して [Execution Status] および [Started] と [Closed] のタイムスタンプを確認します。

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