AWS Step Functions
開発者ガイド

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

このチュートリアルでは、AWS Lambda 関数を使用して Task 状態を実装する AWS Step Functions ステートマシンを作成します。Task ステートは 1 単位の作業を実行します。

Lambda は Task 状態の実装に最適です。Lambda 関数はステートレス (入力と出力の関係が決まっている) であり、作成が簡単でサーバーインスタンスにコードをデプロイする必要がないためです。AWS マネジメントコンソール や使い慣れたエディタでコードを作成できます。関数用のコンピューティング環境を提供して実行する細かい部分は AWS が処理します。

ステップ 1: Lambda 用の IAM ロールを作成する

AWS Lambda と AWS Step Functions のいずれも、コードを実行して AWS リソース (Amazon S3 バケットに保存されているデータなど) にアクセスできます。セキュリティを維持するために、これらのリソースへのアクセスを Lambda および Step Functions に付与する必要があります。

Lambda では、Lambda 関数を作成する際に AWS Identity and Access Management (IAM) ロールを割り当てる必要があります。これは、ステートマシンを作成する際に Step Functions に IAM ロールを割り当てる必要があるのと同じ方法です。

IAM コンソールを使用して、サービスにリンクされたロールを作成できます。

ロールを作成するには (コンソール)

  1. AWS マネジメントコンソール にサインインし、IAM コンソール(https://console.aws.amazon.com/iam/)を開きます。

  2. IAM コンソールの [Navigation] ペインで [Roles] を選択します。続いて、[Create role] を選択します。

  3. [AWS サービス] ロールタイプを選択し、続いて [Lambda] を選択します。

  4. [Lambda] ユースケースを選択します。ユースケースは、サービスに必要な信頼ポリシーを含めるように定義されています。続いて、[Next: Permissions] を選択します。

  5. ロールにアタッチするアクセス許可ポリシーを 1 つ以上選択します (例: AWSLambdaBasicExecutionRole)。「AWS Lambda アクセス許可モデル」を参照してください。

    ロールに許可するアクセス許可を割り当てるポリシーの横にあるボックスを選択し、[Next: Review] をクリックします。

  6. [Role name] に入力します。

  7. (オプション) [Role description] で、サービスにリンクされた新しいロールの説明を編集します。

  8. ロールを確認し、[ロールの作成] を選択します。

ステップ 2: Lambda 関数を作成する

使用する Lambda 関数は入力 (名前) を受信し、入力値を含めた挨拶を返します。

重要

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

  1. Lambda コンソールを開き、[Create a function (Lambda 関数の作成)] を選択します。

  2. [Blueprints] セクションで、[Author from scratch] を選択します。

  3. [基本的な情報] セクションで、Lambda 関数を設定します。

    1. [Function name (関数名)] に「HelloFunction」と入力します。

    2. [Runtime (ランタイム)] で、[Node.js 6.10] を選択します。

    3. [Role (ロール)] で、[既存のロールを選択] を選択します。

    4. [Existing role] で、前に作成した Lambda ロールを選択します。

      注記

      作成した IAM ロールがリストに表示されない場合は、そのロールが Lambda に伝達されるまであと数分かかる場合があります。

    5. [Create function] を選択します。

      Lambda 関数が作成されたら、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。例:

      arn:aws:lambda:us-east-1:123456789012:function:HelloFunction
  4. Lambda 関数の以下のコードを [HelloFunction] ページの [関数コード] セクションにコピーします。

    exports.handler = (event, context, callback) => { callback(null, "Hello, " + event.who + "!"); };

    このコードは、関数に渡された event オブジェクトから提供された入力データの who フィールドを使用して、挨拶をアセンブルします。後で新しい実行を開始するときに、この関数の入力データを追加します。callback メソッドによって、関数からアセンブルされた挨拶が返されます。

  5. [Save] を選択します。

ステップ 3: Lambda 関数をテストする

Lambda 関数をテストしてオペレーションを確認します。

  1. [Select a test events (テストイベントの選択)] で [Configure test event (テストイベントの設定)] を選択します。[イベント名] で、「HelloFunction」と入力します。

  2. データ例を以下に置き換えます。

    { "who": "AWS Step Functions" }

    "who" エントリは Lambda 関数の event.who フィールドに対応し、挨拶を完了させます。関数を Step Functions タスクとして実行するときも同じ入力データを使用します。

  3. [作成] を選択します。

  4. [HelloFunction] ページで、新しいデータを使用して Lambda 関数の [Test] を実行します。

    テストの結果がページの上部に表示されます。[詳細] を展開して出力を表示します。

ステップ 4: ステートマシンを作成する

Step Functions コンソールを使用して、ステートが Task であるステートマシンを作成します。Task ステートに Lambda 関数への参照を追加します。ステートマシンの実行が Task ステートに達すると、Lambda 関数が呼び出されます。

  1. Step Functions コンソールを開き、[Create a state machine (ステートマシンの作成)] を選択します。

  2. [Define state machine (ステートマシンの定義)] ページで、[Author with code snippets (コードスニペットで作成)] を選択します。[Name for your state machine (ステートマシンの名前)] に、たとえば「LambdaStateMachine」と入力します。

    注記

    ステートマシン、実行、およびアクティビティ名の長さは 1~80 文字で、アカウントと AWS リージョンに対して一意である必要があります。また、次の文字を含めることはできません。

    • 空白

    • ワイルドカード文字 (? *)

    • 括弧 (< > { } [ ])

    • 特殊文字 (: ; , \ | ^ ~ $ # % & ` ")

    • 制御文字 (\\u0000 - \\u001f or \\u007f - \\u009f)

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

  3. [State machine definition] ペインで、前に作成した Lambda 関数の ARN を使用して以下のステートマシンの定義を追加します。次に例を示します。

    { "Comment": "A Hello World example of the Amazon States Language using an AWS Lambda function", "StartAt": "HelloWorld", "States": { "HelloWorld": { "Type": "Task", "Resource": "arn:aws:lambda:us-east-1:123456789012:function:HelloFunction", "End": true } } }

    これは、Amazon ステートメント言語 を使用したステートマシンの説明です。HelloWorld という名前の単一の Task 状態を定義します。詳細については、「State Machine Structure」を参照してください。

    注記

    Task 状態の Retry を設定することもできます。ベストプラクティスとして、本番稼働用コードが Lambda サービス例外 (Lambda.ServiceException および Lambda.SdkclientException) を処理できることを確認します。詳細については、以下を参照してください。

    [次へ] を選択します。

  4. IAM ロールを作成または入力します。

    • Step Functions の IAM ロールを作成するには、[自分用の IAM ロールを作成する] を選択し、[名前] にロール名を入力します。

    • ステートマシンの正しいアクセス許可を使用して IAM ロールをすでに作成済みである場合は、[Choose an existing IAM role (既存の IAM ロールを選択する)] を選択します。リストから ロールを選択するか、ロールの ARN を指定します。

    注記

    Step Functions によって作成された IAM ロールを削除すると、Step Functions で後で再作成することはできません。同様に、ロールを変更すると (たとえば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。

  5. [Next (次へ)] を選択します。

ステップ 5: 新しい実行を開始する

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

  1. [LambdaStateMachine] ページで、[Start execution] (実行の開始) を選択します。

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

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

    注記

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

  3. 実行入力領域で、サンプルデータを以下で置き換えます。

    { "who" : "AWS Step Functions" }

    "who" は Lambda 関数が挨拶する相手の名前を取得するために使用するキー名です。

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

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

  5. 実行結果を表示するには、[実行の詳細] の [出力] セクションを展開します。