
【免费下载链接】context-hub项目地址https://gitcode.com/gh_mirrors/co/context-hub点击查看免费下载Amazon SNSSimple Notification Service是 AWS 的发布/订阅消息服务支持主题Topic、订阅Subscription与消息发布Publish三层模型广泛用于事件通知、系统告警与跨服务扇出fan-out场景。本文围绕 content/aws/docs/sns/javascript/DOC.md 中针对 JavaScript 生态的官方维护文档系统讲解 AWS SDK for JavaScript v3 中aws-sdk/client-sns的安装、客户端初始化、核心调用模式以及主题创建、订阅管理、消息发布含消息属性、协议差异化载荷、FIFO 主题、分页与订阅确认等高频操作。读完本文你将能够在 Node.js/TypeScript 应用中独立完成 SNS 主题的创建、订阅与多协议消息发布并避开 SDK v3 使用中的典型陷阱。为什么选择 v3 而非旧版 aws-sdk在 JavaScript 生态中AWS 官方提供了两代 SDKv2 的aws-sdk与 v3 的按服务拆分的模块化 SDK。文档中的 Golden Rule 给出了明确的选型指引安装aws-sdk/client-sns而不是遗留的aws-sdkv2 包本文覆盖的包版本为3.1006.0只从包根目录导入不要从dist-*构建目录深度导入内部实现应用代码优先使用SNSClient加显式命令Command对象的组合。v3 之所以推荐 client-plus-command 模式是因为它把每个 AWS API 操作封装为独立的命令类如PublishCommand、CreateTopicCommand配合 TypeScript 类型可以获得精确的入参校验与自动补全同时 tree-shaking 友好浏览器与 Node.js 均可使用。仓库中 content/aws/docs/sqs/javascript/DOC.md、content/aws/docs/credential-providers/javascript/DOC.md 等姊妹文档遵循同一套结构说明这是 Context Hub 中 AWS JavaScript 文档的一致约定。安装与配套包安装 SNS 客户端npm install aws-sdk/client-sns常用的配套包是凭据提供程序npm install aws-sdk/credential-providersaws-sdk/credential-providers提供fromIni、fromSSO、fromTemporaryCredentials、fromCognitoIdentityPool等显式凭据辅助函数适用于共享配置文件、IAM Identity Center、STS assume-role 等场景详见 凭据提供程序文档。若你的 SNS 主题需要向 SQS 队列或 Lambda 函数扇出还会用到aws-sdk/client-sqs与aws-sdk/client-lambda本文稍后说明。客户端初始化最小化 Node.js 客户端import { SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: process.env.AWS_REGION ?? us-east-1, });当不显式传入credentials时SDK 会走 Node.js 默认凭据提供链default credential provider chain依次尝试环境变量、共享配置文件、ECS 容器凭据、EC2 实例元数据以及 IAM Identity Center 等来源。显式凭据import { SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1, credentials: { accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY, }, });凭据与区域配置在 Node.js 中只要已通过环境变量、共享配置文件~/.aws/credentials与~/.aws/config、ECS、EC2 实例元数据或 IAM Identity Center 配置了 AWS 访问默认凭据链通常就够用。典型的本地配置export AWS_REGIONus-east-1 export AWS_ACCESS_KEY_ID... export AWS_SECRET_ACCESS_KEY...如果依赖共享 AWS 配置文件而非环境变量客户端初始化应保持简单只在代码中设置 region。需要显式选择 profile 或 assume-role 时再用 凭据提供程序文档 中的fromIni()、fromSSO()等函数传入credentials字段。核心调用模式client-plus-commandv3 SDK 采用客户端加命令的调用方式先实例化SNSClient再构造命令对象并通过await sns.send(command)发送import { PublishCommand, SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); await sns.send( new PublishCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders, Subject: order-created, Message: JSON.stringify({ orderId: 123, status: created }), }), );PublishCommand要求且仅要求一个发布目标TopicArn、TargetArn或PhoneNumber三选一不可同时设置多个。常用操作创建主题import { CreateTopicCommand, SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); const { TopicArn } await sns.send( new CreateTopicCommand({ Name: orders, }), ); console.log(TopicArn);创建成功后返回的TopicArn形如arn:aws:sns:us-east-1:123456789012:orders是后续订阅与发布操作中反复使用的标识符建议持久化存储。将 SQS 队列订阅到主题import { SNSClient, SubscribeCommand } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); const { SubscriptionArn } await sns.send( new SubscribeCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders, Protocol: sqs, Endpoint: arn:aws:sqs:us-east-1:123456789012:orders-queue, }), ); console.log(SubscriptionArn);对于 SQS 订阅队列还需要一条资源策略resource policy允许该 SNS 主题向队列发送消息否则即使订阅成功投递也不会生效。队列的创建与策略管理可配合 content/aws/docs/sqs/javascript/DOC.md 中aws-sdk/client-sqs的CreateQueueCommand与SetQueueAttributesCommand完成。SNS 特有陷阱清单文档明确列出了若干容易踩坑的点务必逐条核对PublishCommand一次只发布到一个目标TopicArn、TargetArn、PhoneNumber只能设置其中一个电子邮件与 HTTP(S) 订阅在端点确认订阅前会一直处于PendingConfirmation状态SQS 与 Lambda 集成通常还需要额外的队列策略或函数权限投递才能生效FIFO 主题名称必须以.fifo结尾向其发布消息必须携带MessageGroupId除非启用了基于内容去重content-based deduplication否则还需要MessageDeduplicationIdMessageStructure: json要求Message是包含各协议载荷的 JSON 字符串而不是嵌套的 JavaScript 对象手机号发布使用 E.164 格式例如12065550100不要从包的构建目录深度导入内部实现。进阶消息发布携带消息属性发布消息属性MessageAttributes用于附带事件类型、租户标识等元数据供订阅方做过滤或路由import { PublishCommand, SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); await sns.send( new PublishCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders, Message: JSON.stringify({ orderId: 123, status: created }), MessageAttributes: { eventType: { DataType: String, StringValue: order.created, }, tenantId: { DataType: String, StringValue: acme, }, }, }), );每个属性的DataType支持String、Number与二进制类型StringValue/BinaryValue按类型对应填写。这些属性可配合 SNS 订阅过滤策略实现“只接收感兴趣事件”的精细化订阅。发布协议差异化载荷当不同协议如 email、sqs、sms、lambda的订阅者需要接收不同的消息体时使用MessageStructure: jsonimport { PublishCommand, SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); await sns.send( new PublishCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders, MessageStructure: json, Message: JSON.stringify({ default: Order 123 created, email: Order 123 was created and is ready for review., sqs: JSON.stringify({ orderId: 123, status: created }), }), }), );注意三点Message必须是通过JSON.stringify序列化后的字符串default键是必需的兜底载荷未匹配到具体协议的订阅者会收到它sqs等协议的值在需要结构化数据时还要再嵌套一层JSON.stringify。发布到 FIFO 主题FIFO 主题名称以.fifo结尾支持严格有序与去重import { PublishCommand, SNSClient } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); await sns.send( new PublishCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders.fifo, Message: JSON.stringify({ orderId: 123, status: created }), MessageGroupId: orders, MessageDeduplicationId: order-123-created, }), );如果主题启用了基于内容去重MessageDeduplicationId可以省略MessageGroupId则始终必填它决定消息在组内的顺序语义。分页列出主题ListTopics默认单页返回量有限使用 v3 提供的分页器paginators可自动翻页拉取全部主题import { paginateListTopics, SNSClient, } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); for await (const page of paginateListTopics({ client: sns }, {})) { for (const topic of page.Topics ?? []) { console.log(topic.TopicArn); } }paginateListTopics是异步生成器配合for await使用即可遍历所有分页结果无需手动维护NextToken。通过令牌确认订阅当你的应用通过带外渠道如邮件或 HTTP 回调收到确认令牌时可主动完成订阅确认import { ConfirmSubscriptionCommand, SNSClient, } from aws-sdk/client-sns; const sns new SNSClient({ region: us-east-1 }); const { SubscriptionArn } await sns.send( new ConfirmSubscriptionCommand({ TopicArn: arn:aws:sns:us-east-1:123456789012:orders, Token: token-from-confirmation-message, }), ); console.log(SubscriptionArn);何时引入其他配套包围绕 SNS 的常见架构还需要以下包配合aws-sdk/credential-providersCognito、fromIni、assume-role 等显式凭据辅助函数详见 content/aws/docs/credential-providers/javascript/DOC.mdaws-sdk/client-sqs创建队列、管理队列策略支撑 SNS 到 SQS 的扇出fan-out架构详见 content/aws/docs/sqs/javascript/DOC.mdaws-sdk/client-lambda管理 Lambda 函数权限使函数能够作为主题的订阅端点。在 Context Hub 中获取与维护本文档本文是 Context Hub 仓库中 content/aws/docs/sns/javascript/DOC.md 的展开讲解。Context Hub 为编码 Agent 提供经过策展、带版本与语言区分--lang py/--lang js的第三方 API 文档。你可以通过 CLI 以chub get sns --lang js之类的方式获取最新文档具体命令以 cli/skills/get-api-docs/SKILL.md 与chub --help为准并在实践中通过chub annotate记录本地经验、以chub feedback投票反馈帮助维护者改进文档内容参见 docs/feedback-and-annotations.md 与 docs/content-guide.md。值得注意的是仓库中并存content/aws/docs/sns/javascript/DOC.mdJavaScript 语言版本与content/aws/docs/mypy-boto3-sns/等 Python 生态文档说明 SNS 文档是按语言分别维护的。小结aws-sdk/client-sns提供了围绕 Amazon SNS 主题、订阅与发布的一整套命令式 API。掌握 client-plus-command 调用模式、三条发布目标规则TopicArn/TargetArn/PhoneNumber三选一、FIFO 主题的.fifo命名与MessageGroupId要求、MessageStructure: json的字符串语义以及 SQS/Lambda 集成所需的额外权限配置就足以在 Node.js 与 TypeScript 项目中构建可靠的事件通知与扇出管道。赞分享【免费下载链接】context-hub项目地址https://gitcode.com/gh_mirrors/co/context-hub点击查看免费下载相关推荐使用 AWS SDK for JavaScript (v3) 操作 Amazon SNS主题、订阅与消息发布的实战指南使用 AWS SDK for JavaScript v3 操作 Amazon SNS主题、订阅与消息发布的实战指南 本文以 aws doc sdk examp示例工程教程后端使用 AWS SDK for Ruby 操作 Amazon SNS主题、订阅与消息发布实战指南使用 AWS SDK for Ruby 操作 Amazon SNS主题、订阅与消息发布实战指南 导读 Amazon Simple Notification S示例工程教程后端使用 AWS SDK for PHP 操作 Amazon SNS 的完整实践指南php/example_code/sns使用 AWS SDK for PHP 操作 Amazon SNS 的完整实践指南php/example_code/sns 导读 本文以 php/exampl示例工程教程后端上一篇Cargo 依赖声明完全指南版本需求、Git/Path/Registry 依赖与工作区继承实战下一篇5分钟让整库音乐开口唱歌LRCGET同步歌词批量下载工具终极上手指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考