使用@aws-sdk/client-sns v3发送SMS收不到消息,但请求返回正常
AWS SDK v3 发送短信返回成功但收不到消息排查
之前用AWS SDK v2发送短信一切正常,切换到v3后,请求返回带MessageId的200响应,但手机收不到短信,怀疑遗漏了配置。操作步骤如下:
- 创建仅允许
sns:Publish操作的IAM策略:
{ "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "sns:Publish", "Resource": "*" } ] }
将该策略关联到IAM用户,生成Access Key和Secret Access Key。
发送短信的JavaScript代码:
import { PublishCommand, SNSClient } from '@aws-sdk/client-sns'; export const sendSms = async () => { try { const client = new SNSClient({ credentials: { accessKeyId: process.env.AWS_ACCESS_KEY as string, secretAccessKey: process.env.AWS_SECRET_ACCESS_KEY as string } }); const input = { PhoneNumber: "+16045181234", Message: "test message" }; const command = new PublishCommand(input); const response = await client.send(command); console.log(new Date()); console.log(response, 'response '); return; } catch (e: any) { console.log(e, 'SEND SMS'); } }
- 收到的响应内容:
{ '$metadata': { httpStatusCode: 200, requestId: '6c3f80ea-3ff2-5c38-bda6-dd6e27661c74', extendedRequestId: undefined, cfId: undefined, attempts: 1, totalRetryDelay: 0 }, MessageId: 'a94988b1-ba63-5f5b-a647-d535a2f78f17' }
排查建议
- 显式指定区域:SDK v3默认区域可能和v2不一致,SNS短信服务依赖特定区域(如美国常用
us-east-1,加拿大可选ca-central-1),初始化SNSClient时明确添加区域配置:const client = new SNSClient({ credentials: { ... }, region: 'us-east-1' // 替换为原v2使用的区域 }); - 验证号码有效性:确认目标号码是标准E.164格式,且号码本身未被运营商屏蔽、处于正常使用状态。
- 检查SNS短信配额:登录AWS控制台查看SNS短信服务的日发送量、速率配额,确认是否超出限制;同时检查目标号码是否在AWS禁止发送列表中。
- 查看交付状态详情:在AWS SNS控制台的短信模块,通过返回的MessageId查询具体交付状态,查看是否有运营商拒绝、号码无效等错误提示。
- 确认IAM权限完整性:虽然策略允许
sns:Publish,但检查是否有IAM权限边界、其他附加策略限制了操作;部分区域可能需要额外的权限配置。 - 测试简化消息内容:避免包含敏感词或触发垃圾短信过滤的内容,尝试发送更简洁的测试文本。
内容的提问来源于stack exchange,提问作者Dora
相关产品推荐
相关产品推荐

