如何在 AWS SDK v3 中正确使用 SNS 发送短信(SMS)

胖枫大大_3540

胖枫大大_3540

2026-05-12

172人浏览

原创

如何在 AWS SDK v3 中正确使用 SNS 发送短信(SMS)

本文详解在 @aws-sdk/client-sns v3 中发送 sms 失败的常见原因——缺失区域配置与发信号码(originationnumber),并提供可立即生效的修复方案与最佳实践。

本文详解在 @aws-sdk/client-sns v3 中发送 sms 失败的常见原因——缺失区域配置与发信号码(originationnumber),并提供可立即生效的修复方案与最佳实践。

在将 AWS SDK 从 v2 升级到 v3 后,许多开发者发现 SNSClient.publish() 调用返回成功响应(HTTP 200 + MessageId),但目标手机号始终收不到短信。这并非网络或权限问题,而是 SDK v3 对配置的显式性要求更高:它不再自动推断区域(region),也不支持仅靠 PhoneNumber 和 Message 发送合规短信——尤其在启用 AWS Pinpoint 短信通道或启用了短信身份验证(SMS sandbox / origination number)的账户中。

✅ 关键修复点

1. 必须指定 region

AWS SNS 是区域化服务,v3 的 SNSClient 不会自动从凭证或环境变量推断 region。若未显式传入,客户端可能默认使用 us-east-1(即使你的资源部署在其他区域),导致请求被路由至错误区域而静默失败(或触发沙盒限制)。
✅ 正确做法:始终在 SNSClient 构造时传入明确的 region(如 'us-east-1'、'us-west-2' 等,需与你的 SNS 主题/短信配置所在区域一致):

const client = new SNSClient({
  credentials: {
    accessKeyId: process.env.AWS_ACCESS_KEY!,
    secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!
  },
  region: 'us-east-1' // ← 必填!确保与你的 SNS 配置区域一致
});

2. 必须设置 OriginationNumber(发信号码)

自 AWS 强化短信合规策略后,直接向手机号发送短信(而非主题订阅)必须指定合法的发信方号码(即已验证/购买的电话号码或短代码)。该字段在 v2 SDK 中常被隐式处理,但在 v3 的 PublishCommand 输入中必须显式声明为 OriginationNumber(注意:不是 PhoneNumber):

const input = {
  PhoneNumber: '+16045181234',         // 接收方号码(含国家码)
  Message: 'test message',
  OriginationNumber: '+12065551234'   // ← 必填!你已验证/购买的发信号码(需与账户绑定)
};

⚠️ 注意:OriginationNumber 必须是已在 AWS Pinpoint 控制台 → SMS and voice → Phone numbers 中完成验证或购买的号码,且其所属区域需与 SNSClient.region 一致。

3. 权限策略建议优化

你当前的策略允许 sns:Publish 到任意资源("*"),虽功能可行,但不符合最小权限原则。推荐细化为:

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:*:*:*" // 允许发布到本账户所有区域的 SNS 资源(更安全)
    }
  ]
}

✅ 完整修正后代码示例

import { PublishCommand, SNSClient } from '@aws-sdk/client-sns';

export const sendSms = async () => {
  try {
    const client = new SNSClient({
      credentials: {
        accessKeyId: process.env.AWS_ACCESS_KEY!,
        secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY!
      },
      region: 'us-east-1' // ← 显式指定区域(根据实际部署调整)
    });

    const input = {
      PhoneNumber: '+16045181234',
      Message: 'Hello from AWS SDK v3!',
      OriginationNumber: '+12065551234' // ← 已验证的发信号码
    };

    const command = new PublishCommand(input);
    const response = await client.send(command);

    console.log('SMS sent successfully:', response.MessageId);
    return response;
  } catch (error: any) {
    console.error('Failed to send SMS:', error.message);
    throw error;
  }
};

? 排查补充提示

  • ✅ 检查短信沙盒状态:新 AWS 账户默认处于 SMS sandbox,仅允许向已验证的手机号发送。请先在 SNS 控制台 → SMS → Phone numbers 中验证接收号码。
  • ✅ 查看 CloudWatch Logs:启用 SNS 日志(需配置交付日志组),可捕获底层投递失败详情(如“Invalid phone number format”、“Throttling”等)。
  • ✅ 使用 @aws-sdk/credential-providers(推荐):避免硬编码密钥,改用 fromEnv() 或 fromSSO() 等安全凭证链。

遵循以上配置,即可确保 @aws-sdk/client-sns v3 稳定、合规地发送 SMS。记住:显式优于隐式,区域与发信号缺一不可。

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

2026.10.28

20

16

Vite 如何搭配 Vue.js
Vite 如何搭配 Vue.js

Vite搭配Vue.js专题汇集创建Vue 3项目、配置开发环境、路径别名、Vue插件、代理、多环境构建与调试的已审核文章,帮助读者完成从初始化到日常开发的配置。

2026.10.28

20

15

Vite 项目目录怎么看
Vite 项目目录怎么看

Vite项目目录专题汇集入口文件、src源码、public静态资源、路径别名、项目根目录和构建输出目录相关的已审核文章,帮助读者理解各文件夹的用途与引用方式。

2026.10.28

0

10

Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

2026.10.22

120

11

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

2026.10.22

60

10

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

2026.10.22

60

15

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

2026.10.22

40

10

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

2026.10.22

60

25

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

2026.10.22

20

15

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
热门推荐
/
最新课程
phpStudy极速入门视频教程
phpStudy极速入门视频教程

共6课时 | 54.7万人学习

独孤九贱(4)_PHP视频教程
独孤九贱(4)_PHP视频教程

共89课时 | 134.1万人学习