AWS X-Ray
開発者ガイド

Amazon SNS および AWS X-Ray

AWS X-Ray は Amazon Simple Notification Service (Amazon SNS) と統合して、Amazon SNS 経由で渡されるメッセージをトレースします。Amazon SNS パブリッシャーが X-Ray SDK クライアントを使用してクライアントをトレースする場合、サブスクライバーはトレースヘッダーを取得し、同じトレース ID を使用して、パブリッシャーからの元のトレースを継続して伝達できます。この継続性により、ユーザーはダウンストリームサービス全体でトレース、分析、およびデバッグを実行できます。

現在、Amazon SNS トレースコンテキストの伝達では、以下のサブスクライバーがサポートされています。

  • HTTP/HTTPS – HTTP/HTTPS サブスクライバーの場合、X-Ray SDK を使用して、受信するメッセージリクエストをトレースできます。詳細な説明と Java の例については、「X-Ray SDK for Java を使用して受信リクエストをトレースする」を参照してください。

  • AWS Lambda – アクティブトレースを有効にした Lambda サブスクライバーの場合、Lambda は関数呼び出しに関する詳細とともにセグメントを記録し、発行元のトレースに送信します。詳細については、「AWS Lambda および AWS X-Ray」を参照してください。

以下の手順で、Lambda サブスクライバーを使用して X-Ray と Amazon SNS の間の基本的なコンテキストを作成する方法について学習してください。2 つの Lambda 関数および 1 つの Amazon SNS トピックを作成します。次に、X-Ray コンソールで、やり取りを通して伝達されたトレース ID を表示できます。

要件

Lambda サブスクライバー関数の作成

以下のステップでは、サンプル Lambda 関数の MessageSubscriber が Node.js で実装され、Amazon SNS トピックのエンドポイントとしてサブスクライブされます。MessageSubscriber 関数は、AWSXRay.captureFunc コマンドで custom process_message サブセグメントを作成します。この関数は、サブセグメントの注釈としてシンプルなメッセージを書き込みます。

サブスクライバーパッケージを作成するには

  1. ファイルフォルダを作成し、それがサブスクライバー関数であることを示すために名前を付けます (たとえば、sns-xray-subscriber)。

  2. 2 つのファイル (index.js および package.json) を作成します。

  3. 次のコードを index.js に貼り付けます。

    var AWSXRay = require('aws-xray-sdk'); exports.handler = function(event, context, callback) { AWSXRay.captureFunc('process_message', function(subsegment) { var message = event.Records[0].Sns.Message; subsegment.addAnnotation('message_content', message); subsegment.close(); }); callback(null, "Message received."); };
  4. 次のコードを package.json に貼り付けます。

    { "name": "sns-xray-subscriber", "version": "1.0.0", "description": "A demo service to test SNS X-Ray trace header propagation", "dependencies": { "aws-xray-sdk": "^2.2.0" } }
  5. sns-xray-subscriber フォルダ内で次のスクリプトを実行します。package-lock.json ファイルと node_modules フォルダが作成され、すべての依存関係が処理されます。

    npm install --production
  6. sns-xray-subscriber フォルダを .zip ファイルに圧縮します。

