讲师中心 微信公众号
AI工具推荐 视频效率加速

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

胖枫大大_3540

胖枫大大_3540

发布时间:2026-05-12 14:44:02

|

172人浏览过

|

来源于php中文网

原创

如何在 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。记住:显式优于隐式,区域与发信号缺一不可。

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

热门AI工具

更多
WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

UP简历
UP简历 Hot

一款AI办公效率工具,主要用于基于AI技术的免费在线简历制作工具,适合需要提升相关任务效率的用户。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

创客贴AI

创客贴AI是一款AI图像与设计工具,AI辅助的智能在线设计工具。

切问学术

切问学术是一款AI论文写作工具,复旦大学NLP团队推出的AI学术智能体。

相关专题

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

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

100

2026.10.22

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

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

60

2026.10.22

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

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

60

2026.10.22

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

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

20

2026.10.22

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

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

60

2026.10.22

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

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

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

40

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

280

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

40

2026.10.22

热门下载

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

精品课程

更多
热门推荐
/
最新课程
关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn