Lambda の X-Ray トレースを無効化してもトレースが記録され続ける場合に確認すべきこと
結論
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 の構成で以下の状況でのトレースの記録状況を確認してみました。
- Lambda A, Lambda B で X-Ray トレースを有効化
- Lambda A でのみ X-Ray トレースを有効化
- Lambda A, Lambda B で X-Ray トレースを無効化
事前準備として、以下のリソースを作成しました。
- SQS キュー
デフォルト設定で標準キューを作成しました。 - Lambda A
- ランタイム: Python 3.13
- IAM ロールに AdministratorAccess 権限を付与
- コードは以下の通り、SQS キューに SendMessage API でメッセージを送信する処理
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 キューから取得したメッセージを出力する処理
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