サーバーレスワークフローを作成する
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 Functions と AWS Lambda を使用します。これらのサービスは AWS 無料利用枠に含まれています。
このチュートリアルには AWS アカウントが必要です
Step Functions と Lambda に対する追加料金は発生しません。このチュートリアルで作成するリソースは無料利用枠の対象です。
ステップ 1:ステートマシンとサーバーレスワークフローを作成する
最初のステップは、コールセンターでサポートチケットが処理される仕組みを記述したワークフローを設計することです。ワークフローでは、1 つのプロセスを、一連の独立タスクとして記述します。そうしたタスクは何度も繰り返し発生します。
コールセンターのマネージャーと、サポートケースを処理するうえでのベストプラクティスについて十分に話し合います。Step Functions のわかりやすいビジュアルワークフローを参照しながら、マネージャーと一緒にワークフローを定義します。
その後に、AWS Step Functions でワークフローを設計します。このワークフローでは、AWS Lambda 関数 1 つを呼び出してサポートケースを作成し、さらに別の関数を呼び出してケースを解決するサポート担当者に割り当てる、といったことを行います。また、Lambda 関数間でのデータの受け渡しを実行し、サポートケースの進行状況を追跡します。
a.AWS Step Functions コンソールを開きます。[Author with code snippets] を選択します。[名前] テキストボックスに、「CallCenterStateMachine」と入力します。
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." }
}
}
ステップ 2:AWS Identity and Access Management (IAM) ロールを作成する
AWS IAM は、AWS リソースへのアクセスを安全に制御するためのウェブサービスです。このステップでは、Step Functions から Lambda へのアクセスを許可する IAM ロールを作成します。
a.別のブラウザウィンドウで AWS マネジメントコンソールを開きます。画面が読み込まれたら、検索バーに「IAM」と入力し、[IAM] を選択してサービスコンソールを開きます。
ステップ 3:ステートマシンに IAM ロールを追加する
次に、作成した IAM ロールの ARN を AWS Step Functions のステートマシンに追加します。
ステップ 4:独自の AWS Lambda 関数を作成する
独自のステートマシンの作成後は、ステートマシンによってタスクが実行される仕組みを決定します。ステートマシンを、環境内の既存の、または新たに作成した AWS Lambda 関数やマイクロサービスに接続できます。このチュートリアルでは、ケースのカスタマーサポート担当者への割り当てなど、サポートコール処理のさまざまなステップを模擬した、シンプルな Lambda 関数をいくつか作成します。
g.[関数コード] ウィンドウの内容を以下のコードに置き換えてから、[保存] をクリックします。
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);
};
i.ステップ 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 関数が存在しているはずです。
ステップ 5:ワークフローを挿入する
次のステップとして、Step Functions のタスク状態に今作成した Lambda 関数を挿入していきます。
ステップ 6:ワークフローを実行する
サーバーレスワークフローを実行する準備が整いました。ステートマシンの実行はワークフローのインスタンスであり、Step Function ステートマシンの実行ごとに発生し、タスクが実行されます。それぞれの Step Functions ステートマシンは同時に複数実行できます。ステートマシンの実行は、Step Functions コンソールから開始するか (この後実行します)、AWS SDK、Step Functions API アクション、AWS CLI を使用して行います。ステートマシンの実行では、JSON 入力を渡すと、JSON 出力が生成されます。
f.このワークフローは、WorkOnCaseFunction の出力内容に応じて、サポートケースの解決とチケットのクローズ、または上のサポート階層へのチケットエスカレーションという結果で終了します。この実行をさらに数回行い、さまざまな動作を観察できます。この画像では、ワークフローの実行の結果、サポートケースがエスカレーションされてワークフローが Fail 状態で終了しています。
実際のシナリオでは、ワークフローを中止する代わりに、解決されるまでケースへの対応を継続するよう決定する場合もあります。そのためには、ステートマシンで Fail 状態を削除し、Escalate Case タスクを編集して Work On Case 状態にループバックするようにします。Lambda 関数を変更する必要はありません。このチュートリアルで作成した関数は単なるサンプルであるため、チュートリアルを次のステップに進めます。
ステップ 7:リソースを終了する
このステップでは、AWS Step Functions と AWS Lambda の関連リソースを終了します。
重要: あまり使用されていないリソースを終了することは、コストを削減するためのベストプラクティスです。リソースを終了しないと、料金が発生する場合があります。
おめでとうございます。
よくできました。 複数の AWS Lambda 関数をトリガーする AWS Step Functions を使って、サーバーレスワークフローを作成しました。ワークフローでは、自分で定義したロジックに従ってすべての関数が連携し、データがある状態から別の状態へと受け渡されました。それぞれの関数にコードを作成する必要はありませんでした。
サーバーレスワークフローの設計と実行の方法を理解できたため、次のチュートリアルに進み、Step Functions を使った Lambda 関数エラーの処理方法を学習できます。Retry および Catch フィールドを使用してステートマシンを作成します。これは、エラーメッセージタイプに基づいてモック API からの応答コードに対応する、関数エラー処理と呼ばれるメソッドです。