Amazon SNS 和 AWS X-Ray - AWS X-Ray
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 AWS 服务入门

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。

要求

创建 Lambda 订阅者函数

在以下步骤中,示例 Lambda 函数 MessageSubscriber 在 Node.js 中实施,并作为终端节点订阅到 Amazon SNS 主题。MessageSubscriber 函数使用 AWSXRay.captureFunc 命令创建 custom process_message 子分段。该函数写入一条简单消息,作为子分段的注释。

要创建订阅者程序包,请执行以下操作:

  1. 创建一个文件夹并命名以表明它是订阅者函数(例如,sns-xray-subscriber)。

  2. 创建两个文件:index.jspackage.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 控制台,然后选择 Create a function (创建函数)

  2. 选择 Author from scratch (从头开始创作)

    • 对于 Function name (函数名称),请提供一个名称(例如,MessageSubscriber)。

    • 对于 Runtime (运行时),请使用 Node.js 10.x

  3. 选择 Create function (创建函数) 以在 Lambda 控制台中创建和显示函数。

  4. Function code (函数代码) 中的 Code entry type (代码条目类型) 下,选择 Upload a .ZIP file (上传 .ZIP 文件)

  5. 选择您创建的订阅者程序包。要上传,请在控制台的右上角选择 Save (保存)

  6. Debugging and error handling (调试和错误处理) 中,选择 Enable AWS X-Ray (启用 AWS X-Ray) 框。

  7. 选择保存

创建 Amazon SNS 主题

当 Amazon SNS 接收请求时,它会将跟踪标头传播到其终端节点的订阅者。在以下步骤中,您将创建一个主题,然后将终端节点设置为您之前创建的 Lambda 函数。

要创建 Amazon SNS 主题并订阅 Lambda 函数,请执行以下操作:

  1. 打开 SNS 控制台

  2. 选择 Topics (主题),然后选择 Create topic (创建主题)。对于 Name (名称),请提供一个名称。

  3. 订阅中,选择创建订阅

  4. 记录主题 ARN(例如,arn:aws:sns:{region}:{account id}:{topic name})。

  5. 选择 Create subscription (创建订阅)

    • 对于 Protocol (协议),选择 AWS Lambda

    • 对于 Endpoint (终端节点),从可用 Lambda 函数列表中选择您创建的接收者 Lambda 函数的 ARN。

  6. 选择 Create subscription (创建订阅)

创建 Lambda 发布者函数

在以下步骤中,示例 Lambda 函数 MessagePublisher 在 Node.js 中实施。该函数将消息发送到您之前创建的 Amazon SNS 主题。该函数使用 AWS SDK for JavaScript 从 Amazon SNS 发送通知,并使用 X-Ray SDK for Node.js 分析 AWS 开发工具包客户端。

要创建发布者程序包,请执行以下操作:

  1. 创建一个文件夹并命名以表明它是发布者函数(例如,sns-xray-publisher)。

  2. 创建两个文件:index.jspackage.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. 选择 Author from scratch (从头开始创作)

    • 对于 Name (名称),请提供一个名称(例如,MessagePublisher)。

    • 对于 Runtime (运行时),请使用 Node.js 10.x

  3. 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 发布策略)

  4. 选择 Create function (创建函数) 以在 Lambda 控制台中创建和显示函数。

  5. Function code (函数代码) 中的 Code entry type (代码条目类型) 下,选择 Upload a .ZIP file (上传 .ZIP 文件)

  6. 选择您创建的发布者程序包。要上传,请在控制台的右上角选择 Save (保存)

  7. Environment variables (环境变量) 中,添加一个变量:

    • 对于,请使用键名称 TOPIC_ARN,这是发布者函数中定义的值。

    • 对于 Value (值),请使用您之前记录的 Amazon SNS 主题 ARN。

  8. (可选)添加其他变量:

    • 对于 Key (键),请提供一个键名称(例如 MESSAGE)。

    • 对于 Value (值),输入任何自定义消息。

  9. Debugging and error handling (调试和错误处理) 中,选择 Enable AWS X-Ray (启用 AWS X-Ray) 框。

  10. 选择保存

测试和验证上下文传播

发布者和订阅者函数在发送跟踪时均启用 Lambda 主动跟踪。发布者函数使用 X-Ray 开发工具包来捕获 publish SNS API 调用。然后,Amazon SNS 将跟踪标头传播到订阅者。最后,订阅者将选取跟踪标头并继续跟踪。按照以下步骤中的跟踪 ID 进行操作。

要创建发布者函数并启用 X-Ray,请执行以下操作:

  1. 打开 Lambda 控制台,然后选择您之前创建的发布者函数。

  2. 选择 Test (测试)

  3. 选择 Create a new test event (新建测试事件)

    • 对于 Event template (事件模板),选择 Hello World 模板。

    • 对于 Event name (事件名称),请提供一个名称。

  4. 选择 Create (创建)

  5. 再次选择 Test (测试)

  6. 要验证,请打开 X-Ray 控制台。等待至少 10 秒,以显示跟踪。

  7. 当生成服务地图时,验证显示的两个 Lambda 函数和 Amazon SNS 主题。

  8. 选择 MessageSubscriber 分段,然后选择 View traces (查看跟踪)

  9. 从列表中选择跟踪以访问 Details (详细信息) 页面。

  10. 选择 process_message 子分段。

  11. 选择 Annotations (注释) 选项卡以查看发件人的 message_content 键和消息值。