サーバーレスワークフローを作成する

AWS Step Functions と AWS Lambda を使用した場合

このチュートリアルでは、AWS Step Functions を使用し、複数の AWS Lambda 関数を連携させたサーバーレスワークフローを設計して実行する方法を学習します。AWS Lambda は、サーバーのプロビジョニングや管理を行うことなく、コードを実行できるコンピューティングサービスです。

この例では、開発者として、コールセンターのサポートチケットの処理を自動化するサーバーレスアプリケーションの作成を依頼された場合を想定しています。Lambda 関数を使って別の Lambda 関数を呼び出すこともできますが、コールセンターアプリケーションの高機能化が進む中で、こうした関数すべての接続の管理が課題になることが懸念されます。さらに、アプリケーションのフローのわずかな変更のために複数の箇所の変更が必要になり、同じコードを何度も書き直すことになってしまいます。

この課題を解決するため、AWS Step Functions を使用することにしました。Step Functions はサーバーレスオーケストレーションサービスで、複数の Lambda 関数を連携させ、デバッグや変更を簡単に行える柔軟なワークフローを作成できます。Step Functions では、アプリケーションの各ステップのトリガーと追跡が行われるため、Lambda 関数にロジックを追加せずにすみます。

これから 10 分間で、現在のコールセンターにおけるプロセスを記述した Step Functions ステートマシンを作成し、サポートチームのタスクを模擬したシンプルな Lambda 関数をいくつか作成し、各 Lambda 関数間でデータを受け渡ししてサポートケースの進行状況を追跡します。その後、ワークフローのテストを数回実行し、さまざまな入力にどのように応答するかを観察します。最後に、チュートリアルで使用した AWS リソースを削除します。

このチュートリアルでは、AWS Step FunctionsAWS Lambda を使用します。これらのサービスは AWS 無料利用枠に含まれています。

このチュートリアルには AWS アカウントが必要です

Step Functions と Lambda に対する追加料金は発生しません。このチュートリアルで作成するリソースは無料利用枠の対象です。 

無料利用枠の詳細 >>


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

最初のステップは、コールセンターでサポートチケットが処理される仕組みを記述したワークフローを設計することです。ワークフローでは、1 つのプロセスを、一連の独立タスクとして記述します。そうしたタスクは何度も繰り返し発生します。

コールセンターのマネージャーと、サポートケースを処理するうえでのベストプラクティスについて十分に話し合います。Step Functions のわかりやすいビジュアルワークフローを参照しながら、マネージャーと一緒にワークフローを定義します。


a.  [AWS マネジメントコンソール] を開きます。この作業手順ガイドは開いたままにしておいてください。画面が読み込まれたら、ユーザー名とパスワードを入力して作業を開始します。次に、検索バーに「Step」と入力し、[Step Functions] を選択してサービスコンソールを開きます。

01a
01a

(クリックして拡大)


b.  [ステートマシンの作成] をクリックします。

01b
01b

(クリックして拡大)


c.[一から作成] を選択してから、ステートマシンに「CallCenterStateMachine」と名前を付け、[IAM ロール ARN を指定する] を選択します。

01c
01c

(クリックして拡大)


ステップ 2:AWS Identity and Access Management (IAM) ロールを作成する

AWS IAM は、AWS リソースへのアクセスを安全に制御するためのウェブサービスです。このステップでは、Step Functions から Lambda へのアクセスを許可する IAM ロールを作成します。


a.別のブラウザウィンドウで AWS マネジメントコンソールを開きます。画面が読み込まれたら、検索バーに「IAM」と入力し、[IAM] を選択してサービスコンソールを開きます。

02a
02a

(クリックして拡大)


b.[ロール] をクリックしてから、[ロールの作成] をクリックします。

02b
02b

(クリックして拡大)


c.[ロールの作成] 画面で、[AWS サービス] を選択した状態のままで [Step Functions] を選択し、さらに [次のステップ: アクセス権限] をクリックします。次の画面で、[次のステップ: 確認] をクリックします。

02c
02c

(クリックして拡大)


d.[ロール名] に「step_functions_basic_execution」と入力してから、[ロールの作成] を選択します。次の画面で、[次のステップ: 確認] をクリックします。

