本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
Amazon SNS 和 AWS X-Ray
AWS X-Ray 与 Amazon Simple Notification Service (Amazon SNS) 集成以跟踪 Amazon SNS 中传递的消息。如果 Amazon SNS 发布者使用 X-Ray 开发工具包跟踪其客户端,订阅者可以检索跟踪标头并继续使用相同的跟踪 ID 传播发布者的原始跟踪。此连续性使用户能够跟踪、分析和调试整个下游服务。
Amazon SNS 跟踪上下文传播目前支持以下订阅者:
-
HTTP/HTTPS – 对于 HTTP/HTTPS 订阅者,您可以使用 X-Ray 开发工具包来跟踪传入的消息请求。有关采用 Java 的更多信息和示例,请参阅使用 X-Ray SDK for Java跟踪传入请求。
-
AWS Lambda – 对于启用主动跟踪的 Lambda 订阅者,Lambda 记录包含函数调用详细信息的分段,并将其发送到发布者的跟踪。有关更多信息,请参阅 AWS Lambda 和 AWS X-Ray。
通过以下说明了解如何使用 Lambda 订阅者在 X-Ray 和 Amazon SNS 创建基本上下文。您将创建两个 Lambda 函数和一个 Amazon SNS 主题。然后,在 X-Ray 控制台中,您可以查看在其交互过程中传播的跟踪 ID。
要求
-
Bash shell。对于 Linux 和 macOS,默认情况下包含此项。在 Windows 10 中,您可以安装 Windows Subsystem for Linux
,以获取 Windows 集成版本的 Ubuntu 和 Bash。
创建 Lambda 订阅者函数
在以下步骤中,示例 Lambda 函数 MessageSubscriber
在 Node.js 中实施,并作为终端节点订阅到 Amazon SNS 主题。MessageSubscriber
函数使用 AWSXRay.captureFunc
custom
process_message
子分段。该函数写入一条简单消息,作为子分段的注释。
要创建订阅者程序包,请执行以下操作:
-
创建一个文件夹并命名以表明它是订阅者函数(例如,
sns-xray-subscriber
)。 -
创建两个文件:
index.js
和package.json
。 -
将以下代码粘贴到
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."); };
-
将以下代码粘贴到
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" } }
-
运行
sns-xray-subscriber
文件夹中的以下脚本。它会创建一个package-lock.json
文件和一个node_modules
文件夹,处理所有依赖项。npm install --production
-
将
sns-xray-subscriber
文件夹压缩为 .zip 文件。
要创建订阅者函数并启用 X-Ray,请执行以下操作:
-
打开 Lambda 控制台
,然后选择 Create a function (创建函数)。 -
选择 Author from scratch (从头开始创作):
-
对于 Function name (函数名称),请提供一个名称(例如,
MessageSubscriber
)。 -
对于 Runtime (运行时),请使用 Node.js 10.x。
-
-
选择 Create function (创建函数) 以在 Lambda 控制台中创建和显示函数。
-
在 Function code (函数代码) 中的 Code entry type (代码条目类型) 下,选择 Upload a .ZIP file (上传 .ZIP 文件)。
-
选择您创建的订阅者程序包。要上传,请在控制台的右上角选择 Save (保存)。
-
在 Debugging and error handling (调试和错误处理) 中,选择 Enable AWS X-Ray (启用 AWS X-Ray) 框。
-
选择保存。
创建 Amazon SNS 主题
当 Amazon SNS 接收请求时,它会将跟踪标头传播到其终端节点的订阅者。在以下步骤中,您将创建一个主题,然后将终端节点设置为您之前创建的 Lambda 函数。
要创建 Amazon SNS 主题并订阅 Lambda 函数,请执行以下操作:
-
打开 SNS 控制台
。 -
选择 Topics (主题),然后选择 Create topic (创建主题)。对于 Name (名称),请提供一个名称。
-
在订阅中,选择创建订阅。
-
记录主题 ARN(例如,
arn:aws:sns:{region}:{account id}:{topic name}
)。 -
选择 Create subscription (创建订阅):
-
对于 Protocol (协议),选择 AWS Lambda。
-
对于 Endpoint (终端节点),从可用 Lambda 函数列表中选择您创建的接收者 Lambda 函数的 ARN。
-
-
选择 Create subscription (创建订阅)。
创建 Lambda 发布者函数
在以下步骤中,示例 Lambda 函数 MessagePublisher
在 Node.js 中实施。该函数将消息发送到您之前创建的 Amazon SNS 主题。该函数使用 AWS SDK for JavaScript 从 Amazon
SNS 发送通知,并使用 X-Ray SDK for Node.js 分析 AWS 开发工具包客户端。
要创建发布者程序包,请执行以下操作:
-
创建一个文件夹并命名以表明它是发布者函数(例如,
sns-xray-publisher
)。 -
创建两个文件:
index.js
和package.json
。 -
将以下代码粘贴到
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."); } }); }; -
将以下代码粘贴到
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" } }
-
运行
sns-xray-publisher
文件夹中的以下脚本。它会创建一个package-lock.json
文件和一个node_modules
文件夹,处理所有依赖项。npm install --production
-
将
sns-xray-publisher
文件夹压缩为 .zip 文件。
要创建发布者函数并启用 X-Ray,请执行以下操作:
-
打开 Lambda 控制台
,然后选择 Create function (创建函数)。 -
选择 Author from scratch (从头开始创作):
-
对于 Name (名称),请提供一个名称(例如,
MessagePublisher
)。 -
对于 Runtime (运行时),请使用 Node.js 10.x。
-
-
在 Permissions (权限) 中,展开 Choose or create an execution role (选择或创建执行角色)。
-
对于 Execution role (执行角色),选择 Create a new role from AWS policy templates (从 AWS 策略模板创建新角色)。
-
对于 Role name (角色名称),请提供一个名称。
-
对于 Policy templates (策略模板),选择 Amazon SNS publish policy (Amazon SNS 发布策略)。
-
-
选择 Create function (创建函数) 以在 Lambda 控制台中创建和显示函数。
-
在 Function code (函数代码) 中的 Code entry type (代码条目类型) 下,选择 Upload a .ZIP file (上传 .ZIP 文件)。
-
选择您创建的发布者程序包。要上传,请在控制台的右上角选择 Save (保存)。
-
在 Environment variables (环境变量) 中,添加一个变量:
-
对于键,请使用键名称
TOPIC_ARN
,这是发布者函数中定义的值。 -
对于 Value (值),请使用您之前记录的 Amazon SNS 主题 ARN。
-
-
(可选)添加其他变量:
-
对于 Key (键),请提供一个键名称(例如
MESSAGE
)。 -
对于 Value (值),输入任何自定义消息。
-
-
在 Debugging and error handling (调试和错误处理) 中,选择 Enable AWS X-Ray (启用 AWS X-Ray) 框。
-
选择保存。
测试和验证上下文传播
发布者和订阅者函数在发送跟踪时均启用 Lambda 主动跟踪。发布者函数使用 X-Ray 开发工具包来捕获 publish
SNS API 调用。然后,Amazon SNS 将跟踪标头传播到订阅者。最后,订阅者将选取跟踪标头并继续跟踪。按照以下步骤中的跟踪 ID 进行操作。
要创建发布者函数并启用 X-Ray,请执行以下操作:
-
打开 Lambda 控制台
,然后选择您之前创建的发布者函数。 -
选择 Test (测试)。
-
选择 Create a new test event (新建测试事件):
-
对于 Event template (事件模板),选择 Hello World 模板。
-
对于 Event name (事件名称),请提供一个名称。
-
-
选择 Create (创建)。
-
再次选择 Test (测试)。
-
要验证,请打开 X-Ray 控制台
。等待至少 10 秒,以显示跟踪。 -
当生成服务地图时,验证显示的两个 Lambda 函数和 Amazon SNS 主题。
-
选择
MessageSubscriber
分段,然后选择 View traces (查看跟踪)。 -
从列表中选择跟踪以访问 Details (详细信息) 页面。
-
选择 process_message 子分段。
-
选择 Annotations (注释) 选项卡以查看发件人的
message_content
键和消息值。