Step Functions で X-Ray によるトレースを表示する
このチュートリアルでは、X-Ray を使用してステートマシンの実行時に発生するエラーを追跡する方法について説明します。AWS X-Ray を使用して、ステートマシンのコンポーネントの視覚化、パフォーマンスのボトルネックの特定、およびエラーの原因となったリクエストのトラブルシューティングを行うことができます。このチュートリアルでは、ランダムにエラーを生成する Lambda 関数をいくつか作成し、X-Ray を使用してトレースおよび分析します。
Lambda を使用する Step Functions ステートマシン状態の作成 チュートリアルでは、 Lambda関数を呼び出すステートマシンを作成する手順について説明します。このチュートリアルを完了済みである場合は、[Step 2] (ステップ 2) に進み、前に作成したAWS Identity and Access Management (IAM) ロールを使用してください。
ステップ 1: Lambda 用に IAM ロールを作成する
AWS Lambda と AWS Step Functions はどちらもコードを実行して AWS リソース (Amazon S3 バケットに保存されているデータなど) にアクセスできます。セキュリティを維持するために、Lambda および Step Functions にこれらのリソースへのアクセスを付与する必要があります。
Lambda 関数を作成する際に AWS Identity and Access Management (IAM) ロールを割り当てる必要があります。これは、ステートマシンを作成する際に Step Functions から、IAM ロールの割り当てを求められるのと同じ方法です。
IAM コンソールを使用して、サービスにリンクされたロールを作成できます。
ロールを作成するには (コンソール)
AWS マネジメントコンソール にサインインして、IAM コンソール (https://console.aws.amazon.com/iam/
) を開きます。 -
IAM コンソールのナビゲーションペインで [Roles] (ロール) を選択します。次に、[Create role] (ロールの作成) を選択します。
-
[AWS のサービス] ロールタイプを選択してから、Lambda を選択します。
-
ユースケースに [Lambda] を選択します。ユースケースは、サービスに必要な信頼ポリシーを含めるように定義されています。次に、[Next: Permissions] (次へ: 許可) を選択します。
-
ロールにアタッチするアクセス許可ポリシーを 1 つ以上選択します (例:
AWSLambdaBasicExecutionRole)。AWS Lambda アクセス許可モデルを参照してください。ロールに許可するアクセス許可を割り当てるポリシーの横にあるボックスを選択し、[Next: Review] (次へ: レビュー) をクリックします。
-
[Role name] (ロール名) に入力します。
-
(オプション) [Role description] (ロールの説明) で、サービスにリンクされた新しいロールの説明を編集します。
-
ロールを確認し、[Create role] (ロールの作成) を選択します。
ステップ 2: Lambda 関数を作成する
Lambda 関数はエラーまたはタイムアウトをランダムにスローし、X-Ray で表示するサンプルデータを生成します。
重要
Lambda 関数がステートマシンと同じ AWS アカウントと AWS リージョンの下にあることを確認します。
-
Lambda コンソール
を開き、[関数を作成] を選択します。 -
[Create function] (関数の作成) セクションで、[Author from scratch] (一から作成) を選択します。
-
[Basic information] (ベーシックな情報) セクションで、Lambda 関数を構成:
-
[関数名] に
TestFunction1と入力します。 -
[ランタイム] で [Node.js 18.x] を選択します。
-
[Role] (ロール) で、[Choose an existing role] (既存のロールを選択) を選択します。
-
[既存のロール] で、前に作成した Lambda ロールを選択します。
注記
作成した IAM ロールがリストに表示されない場合は、そのロールが Lambda に伝達されるまであと数分かかる場合があります。
-
[関数の作成] を選択します。
Lambda 関数が作成されたら、ページの右上隅に表示されているその Amazon リソースネーム (ARN) を記録します。例:
arn:aws:lambda:region:123456789012:function:TestFunction1
-
-
Lambda 関数の以下のコードを
[TestFunction1]ページの [関数コード] セクションにコピーします。function getRandomSeconds(max) { return Math.floor(Math.random() * Math.floor(max)) * 1000; } function sleep(ms) { return new Promise(resolve => setTimeout(resolve, ms)); } export const handler = async (event) => { if(getRandomSeconds(4) === 0) { throw new Error("Something went wrong!"); } let wait_time = getRandomSeconds(5); await sleep(wait_time); return { 'response': true } };このコードは、時間切れの障害をランダムに作成します。これは、X-Ray トレースを使用して表示および分析できるステートマシンでエラーの例を生成するために使用されます。
-
[保存] を選択します。
ステップ 3: さらに 2 つの Lambda 関数を作成する
さらに 2 つの Lambda 関数を作成します。
-
ステップ 2 を繰り返して、さらに 2 つの Lambda 関数を作成します。次の関数については、[Function name] (関数名) に
TestFunction2を入力します。最後の関数については、[Function name] (関数名) にTestFunction3を入力します。 -
Lambda コンソールで、
TestFunction1、TestFunction2、TestFunction3の 3 つの Lambda 関数があることをチェックします
ステップ 4: ステートマシンを作成する
このステップでは、Step Functions コンソールTask 状態を持つステートマシンを作成します。各 Task 状態 は 3 つの Lambda 関数のうちの 1 つをリファレンスします。
-
Step Functions コンソール
を開き、メニューから [ステートマシン] を選択したら、[ステートマシンの作成] を選択します。 [空白から作成] を選択します。
ステートマシンに名前を付け、[続行] を選択して Workflow Studio でステートマシンを編集します。
-
このチュートリアルでは、コードエディタ でステートマシンの Amazon States Language (ASL) 定義を記述します。これを行うには、[コード] を選択します。
-
既存のボイラープレートコードを削除して、次のコードを貼り付けます。タスク状態定義で、この例の ARN を、作成した Lambda 関数の ARN に置き換えることに注意してください。
{ "StartAt": "CallTestFunction1", "States": { "CallTestFunction1": { "Type": "Task", "Resource": "arn:aws:lambda:", "Catch": [ { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "CallTestFunction2" }, "CallTestFunction2": { "Type": "Task", "Resource": "region:123456789012:function:test-function1arn:aws:lambda:", "Catch": [ { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "CallTestFunction3" }, "CallTestFunction3": { "Type": "Task", "Resource": "region:123456789012:function:test-function2arn:aws:lambda:", "TimeoutSeconds": 5, "Catch": [ { "ErrorEquals": [ "States.Timeout" ], "Next": "AfterTimeout" }, { "ErrorEquals": [ "States.TaskFailed" ], "Next": "AfterTaskFailed" } ], "Next": "Succeed" }, "Succeed": { "Type": "Succeed" }, "AfterTimeout": { "Type": "Fail" }, "AfterTaskFailed": { "Type": "Fail" } } }region:123456789012:function:test-function3これは、Amazon ステートメント言語を使用したステートマシンの説明です。
Task、CallTestFunction1およびCallTestFunction2という名前の 3 つのCallTestFunction3状態を定義します。それぞれが 3 つの Lambda 関数のうちの 1 つを呼び出します。詳細については、「State Machine Structure」を参照してください。 -
ステートマシンの名前を指定します。これを行うには、MyStateMachine のデフォルトステートマシン名の横にある編集アイコンを選択します。次に、[ステートマシンの設定] の [ステートマシン名] ボックスに名前を指定します。
このチュートリアルでは、名前として「
TraceFunctions」と入力します。 -
(オプション) [ステートマシンの設定] で、ステートマシンのタイプや実行ロールなど、他のワークフロー設定を指定します。
このチュートリアルでは、[追加設定] で [X-Ray トレースを有効にする] を選択します。[ステートマシンの設定] のその他のデフォルト設定をすべてそのまま使用します。
ステートマシンに適切なアクセス許可を持つ IAM ロールを以前に作成していて、そのロールを使用する場合は、[アクセス許可] で [既存のロールを選択] を選択し、一覧からロールを選択します。または、[ロールの ARN を入力] を選択し、その IAM ロールの ARN を指定します。
-
[ロールの作成を確認] ダイアログボックスで、[確認] を選択して続行します。
[ロールの設定を表示] を選択して [ステートマシンの設定] に戻ることもできます。
注記
Step Functions が作成した IAM ロールを削除すると、Step Functions を後で再作成することはできません。同様に、ロールを変更すると (例えば、IAM ポリシーのプリンシパルから Step Functions を削除するなど)、後で Step Functions でそれを元の設定に復元することはできません。
ステップ 5: ステートマシンを実行する
ステートマシンの実行は、ワークフローを実行してタスクを実施するインスタンスです。
-
[TraceFunctions]ページで、[Start execution] (実行のスタート) を選択します。[新しい実行] ページが表示されます。
-
[実行を開始] ダイアログボックスで、以下の操作を行います。
-
(オプション) 生成されたデフォルトを上書きするカスタム実行名を入力します。
非 ASCII 名とログ記録
Step Functions では、ステートマシン、実行、アクティビティ、ラベルに、ASCII 以外の文字を含む名前を使用できます。このような文字を使用すると Amazon CloudWatch がデータを記録できなくなるため、Step Functions のメトリクスを追跡できるように ASCII 文字のみを使用することをお勧めします。
-
[実行のスタート] を選択します。
-
Step Functions コンソールから実行 ID のタイトルが付いたページが表示されます。このページは、[実行の詳細] ページと呼ばれます。このページでは、実行の進行中または完了後に実行結果を確認できます。
実行結果を確認するには、[グラフビュー] で個々の状態を選択し、ステップの詳細 ペインの個々のタブを選択すると、入力、出力、定義などの各状態の詳細がそれぞれ表示されます。[実行の詳細] ページに表示できる実行情報の詳細については、「実行の詳細の概要」を参照してください。
複数の (少なくとも 3 つ) の実行を行います。
-
-
実行が終了した後、[X-Ray trace map] (X-Ray トレースマップ) リンクに従います。実行中であっても、トレースを表示できますが、X-Ray トレースマップを表示する前に、実行結果を確認したくなるかもしれません。
-
サービスマップを表示して、エラーの発生場所、高レイテンシーの接続、失敗したリクエストのトレースを識別します。この例では、各関数が受信しているトラフィック量を確認できます。
TestFunction2の呼び出し回数はTestFunction3よりも多く、TestFunction1の呼び出し回数はTestFunction2の 2 倍を超えました。このサービスマップは、各ノードの状態をエラーと障害に対する正常な呼び出しの比率に基づいて色分けしたものです。
-
緑は、正常な呼び出し
-
赤は、サーバー障害 (500 系のエラー)
-
黄は、クライアントエラー (400 系のエラー)
-
紫は、スロットリングエラー (429 リクエストが多すぎる)
そのノードのリクエスト、または 2 つのノード間のエッジを表示するサービスノードを選択して、その接続でやりとりされたリクエストを表示できます。
-
-
X-Ray トレースマップを表示して、実行ごとに何が起こったかを確認します。タイムラインビューには、セグメントとサブセグメントの階層を表示します。リスト内の最初のエントリは、1 回のリクエストに対してサービスによって記録されたすべてのデータを表すセグメントです。セグメントの下にサブセグメントがあります。この例では、Lambda 関数によって記録されたサブセグメントを表示しています。
X-Ray トレースを理解し、Step Functions を使って X-Ray を使用する方法の詳細については、AWS X-Ray で Step Functions リクエストデータをトレースする を参照