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

本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。

Amazon SNS 和Amazon X-Ray

Amazon X-Ray与 Amazon Simple Notification Service (Amazon SNS) 集成,以跟踪通过 Amazon SNS 传递的消息。如果 Amazon SNS 发布者使用 X-Ray 软件开发工具包跟踪其客户端,订阅者可以检索跟踪标头并继续使用相同的跟踪 ID 传播发布者的原始跟踪。此连续性使用户能够跟踪、分析和调试整个下游服务。

Amazon SNS 跟踪上下文传播目前支持以下订阅者:

通过以下说明了解如何使用 Lambda 订阅者在 X-Ray 和 Amazon SNS 之间创建基本上下文。您将创建两个 Lambda 函数和一个 Amazon SNS 主题。然后,在 X-Ray 控制台中,您可以查看在其交互过程中传播的跟踪 ID。

Requirements

创建 Lambda 订阅者函数

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

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

  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. 选择创建函数以在 Lambda 控制台中创建和显示函数。

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

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

  6. In调试和错误处理中,选择Enable (启用 Gem)AmazonX-Ray

  7. 选择 Save

创建 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 (创建订阅)

    • 适用于协议中,选择AmazonLambda

    • 适用于终端节点中,从可用 Lambda 函数列表中选择您创建的 Lambda 函数的 ARN。

  6. 选择 Create subscription

创建 Lambda 发布者函数

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

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

  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 Amazon policy templates(从策略模板创建新角色)。

    • 对于 Role name (角色名称),请提供一个名称。

    • 对于 Policy templates (策略模板),选择 Amazon SNS publish policy (Amazon SNS 发布策略)

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

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

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

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

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

    • 适用于,请使用您之前记录的 Amazon SNS 主题 ARN。

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

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

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

  9. In调试和错误处理中,选择Enable (启用 Gem)AmazonX-Ray

  10. 选择 Save

测试和验证上下文传播

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

创建发布者函数并启用 X-Ray

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

  2. 选择 Test (测试)

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

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

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

  4. 选择创建

  5. 再次选择 Test (测试)

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

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

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

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

  10. 选择 process_message 子分段。

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