AWS SNS 不再发送短信

AWS SNS is not sending SMS anymore

我一直在使用 Amazon SNS 发送 SMS 有一段时间了,但是两天前它停止工作了。我这边没有做任何改变。即使我尝试从控制台发送短信,它仍然不起作用。

我前几天只有35%的出货率,但是从昨天开始就完全没用了。

有多种方法可以解决此问题。这是 AWS 的 Developer Forum 中解决的问题。请按照以下步骤解决此问题。这些可能是基本步骤,但我指出的是所需的最一般步骤。

  1. 尝试从 AWS 控制台发送短信。如果这可行,则支出限额或交付率没有问题。 (所以你提到这也不起作用)
  2. 现在检查您的手机号码(正在接收短信)是否订阅了该主题。在某些情况下,收件人可以选择退出主题。

Where required by local laws and regulations (such as the US and Canada), SMS recipients can opt out, which means that they choose to stop receiving SMS messages from your AWS account.

  1. 检查您为日历月设置的帐户支出限额。这可能会限制您的短信发送。如果您没有设置此项,则默认为每月 1 美元。

For Account spend limit, type the maximum amount in USD that you want to spend on SMS messages each calendar month. When Amazon SNS determines that sending an SMS message would incur a cost that exceeds your spend limit for that month, Amazon SNS stops publishing SMS messages within minutes.

  1. 出于更明显的原因,请检查您的手机号码(正在接收短信)是否未阻止您的任何短信。
  2. 如果 none 这些工作,请联系 AWS 支持团队,他们将在 2 个工作日内回复您。他们一定会解决的。到目前为止,我所有的支持电话都被他们的团队成功解决了。
  1. 检查您的主题仪表板 - 查看其报告失败的消息
  2. 检查您的 phone 号码。如果您在美国并且不完全执行 +1 + areacode + 7-digits - 它将会失败。 (注意 +1 前缀!!)

从昨天开始,消息已完全停止发送,因此您可能已达到帐户的 SNS SMS 支出限额。默认情况下,AWS 区域中的 AWS 账户为 1 美元。您应该提高限额。

但将来如果您想防止这种情况发生,即如果您希望在达到帐户的实际 SMS 支出限额之前更早地收到通知,以便可以提前增加限额。这样您就不会因为达到限制而面临短信发送问题。您可以在 SMSMonthToDateSpentUSD 指标上创建 CloudWatch 警报。

请观看此视频:https://www.youtube.com/watch?v=5-HdLf_lizI

我期待同样的问题,并通过更改我的代码区域得到解决。转到您的 AWS 控制台(您在其中创建 aws 密钥的控制台),打开 SNS 并检查哪个区域显示在控制台的右上角,然后在您的代码中使用该区域 ID。我不知道为什么,但这解决了我的问题...希望对您有所帮助。

我的情况是一切正常,突然 SMS 没有通过 nodejs 代码。在完成上述回复后 - 我没有发现配额有任何问题。尝试从控制台发送消息成功。

第 1 点 - 通过云观察这是响应:

{
"notification": {
    "messageId": "ab4c51a2-d31c-5ba9-8c80-088d03fb0fbf",
    "timestamp": "2021-06-01 06:07:35.925"
},
"delivery": {
    "destination": "<Removed>",
    "smsType": "Transactional",
    "providerResponse": "total SMS message price 0.02171 is greater than requested Max price 0.003",
    "dwellTimeMs": 81
},
"status": "FAILURE"

}

所以一些面临这个问题的人可能确实遇到了这个问题。由于您指定了最高价格,您愿意为发送的 SMS 付费 - 当价格不合适时,发送失败。

你可以在这里查看 - https://aws.amazon.com/sns/sms-pricing/

我的问题 - 任何遇到这个问题/可以提供帮助的人是

在我的例子中,适用的价格是非国际价格 - 来自印度 - 印度 - 0.00278 美元,为了安全起见,我将费率指定为 0.003 美元。但是,由于某些奇怪的原因 - 它现在将价格提高到 0.02171 美元 - 即国际消息。

请让我知道是否有办法将此限制为 international/domestic - 当问题出现时,我没有更改 AWS settings/my 自己的代码中的任何内容。

编辑 1:

  1. 我增加了数量,一切正常。所以只是因为价格。
  2. 我还检查了区域问题 - 正如上面 Javier Gomez 所建议的那样,我的区域设置为 - Asia Pacific (Mumbai)ap-south-1 。所以我认为即使这样也不会导致问题 - 因为这从未改变过。

提前致谢。

我也一直在努力解决这个问题。我注意到 SNS 服务顶部的横幅显示:

Important changes for sending text messages (SMS) to US destinations Effective June 1, 2021, US telecom providers no longer support person-to-person (P2P) long codes for sending SMS messages to US destinations. To continue to send SMS messages to US destinations, register and use a valid origination ID. Learn more

所以基本上这意味着如果您想向美国 phone 号码发送短信,您必须使用 Pinpoint 设置一个“原始 ID”,它可以是一个免费电话号码。它们每月花费 2 美元,并且可以立即创建。请注意,您应该在 Cognito 在后台使用的区域内创建它。例如,我在 US-East-2 区域部署了 Cognito,但 Cognito 实际上会使用来自 US-East-1 的 SNS 服务,因此我在那里创建了原始 ID,然后一切又开始工作了。

我希望这对其他人有帮助!

我认为与上述更常见的情况相比,我认为更 edge-case,但我的解决方案可能仍然对那些最终陷入我所处的沮丧境地的人有所帮助!几个月来,我一直在使用 SNS API 发送 SMS 短信,然后突然开始无法发送到一个目的地国家/地区的移动网络 - 原因不明。联系 AWS 支持并没有提供太多见解,除了他们说目标网络的传入消息有问题,我需要自己进一步调查。 这是 cloudwatch 中的 SNS 发送错误:

    ...
        "delivery": {
           "mnc": 10,
           "numberOfMessageParts": 1,
           "destination": "+27*********",
           "priceInUSD": 0.0198,
           "smsType": "Promotional",
           "mcc": 655,
           "providerResponse": "Unknown error attempting to reach phone",
           "dwellTimeMs": 679,
           "dwellTimeMsUntilDeviceAck": 2026
       },
       "status": "FAILURE"
   ...

经过大量研究和实验,从 AWS PinPoint 获得官方 起始编号 并在 SNS API 调用中指定此起始编号 结果SNS短信再次发送成功.

注意:还要了解目标移动网络是否允许(或要求)发件人 ID - 我最初也设置了发件人 ID,但在上述解决方案起作用之前也必须将其删除。

这是获取原始号码的 link(我使用美国长代码作为我的解决方案,每月花费 2 美元...):https://docs.aws.amazon.com/pinpoint/latest/userguide/settings-sms-request-number.html

以下 python (Boto3) 代码示例显示了如何在 SNS 调用中设置发起号码:

response = sns_client.publish(
    PhoneNumber='+27*********',
    Message='test',
    MessageAttributes={
        'AWS.SNS.SMS.SMSType': {
            'DataType': 'String',
            'StringValue': 'Promotional'
        },
        'AWS.MM.SMS.OriginationNumber': {
            'DataType': 'String',
            'StringValue': '+1**********'
        }
    }
)

检查您的应用程序是否仍在沙盒环境中

要检查相同的内容,请转到控制台并转到 SNS > Text Messaging (SMS) 并添加一个 phone 您将用于测试的编号

如果您的凭据正确,现在应该可以使用了。您还可以使用仪表板发送短信