02d
02d

(クリックして拡大)


e.ロールが作成され、リストに表示されています。ロール名を選択して確認します。 

02e
02e

(クリックして拡大)


f.次の画面で [ロール ARN] をコピーします。

02f
02f

(クリックして拡大)


ステップ 3:サーバーレスワークフローを設計する

次に、AWS Step Functions でワークフローを設計します。このワークフローでは、AWS Lambda 関数 1 つを呼び出してサポートケースを作成し、さらに別の関数を呼び出してケースを解決するサポート担当者に割り当てる、といったことを行います。また、Lambda 関数間でのデータの受け渡しを実行し、サポートケースの進行状況を追跡します。


a.Step Functions コンソールに戻り、先ほどコピーした ARN を [IAM ロール ARN] に貼り付けます。

03a
03a

(クリックして拡大)


b. [ステートマシンの定義] ウィンドウの内容を、Amazon ステートメント言語 (ASL) で作成された以下のステートマシン定義に置き換えます。Amazon ステートメント言語は JSON ベースの構造化言語で、ステートマシンの定義に使用します。

このステートマシンでは、サポートケースのオープン、割り当て、対応のために一連の Task 状態が使用されます。その後、Choice 状態を使用してケースをクローズしてよいかどうかが判断されます。さらに 2 つの Task 状態により、サポートケースのクローズまたはエスカレーションのうち適切な方が実行されます。

 

{
  "Comment": "A simple AWS Step Functions state machine that automates a call center support session.",
  "StartAt": "Open Case",
  "States": {
    "Open Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Assign Case"
    }, 
    "Assign Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Work on Case"
    },
    "Work on Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Is Case Resolved"
    },
    "Is Case Resolved": {
        "Type" : "Choice",
        "Choices": [ 
          {
            "Variable": "$.Status",
            "NumericEquals": 1,
            "Next": "Close Case"
          },
          {
            "Variable": "$.Status",
            "NumericEquals": 0,
            "Next": "Escalate Case"
          }
      ]
    },
     "Close Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "End": true
    },
    "Escalate Case": {
      "Type": "Task",
      "Resource": "arn:aws:lambda:REGION:ACCOUNT_ID:function:FUNCTION_NAME",
      "Next": "Fail"
    },
    "Fail": {
      "Type": "Fail",
      "Cause": "Engage Tier 2 Support."    }   
  }
}
03b
03b

(クリックして拡大)


c.更新ボタンをクリックし、Step Functions に、AWS ステートマシン定義をビジュアルワークフローへと変換させます。このシナリオでは、コールセンターのマネージャーと一緒にビジュアルワークフローを確認することで、プロセスが正しく記述されたかどうかを簡単に検証できます。[ステートマシンの作成] をクリックします。ステートマシンが正常に作成されたことを示す緑色のメッセージが画面上部に表示されます。

03c
03c

(クリックして拡大)


ステップ 4:独自の AWS Lambda 関数を作成する

独自のステートマシンの作成後は、ステートマシンによってタスクが実行される仕組みを決定します。ステートマシンを、環境内の既存の、または新たに作成した AWS Lambda 関数やマイクロサービスに接続できます。このチュートリアルでは、ケースのカスタマーサポート担当者への割り当てなど、サポートコール処理のさまざまなステップを模擬した、シンプルな Lambda 関数をいくつか作成します。


a.[サービス] をクリックし、検索バーに「Lambda」と入力してから、[Lambda] を選択してサービスコンソールを開きます。

04a
04a

(クリックして拡大)


b.[関数の作成] を選択します。

04b
04b

(クリックして拡大)


c.[一から作成] が選択された状態のままにしておきます。次に、初めての Lambda 関数を以下のように設定します。

[名前] に「OpenCaseFunction」と入力します。
[ランタイム] で [Node.js 4.3] を選択します。
[ロール] では [カスタムロールの作成] を選択します。

新しい IAM ウィンドウが開きます。[ロール名] を「lambda_basic_execution 」にしたままで、[許可] をクリックします。

Lambda コンソールが自動的に再度表示されます。[関数の作成] をクリックします。

04c
04c

(クリックして拡大)


d.[関数コード] ウィンドウの内容を以下のコードに置き換えてから、[保存] をクリックします。