サブスクライバー関数を作成し、X-Ray を有効にするには

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

  2. [一から作成] を選択します。

    • [関数名] に名前 (たとえば、MessageSubscriber) を付けます。

    • [ランタイム] で、[Node.js 10.x] を選択します。

  3. [関数の作成] を選択し、Lambda コンソールで関数を作成および表示します。

  4. [関数コード] で、[コードエントリタイプ] の [.ZIP ファイルをアップロードする] を選択します。

  5. 作成したサブスクライバーパッケージを選択します。アップロードするには、コンソールの右上にある [保存] を選択します。

  6. [デバッグとエラー処理] で、[Enable AWS X-Ray (AWS X-Ray の有効化) チェックボックスをオンにします。

  7. [保存] を選択します。

Amazon SNS トピックの作成

Amazon SNS は、リクエストを受信すると、そのエンドポイントサブスクライバーにトレースヘッダーを伝達します。以下の手順では、トピックを作成してから、前に作成した Lambda 関数としてエンドポイントを設定します。

Amazon SNS トピックを作成し、Lambda 関数をサブスクライブするには

  1. SNS コンソールを開きます。

  2. [トピック] を選択し、[トピックの作成] を選択します。[名前] に名前を入力します。

  3. [サブスクリプション] で、[サブスクリプションの作成] を選択します。

  4. トピックの ARN (arn:aws:sns:{region}:{account id}:{topic name} など) を記録します。

  5. [サブスクリプションの作成] を選択します。

    • [プロトコル]で、[AWS Lambda] を選択します。

    • [エンドポイント] で、利用可能な Lambda 関数のリストから作成したレシーバー Lambda 関数の ARN を選択します。

  6. [サブスクリプションの作成] を選択します。

Lambda パブリッシャー関数の作成

以下のステップでは、サンプルの Lambda 関数 MessagePublisher は Node.js で実装されます。この関数は、前に作成した Amazon SNS トピックにメッセージを送信します。この関数は AWS SDK for JavaScript を使用して Amazon SNS から通知を送信し、X-Ray SDK for Node.js を使用して AWS SDK クライアントを計測します。

パブリッシャーパッケージを作成するには

  1. ファイルフォルダを作成し、それがパブリッシャー関数であることを示すために名前を付けます (たとえば、sns-xray-publisher)。

  2. 2 つのファイル (index.js および package.json) を作成します。

  3. 次のコードを index.js に貼り付けます。

    var AWSXRay = require('aws-xray-sdk'); var AWS = AWSXRay.captureAWS(require('aws-sdk')); exports.handler = function(event, context, callback) { var sns = new AWS.SNS(); sns.publish({ // You can replace the following line with your custom message. Message: process.env.MESSAGE || "Testing X-Ray trace header propagation", TopicArn: process.env.TOPIC_ARN }, function(err, data) { if (err) { console.log(err.stack); callback(err); } else { callback(null, "Message sent."); } }); };
  4. 以下のコードを package.json に貼り付けます。

    { "name": "sns-xray-publisher", "version": "1.0.0", "description": "A demo service to test SNS X-Ray trace header propagation", "dependencies": { "aws-xray-sdk": "^2.2.0" } }
  5. sns-xray-publisher フォルダ内で、次のスクリプトを実行します。package-lock.json ファイルと node_modules フォルダが作成され、すべての依存関係が処理されます。

    npm install --production
  6. sns-xray-publisher フォルダを .zip ファイルに圧縮します。

パブリッシャー関数を作成し、X-Ray を有効にするには

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

  2. [一から作成] を選択します。

    • [名前] に名前 (たとえば、MessagePublisher) を付けます。

    • [ランタイム] で、[Node.js 10.x] を選択します。

  3. [Permissions (アクセス許可)] で、[実行ロールの選択または作成] を選択します。

    • [Execution role (実行ロール)] ドロップダウンリストで、[Create new role from AWS policy templates (AWS ポリシーテンプレートから新しいロールを作成)] を選択します。

    • [ロール名] に名前を入力します。

    • [ポリシーテンプレート] で、[Amazon SNS Publish policy (Amazon SNS 発行ポリシー)] を選択します。

  4. [関数の作成] を選択し、Lambda コンソールで関数を作成および表示します。

  5. [関数コード] で、[コードエントリタイプ] の [.ZIP ファイルをアップロードする] を選択します。

  6. 作成したパブリッシャーパッケージを選択します。アップロードするには、コンソールの右上にある [保存] を選択します。

  7. [環境変数] で、変数を追加します。

    • [Key (キー)] には、パブリッシャー関数で定義したキー名 TOPIC_ARN を使用します。

    • [] で、前に記録した Amazon SNS トピック ARN を使用します。

  8. 必要に応じて、別の変数を追加します。

    • [キー] に、キー名 (たとえば、MESSAGE) を入力します。

    • [] に、カスタムメッセージを入力します。

  9. [デバッグとエラー処理] で、[Enable AWS X-Ray (AWS X-Ray の有効化) チェックボックスをオンにします。

  10. [保存] を選択します。

コンテキスト伝達のテストと検証

パブリッシャー関数およびサブスクライバー関数の両方とも、トレースを送信するときに Lambda アクティブトレースを有効にします。パブリッシャー関数は、X-Ray SDK を使用して SendMessage SQS API コールをキャプチャします。次に、Amazon SNS はトレースヘッダーをサブスクライバーに伝達します。最後に、サブスクライバーがトレースヘッダーを取得し、トレースを続行します。以降のステップでは、トレース ID に従います。

パブリッシャー関数を作成し、X-Ray を有効にするには

  1. Lambda コンソールを開き、前に作成したパブリッシャー関数を選択します。

  2. [テスト] を選択します。

  3. [新しいテストイベントの作成] を選択します。

    • [イベントテンプレート] で、[Hello World] テンプレートを選択します。

    • [イベント名] に名前を入力します。

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

  5. [テスト] を再度選択します。

  6. 検証のため、X-Ray コンソールを開きます。トレースが表示されるまで、10 秒以上待機します。

  7. サービスマップが生成されたら、2 つの Lambda 関数と 1 つの Amazon SNS トピックが表示されることを確認します。

  8. [MessageSubscriber] セグメントを選択し、[トレースの表示] を選択します。

  9. リストからトレースを選択し、[詳細] ページを表示します。

  10. [process_message] サブセグメントを選択します。

  11. [注釈] タブを選択し、送信者からのメッセージの値とともに message_content キーを確認します。