📝

Lambda の X-Ray トレースを無効化してもトレースが記録され続ける場合に確認すべきこと

2025/02/09に公開

結論

Lambda の呼び出し元となる AWS サービスなどで X-Ray トレースが有効になっているかどうかを確認しましょう。

例.
Lambda A - SQS - Lambda B の構成で、Lambda A で X-Ray トレースが有効になっているか

Lambda A で X-Ray トレース有効になっている場合、Lambda B の X-Ray トレースを無効化しても、Lambda B のトレースは記録され続けます。

Amazon SQS および AWS X-Ray - AWS X-Ray

アップストリームメッセージプロデューサーからのトレースは、ダウンストリーム Lambda コンシューマーノードからのトレースに自動的にリンクされるため、アプリケーションのエンドツーエンドのビューが作成されます。

試してみた

Lambda A - SQS - Lambda B の構成で以下の状況でのトレースの記録状況を確認してみました。

  1. Lambda A, Lambda B で X-Ray トレースを有効化
  2. Lambda A でのみ X-Ray トレースを有効化
  3. Lambda A, Lambda B で X-Ray トレースを無効化

事前準備として、以下のリソースを作成しました。

  • SQS キュー
    デフォルト設定で標準キューを作成しました。
  • Lambda A
    • ランタイム: Python 3.13
    • IAM ロールに AdministratorAccess 権限を付与
    • コードは以下の通り、SQS キューに SendMessage API でメッセージを送信する処理
lambda_function.py
import json
import boto3

sqs = boto3.client('sqs')

def lambda_handler(event, context):
    
    response = sqs.send_message(
        QueueUrl='https://sqs.ap-northeast-1.amazonaws.com/012345678901/queue-name',
        MessageBody=json.dumps({
            'message': 'Hello from Lambda!'
        })
    )
        
    return {
        'statusCode': 200,
        'body': json.dumps({
            'message': 'Message sent successfully',
            'messageId': response['MessageId']
        })
    }
  • Lambda B
    • ランタイム: Node.js 22.x
    • トリガー: 作成した SQS キュー
    • コードは以下の通り SQS キューから取得したメッセージを出力する処理
index.mjs
export const handler = async (event) => {
  // TODO implement
  console.log(JSON.stringify(event,null,2))
  const response = {
    statusCode: 200,
    body: JSON.stringify('Hello from Lambda!'),
  };
  return response;
};

X-Ray トレースが無効な状態

まずは Lambda A, Lambda B で X-Ray トレースが無効な状態で Lambda A をテスト実行してみます。

Lambda A の実行ログ
{
  "statusCode": 200,
  "body": "{\"message\": \"Message sent successfully\", \"messageId\": \"a91a1a4d-28bb-4eee-913b-de3be7a880cd\"}"
}
Lambda B の実行ログ
{
    "Records": [
        {
            "messageId": "a91a1a4d-28bb-4eee-913b-de3be7a880cd",
            "receiptHandle": "xxx",
            "body": "{\"message\": \"Hello from Lambda!\"}",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "AWSTraceHeader": "Root=1-679f5e49-76e7e7277b8863ba5c90e7d1;Parent=4f9a4f303caad562;Sampled=0;Lineage=1:4911a68a:0",
                "SentTimestamp": "1738497610251",
                "SenderId": "xxx:LambdaA",
                "ApproximateFirstReceiveTimestamp": "1738497610261"
            },
            "messageAttributes": {},
            "md5OfBody": "afb60e570a7e889a52ef63e0768982b7",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:ap-northeast-1:012345678901:test",
            "awsRegion": "ap-northeast-1"
        }
    ]
}

CloudWatch コンソール左ペインからトレースをクリックして「クエリを実行」をクリックしてもトレースが表示されないことを確認します。

1. Lambda A, Lambda B で X-Ray トレースを有効化

両方の Lambda で X-Ray トレースを有効化します。

この状態で Lambda A をテスト実行します。

Lambda A の実行ログ
{
  "statusCode": 200,
  "body": "{\"message\": \"Message sent successfully\", \"messageId\": \"7d8b5996-2406-4a9e-b386-2c72c916abfd\"}"
}
Lambda B の実行ログ
{
    "Records": [
        {
            "messageId": "7d8b5996-2406-4a9e-b386-2c72c916abfd",
            "receiptHandle": "xxx",
            "body": "{\"message\": \"Hello from Lambda!\"}",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "AWSTraceHeader": "Root=1-679f5f09-63be81ad0f94cb8a435dbc43;Parent=0b15ae18dc7c482f;Sampled=1;Lineage=1:4911a68a:0",
                "SentTimestamp": "1738497802891",
                "SenderId": "xxx:LambdaA",
                "ApproximateFirstReceiveTimestamp": "1738497802901"
            },
            "messageAttributes": {},
            "md5OfBody": "afb60e570a7e889a52ef63e0768982b7",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:ap-northeast-1:012345678901:test",
            "awsRegion": "ap-northeast-1"
        }
    ]
}

CloudWatch コンソールで「クエリを実行」をクリックすると、2 件のトレースが表示されることを確認できます。

各トレースには Lambda A, Lambda B の情報が含まれていることも確認できます。

2. Lambda A でのみ X-Ray トレースを有効化

Lambda B の X-Ray トレースを無効化し、Lambda A でのみ X-Ray トレースが有効な状態にします。