exports.handler = (event, context, callback) => {
    // Create a support case using the input as the case ID, then return a confirmation message   
   var myCaseID = event.inputCaseID;
   var myMessage = "Case " + myCaseID + ": opened...";   
   var result = {Case: myCaseID, Message: myMessage};
   callback(null, result);    
};
04d
04d

(クリックして拡大)


e.ページ上部で [関数] をクリックします。

04e
04e

(クリックして拡大)


f.ステップ 4b~4d を繰り返し、ステップ 4c で作成した IAM ロール lambda_basic_execution を使用して Lambda 関数をさらに 4 つ作成します。

AssignCaseFunction の定義内容:

exports.handler = (event, context, callback) => {    
    // Assign the support case and update the status message    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "assigned...";    
    var result = {Case: myCaseID, Message: myMessage};
    callback(null, result);        
};

WorkOnCaseFunction の定義内容:

exports.handler = (event, context, callback) => {    
    // Generate a random number to determine whether the support case has been resolved, then return that value along with the updated message.
    var min = 0;
    var max = 1;    
    var myCaseStatus = Math.floor(Math.random() * (max - min + 1)) + min;
    var myCaseID = event.Case;
    var myMessage = event.Message;
    if (myCaseStatus == 1) {
        // Support case has been resolved    
        myMessage = myMessage + "resolved...";
    } else if (myCaseStatus == 0) {
        // Support case is still open
        myMessage = myMessage + "unresolved...";
    } 
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result); 
};

CloseCaseFunction の定義内容:

