使用AWS SNS发送短信验证码失败求助(Golang/JS代码已返回成功)
AWS SNS发送短信返回成功但未收到消息的排查与解决方案
一、基础配置与格式排查
- 手机号格式严格校验:必须完全遵循E.164标准,格式为
+国家代码+纯数字手机号,不能包含空格、括号、短横线等符号。比如你JS代码中使用的韩国号码,要确认号码本身有效且未被运营商列入拦截名单。 - AWS区域适配:当前使用
ap-northeast-1(东京)区域,部分地区运营商对特定区域的短信网关存在限制,可尝试切换到us-east-1(弗吉尼亚)或目标号码归属地对应的AWS区域(如韩国对应ap-northeast-2首尔)测试。 - 账号短信权限与配额:检查AWS账号是否已开通SNS短信服务,新账号默认有发送配额限制,可在AWS控制台的SNS短信板块查看当前配额、发送状态及是否存在限制提示。
二、通过MessageId查询发送状态的方法
AWS SNS本身没有直接通过MessageId查询短信投递状态的API,需结合CloudWatch日志实现:
步骤1:配置SNS短信投递日志
在AWS控制台的SNS服务中,进入短信偏好设置,开启投递状态日志记录,指定日志组(如/aws/sns/sms/delivery)并关联IAM角色,确保SNS有权限写入CloudWatch日志。
步骤2:代码查询日志(Golang示例)
package main import ( "fmt" "github.com/aws/aws-sdk-go/aws" "github.com/aws/aws-sdk-go/aws/session" "github.com/aws/aws-sdk-go/service/cloudwatchlogs" ) func main() { sess := session.Must(session.NewSession(&aws.Config{ Region: aws.String("ap-northeast-1"), })) svc := cloudwatchlogs.New(sess) params := &cloudwatchlogs.FilterLogEventsInput{ LogGroupName: aws.String("/aws/sns/sms/delivery"), FilterPattern: aws.String("\"你的MessageId\""), Limit: aws.Int64(10), } resp, err := svc.FilterLogEvents(params) if err != nil { fmt.Println(err.Error()) return } for _, event := range resp.Events { fmt.Println("日志内容:", *event.Message) } }
步骤2:代码查询日志(JavaScript示例)
const { CloudWatchLogsClient, FilterLogEventsCommand } = require("@aws-sdk/client-cloudwatch-logs"); const REGION = "ap-northeast-1"; const cwClient = new CloudWatchLogsClient({ region: REGION }); async function querySMSStatus(messageId) { const params = { logGroupName: "/aws/sns/sms/delivery", filterPattern: `"${messageId}"`, limit: 10 }; try { const data = await cwClient.send(new FilterLogEventsCommand(params)); data.events.forEach(event => { console.log("投递状态详情:", event.message); }); } catch (err) { console.error("查询日志失败:", err.stack); } } // 传入你获取到的MessageId调用 querySMSStatus("xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx");
三、其他关键排查点
- 短信内容合规性:部分运营商会拦截无明确用途的测试文本(如"testing 123"),尝试发送带有明确业务场景的内容,比如"你的验证码是123456,5分钟内有效"。
- 号码运营商限制:部分虚拟运营商号码或预付费号码可能无法接收国际网关发送的短信,更换实体运营商号码测试。
- 账号验证状态:新注册的AWS账号需完成手机号验证、付款方式绑定等步骤,才能解除短信发送的限制,检查控制台是否有未完成的验证提示。
内容的提问来源于stack exchange,提问作者hyun_96
相关产品推荐
相关产品推荐