この状態で Lambda A をテスト実行します。

Lambda A の実行ログ
{
  "statusCode": 200,
  "body": "{\"message\": \"Message sent successfully\", \"messageId\": \"ceae9727-23eb-4e2f-af4f-b9691b90b5f7\"}"
}
Lambda B の実行ログ
{
    "Records": [
        {
            "messageId": "ceae9727-23eb-4e2f-af4f-b9691b90b5f7",
            "receiptHandle": "xxx",
            "body": "{\"message\": \"Hello from Lambda!\"}",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "AWSTraceHeader": "Root=1-679f5ffb-2f6106524f1db4d735a512cf;Parent=87a7aa64b73cf3a9;Sampled=1;Lineage=1:4911a68a:0",
                "SentTimestamp": "1738498043802",
                "SenderId": "AROAW3GU7THZI7UKWM3WV:LambdaA",
                "ApproximateFirstReceiveTimestamp": "1738498043807"
            },
            "messageAttributes": {},
            "md5OfBody": "afb60e570a7e889a52ef63e0768982b7",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:ap-northeast-1:012345678901:test",
            "awsRegion": "ap-northeast-1"
        }
    ]
}

CloudWatch コンソールで「クエリを実行」をクリックすると、4 件のトレースが表示されることを確認できます。

上述の検証 1 で記録されたトレースが 2 件、今回の検証 2 で記録されたトレースが 2 件なので合計 4 件表示されています。

検証 1 と同様に、各トレースには Lambda A, Lambda B の情報が含まれていることも確認できます。

Lambda B の X-Ray トレースを無効化してもトレースが記録され続けることを確認できました。

3. Lambda A, Lambda B で X-Ray トレースを無効化

両方の Lambda で X-Ray トレースを無効化します。

この状態で Lambda A をテスト実行します。

Lambda A の実行ログ
{
  "statusCode": 200,
  "body": "{\"message\": \"Message sent successfully\", \"messageId\": \"bde2cdf0-7ed0-4fbc-8dd5-3edc2d92535e\"}"
}
Lambda B の実行ログ
{
    "Records": [
        {
            "messageId": "bde2cdf0-7ed0-4fbc-8dd5-3edc2d92535e",
            "receiptHandle": "xxx",
            "body": "{\"message\": \"Hello from Lambda!\"}",
            "attributes": {
                "ApproximateReceiveCount": "1",
                "AWSTraceHeader": "Root=1-679f60ff-03da034f554b4dc538b158d5;Parent=27aca77b32cf73fa;Sampled=0;Lineage=1:4911a68a:0",
                "SentTimestamp": "1738498304420",
                "SenderId": "AROAW3GU7THZI7UKWM3WV:LambdaA",
                "ApproximateFirstReceiveTimestamp": "1738498304423"
            },
            "messageAttributes": {},
            "md5OfBody": "afb60e570a7e889a52ef63e0768982b7",
            "eventSource": "aws:sqs",
            "eventSourceARN": "arn:aws:sqs:ap-northeast-1:012345678901:test",
            "awsRegion": "ap-northeast-1"
        }
    ]
}

CloudWatch コンソールで「クエリを実行」をクリックすると、4 件のトレースが表示されることを確認できます。

上述の検証 1, 2 で記録されたトレースは表示されていますが、今回の検証 3 のトレースは記録されていないことを確認できました。

両方の Lambda で X-Ray トレースを無効化することで、トレースが記録されないことを確認できました。

トレースヘッダーについて

Amazon SQS および AWS X-Ray - AWS X-Ray

X-Ray SDK は AWS SDK を通じて Amazon SQS を呼び出すときに、トレースヘッダーを HTTP ヘッダーとして自動的に入力します。デフォルトのトレースヘッダーは X-Amzn-Trace-Id によって転送され、SendMessage または SendMessageBatch リクエストに含まれるすべてのメッセージに対応します。

SQS キューには X-Ray トレースを有効化する設定はありませんが、上記ドキュメントに記載されている通り、AWS SDK を使用して SQS にメッセージを送信した場合、自動的にトレースヘッダーが付与されます。
Lambda B の実行ログに含まれる以下の部分がトレースヘッダーです。

AWSTraceHeader": "Root=1-679f60ff-03da034f554b4dc538b158d5;Parent=27aca77b32cf73fa;Sampled=0;Lineage=1:4911a68a:0

SQS キューに X-Ray トレースに関する設定がないため、Lambda B で X-Ray トレースを無効化してもトレースの記録が続く場合、SQS へのメッセージ送信元で X-Ray トレースが有効になっているかどうかを確認しましょう。

ちなみに SNS と X-Ray のドキュメントには、SNS 側でトレースが無効でもトレースが有効なサービスから SNS API を呼び出した場合にトレースが記録される旨の記載があります。
Amazon SNS でのアクティブトレース - Amazon Simple Notification Service

すでにトレースされているサービスから Amazon SNS API を呼び出すと、Amazon SNS は、API で X-Ray トレースが有効になっていなくてもトレースをパススルーします。

SQS のドキュメントには同様の記載がありませんでしたが、今回の検証結果から、おそらく SQS についても同様の仕様だと思われます。

まとめ

今回は Lambda の X-Ray トレースを無効化してもトレースが記録され続ける場合に確認すべきことを紹介しました。
どなたかの参考になれば幸いです。

参考資料

Discussion