exports.handler = (event, context, callback) => { 
    // Close the support case    
    var myCaseStatus = event.Status;    
    var myCaseID = event.Case;    
    var myMessage = event.Message + "closed.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

EscalateCaseFunction の定義内容:

exports.handler = (event, context, callback) => {    
    // Escalate the support case 
    var myCaseID = event.Case;    
    var myCaseStatus = event.Status;    
    var myMessage = event.Message + "escalating.";    
    var result = {Case: myCaseID, Status : myCaseStatus, Message: myMessage};
    callback(null, result);
};

完了すると、合計 5 つの Lambda 関数が存在しているはずです。

04f
04f

(クリックして拡大)


ステップ 5:ワークフローを挿入する

次のステップとして、Step Functions のタスク状態に今作成した Lambda 関数を挿入していきます。


a.[サービス] をクリックし、検索バーに「Step」と入力してから、[Step Functions] を選択してサービスコンソールを開きます。

05a
05a

(クリックして拡大)


b.[ステートマシン] 画面で [CallCenterStateMachine] を選択し、[編集] をクリックします。

05b
05b

(クリックして拡大)


c.[ステートマシンの定義] セクションで、"Open Case" 状態の下にある "Resource" で始まる行を見つけ、ARN を OpenCaseFunction の ARN に置き換えます。サンプル ARN をクリックすると、アカウント内にある AWS Lambda 関数のリストが表示され、そこから選択できます。

05c
05c

(クリックして拡大)


d.ステートマシンの Assign CaseWork on CaseClose CaseEscalate Case の各タスク状態について、1 つ前のステップを繰り返して Lambda 関数の ARN を更新します。それから [保存] をクリックします。

05d
05d

(クリックして拡大)


ステップ 6:ワークフローを実行する

サーバーレスワークフローを実行する準備が整いました。 ステートマシンの実行はワークフローのインスタンスであり、Step Function ステートマシンの実行ごとに発生し、タスクが実行されます。それぞれの Step Functions ステートマシンは同時に複数実行できます。ステートマシンの実行は、Step Functions コンソールから開始するか (この後実行します)、AWS SDK、Step Functions API アクション、AWS CLI を使用して行います。ステートマシンの実行では、JSON 入力を渡すと、JSON 出力が生成されます。


a.[実行の開始] をクリックします。

06a
06a

(クリックして拡大)


b.[新しい実行] ダイアログボックスが表示され、ステートマシンへの入力内容を指定できます。サポートケースに ID を指定するために、[新しい実行] ウィンドウ内の [入力] ウィンドウに以下の内容を入力し、それから [実行の開始] を選択します。

{
"inputCaseID": "001"
}
06b
06b

(クリックして拡大)


c.ワークフローの実行中、[ビジュアルワークフロー] ペインの各ステップの色が変わります。実行が完了するまで数秒待ちます。その後、[実行の詳細] ペインで [] と [出力] をクリックし、ワークフローの入力内容と結果を表示します。

06c
06c

(クリックして拡大)


d.Step Functions では、それぞれの状態の入力と出力を含め、実行したワークフローの各ステップを検査できます。ワークフローの各タスクをクリックし、[ステップの詳細] の下にある [入力] と [出力] フィールドを展開します。ステートマシンに入力したケース ID が各ステップから次のステップに受け渡されていること、それぞれの Lambda 関数が動作を完了するたびにメッセージが更新されていることがわかります。

06d
06d

(クリックして拡大)


e.[実行イベント履歴] セクションまで下にスクロールします。実行された各ステップをクリックしながら、Step Function によってどのように Lambda 関数が呼び出され、データが関数間で受け渡されているかを確認します。

06e
06e

(クリックして拡大)


f.このワークフローは、WorkOnCaseFunction の出力内容に応じて、サポートケースの解決とチケットのクローズ、または上のサポート階層へのチケットエスカレーションという結果で終了します。この実行をさらに数回行い、さまざまな動作を観察できます。この画像では、ワークフローの実行の結果、サポートケースがエスカレーションされてワークフローが Fail 状態で終了しています。

実際のシナリオでは、ワークフローを中止する代わりに、解決されるまでケースへの対応を継続するよう決定する場合もあります。そのためには、ステートマシンで Fail 状態を削除し、Escalate Case タスクを編集して Work On Case 状態にループバックするようにします。Lambda 関数を変更する必要はありません。このチュートリアルで作成した関数は単なるサンプルであるため、チュートリアルを次のステップに進めます。

06f
06f

(クリックして拡大)


ステップ 7:リソースを終了する

このステップでは、AWS Step Functions と AWS Lambda の関連リソースを終了します。

重要: あまり使用されていないリソースを終了することは、コストを削減するためのベストプラクティスです。リソースを終了しないと、料金が発生する場合があります。


a.AWS Step Functions コンソールウィンドウの上部で [ステートマシン] をクリックします。

07a
07a

(クリックして拡大)


b.[ステートマシン] ウィンドウで [CallCenterStateMachine] をクリックし、[削除] をクリックします。ダイアログボックスで [ステートマシンの削除] を選択し、アクションを承認します。処理中の実行がすべて完了したことが Step Functions により確認されると、1~2 分でステートマシンが削除されます。

07b
07b

(クリックして拡大)


c.次に、Lambda 関数を削除します。AWS マネジメントコンソールのメニューで [サービス] をクリックしてから、[Lambda] を選択します。

07c
07c

(クリックして拡大)


d.[関数] 画面で、このチュートリアル用に作成した関数をそれぞれクリックし、[アクション]、[削除] の順に選択します。もう一度 [削除] をクリックして削除を承認します。

07d
07d

(クリックして拡大)


e.最後に、IAM ロールを削除します。AWS マネジメントコンソールのメニューで [サービス] をクリックしてから、[IAM] を選択します。

07e
07e

(クリックして拡大)


f.このチュートリアル用に作成した IAM ロールを両方とも選択し、[ロールの削除] をクリックします。ダイアログボックスで [はい、削除します] をクリックして削除を承認します。


これで、AWS マネジメントコンソールからサインアウトすることができます。

07f
07f

(クリックして拡大)


おめでとうございます。

よくできました。 複数の AWS Lambda 関数をトリガーする AWS Step Functions を使って、サーバーレスワークフローを作成しました。ワークフローでは、自分で定義したロジックに従ってすべての関数が連携し、データがある状態から別の状態へと受け渡されました。それぞれの関数にコードを作成する必要はありませんでした。

サーバーレスワークフローの設計と実行の方法を理解できたため、次のチュートリアルに進み、Step Functions を使った Lambda 関数エラーの処理方法を学習できます。Retry および Catch フィールドを使用してステートマシンを作成します。これは、エラーメッセージタイプに基づいてモック API からの応答コードに対応する、関数エラー処理と呼ばれるメソッドです。