You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

AWS Cognito沙箱模式下OTP短信发送失败排查求助

AWS Cognito沙箱模式下OTP短信发送失败排查方案

我在AWS中创建了用于手机号OTP验证的用户池,使用以下代码调用signUp接口发送OTP:

import { CognitoIdentityServiceProvider } from "aws-sdk";

const cognito = new CognitoIdentityServiceProvider({
  region: "ca-central-1",
});

const userPoolId = "ca-central-xxx";
const appClientId = "xxx";

export async function sendOTP(phoneNumber: string, password: string) {
  const params = {
    ClientId: appClientId,
    Username: phoneNumber,
    Password: password,
    UserAttributes: [
      {
        Name: "phone_number",
        Value: phoneNumber,
      },
    ],
  };

  return cognito.signUp(params).promise();
}

调用后返回成功响应:

{
  "UserConfirmed": false,
  "CodeDeliveryDetails": {
    "Destination": "+********2004",
    "DeliveryMedium": "SMS",
    "AttributeName": "phone_number"
  },
  "UserSub": "8cdd9528-a001-70fc-f556-xxxx"
}

但实际未收到OTP短信,控制台显示发送失败,初期能发送后续停止,处于沙箱模式且手机号已验证,更换用户池和IAM角色无效。

以下是排查问题的可能原因:

  • 沙箱模式短信配额耗尽:AWS SNS沙箱默认每日短信发送额度极低(加拿大区域通常为100条/天),初期发送成功后续停止大概率是配额用完。前往SNS控制台「短信偏好设置」查看配额使用情况,若耗尽可申请提升配额。
  • 短信模板不符合沙箱要求:沙箱模式下短信必须包含退订提示(如加拿大需符合CRTC规定,结尾添加「回复STOP取消订阅」类内容)。检查用户池「消息自定义」中的短信验证模板,若为自定义模板需确认包含合规退订说明。
  • 手机号格式不规范:确保传入的手机号严格遵循E.164标准(加拿大号码为+1XXXYYYYYYY格式),即使Cognito返回成功响应,格式错误仍可能导致运营商拒收。
  • SNS沙箱号码验证状态异常:确认目标手机号在SNS控制台「已验证号码」列表中,且状态为正常验证状态,避免出现验证过期或未正确关联的情况。
  • 运营商拦截或区域兼容性问题:部分运营商可能将AWS发送的短信标记为垃圾短信,检查手机短信拦截设置;或尝试更换同区域其他运营商的手机号测试,排除区域运营商兼容性问题。
  • Cognito角色权限配置错误:检查用户池关联的SNS角色,确认信任策略允许cognito-idp.amazonaws.com扮演该角色,且权限策略包含sns:Publish权限,同时覆盖目标手机号所在区域的SNS资源。
  • 查看CloudWatch日志定位具体错误:开启用户池「监控」中的CloudWatch日志,前往对应日志组查看Cognito发送短信的详细日志,日志中会包含SNS返回的具体错误码(如MessageRejected、InvalidParameter),帮助精准定位问题。

内容的提问来源于stack exchange,提问作者Naveed Ali Rehmani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 07:27:35