AWS Step Functions
開発者ガイド

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

このチュートリアルでは、AWS CloudFormation を使用して基本的な AWS Lambda 関数を作成する方法を示します。スタック (IAM ロール、Lambda 関数、およびステートマシン) の作成には AWS CloudFormation コンソールおよび YAML テンプレートを使用します。その後、AWS Step Functions コンソールを使用してステートマシンの実行を開始します。

詳細については、AWS CloudFormation ユーザーガイドの「CloudFormation テンプレートの使用」と「AWS::StepFunctions::StateMachine リソース」を参照してください。

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

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

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 アカウントと 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: "nodejs8.10" 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": "nodejs8.10", "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 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 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: "nodejs8.10" 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 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": "nodejs8.10", "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 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 コンソールを開き、[スタックの作成] を選択します。

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

  4. [Specify Details (詳細の指定)] ページで、[Stack name (スタック名)] に MyStateMachine を入力してから、[Next (次へ)] を選択します。

  5. [オプション] ページで、[次へ] を選択します。

  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 (実行の詳細)] で、[実行ステータス] および [Started (開始)] と [Closed (終了)] のタイムスタンプを確認します。

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