📝

クロスアカウントで Lambda と API Gateway の X-Ray トレースを確認してみた

に公開

Cross-account tracing - AWS X-Ray
クロスアカウントでのトレース結果をモニタリングアカウント側で確認してみました。

構成

モニタリングアカウントの Lambda

VPC Lambda から プライベート API Gateway 経由で非 VPC Lambda を呼び出してみた
上記ブログの VPC Lambda と同じコードを使用しました。
レイヤーについても axios をインストールしたレイヤーを追加しました。

indes.js
const axios = require('axios');

exports.handler = async (event) => {
    const res = await axios.get("https://{my-api-id}.execute-api.ap-northeast-1.amazonaws.com/{api-stage-name}");
    console.log(res.data)
    return res.data;
};

また、Lambda コンソール上で Lambda サービストレースも有効化しました。

モニタリングアカウントの CloudWatch

Link monitoring accounts with source accounts - Amazon CloudWatch
上記ドキュメントの手順でモニタリングアカウントを設定しました。
後述のソースアカウントの設定には URL を使用する方法を採用しました。

ソースアカウントの Lambda

デフォルトコードの Lambda 関数を作成しました。
また、モニタリングアカウントの Lambda 同様に Lambda サービストレースも有効化しました。

ソースアカウントの API Gateway

REST API の Lambda プロキシ統合でソースアカウントの Lambda を指定しました。
また、デプロイ後にステージの設定で X-Ray トレースを有効化しました。

ただし、API Gateway のリクエスト元でトレースが有効になっている場合は API Gateway はトレースを伝播するため、API Gateway 側でのトレースは不要でした。

Trace user requests to REST APIs using X-Ray in API Gateway - Amazon API Gateway

If you call an API Gateway API from a service that's already being traced, API Gateway passes the trace through, even if X-Ray tracing isn't enabled on the API.

ソースアカウントの CloudWatch

モニタリングアカウント側の CloudWatch でコピーしたリンク用の URL にソースアカウント側でアクセスしてソースアカウント側の設定を行いました。

今回はトレースだけを共有する設定にしました。

モニタリングアカウント側で確認

Cross-account tracing - AWS X-Ray
モニタリングアカウントの Lambda をテスト実行して実行が成功したら CloudWatch コンソールからトレースマップを確認します。
ソースアカウント側のトレースを取得できていれば成功です。

おまけ

Lambda config support · Issue #14 · aws/aws-xray-daemon
Lambda コンソール Lambda サービストレースも有効化する際に別アカウントを指定することはできないようです。
そのため、リクエスト全体のトレースを確認したい場合には以下の方法が考えられます。

  • 上記のようにクロスアカウントでトレース
  • トレース対象のリソースを 1 アカウントに集約する

まとめ

今回はクロスアカウントで Lambda と API Gateway の X-Ray トレースを確認してみました。
どなたかの参考になれば幸いです。

参考資料

Discussion