【问题标题】:How to debug delivery status of AWS SNS from message ID?如何从消息 ID 调试 AWS SNS 的传递状态?
【发布时间】:2021-11-24 17:27:17
【问题描述】:

我使用 AWS 发送电子邮件和 SMS 消息。我知道由于 mailer-daemon 返回的电子邮件而失败的电子邮件。最近,我停止在我的文本电话上接收 SMS 消息,即使代码运行没有问题并且我获得了 SMS 消息的消息 ID。该代码将 SMS 直接发布到手机,而不是主题。 Python代码是:

import botocore
import boto3

def send_text(message):
    boto3.setup_default_session(profile_name='sms')
    try:
        resource = boto3.resource('sns', region_name="eu-west-1")
        response = resource.meta.client.publish(
            PhoneNumber=PHONE, Message=message)
        message_id = response['MessageId']
        print("Published message with text: '%s', id = '%s'." % (message, message_id))
    except botocore.exceptions.ClientError:
        print("Couldn't publish message.")
        raise

日志显示:

Published message with text: '..', id = 'f4494169-...'.

我检查了相关区域 (eu-west-1) 的 CloudWatch console 并没有看到任何指标,无论是 SES 还是 SNS。 docs 解释了如何监控发布到主题,而不是直接向手机发送消息。

如何调试短信发送并通过消息ID检查发送状态?

更新

我现在在 CloudWatch 中看到一个带有此名称的日志组:

arn:aws:logs:eu-west-1:<my AWS id>:log-group:sns/eu-west-1/<my AWS id>/DirectPublishToPhoneNumber:*

日志流仅显示成功交付而不显示失败交付,即使我的代码显示成功和失败发送的相同输出。

我的问题似乎与简单电子邮件服务中的事件有关,例如电子邮件退回和重置。虽然我不明白原因,但几天后问题就消失了。

第二次更新

我在我的 SNS 控制台上看到此图形:

我的代码显示成功和失败发送的相同结果。 SMS 消息已被标记为关键(与事务性相反)。与以前的情况不同,我在 SES 中没有触发这些失败发送的事件,并且我没有看到指向有关失败的更多信息的链接。如何调试发送失败的原因?

【问题讨论】:

  • 你激活SNS delivery status logging了吗?
  • @JohnRotenstein 不,该页面在发布到主题时提供了指导,在我的情况下,我直接发送到电话号码。
  • 啊,原来如此!我看不到为直接发送(不是通过主题)消息获取传递状态日志的方法。我向一个故意不正确的号码发送了几条消息,他们都对正确的电话号码做出了类似的回应。也许您需要为自己订阅一个主题并打开传递状态日志来调试这种情况。我见过的最常见的未送达原因与在有限制的国家/地区使用短代码有关。让我们知道你的进展!

标签: amazon-web-services amazon-sns


【解决方案1】:

也可以为 SMS 直接发布启用发送状态记录。请参阅this link 以获取有关如何执行此操作的说明。此设置将为您在该地区的帐户发送的所有 SMS 发出日志,无论它们是通过主题发布还是直接发布。

阅读details for setting up correctly。相同的文档解释了日志的监控:

  1. 打开Amazon CloudWatch console

  2. 在导航窗格中,展开日志,然后选择日志组。

请务必在右上角选择正确的区域。您在第二次更新中显示的图表来自 Amazon SNS;带有错误消息的日志位于 CloudWatch 上。在那里您会看到一个日志组,例如:

sns/eu-west-1/<your ID>/DirectPublishToPhoneNumber/Failure

点击它,你会看到几个“日志流”。单击一个,您将看到一条消息,例如:

{
    "notification": {
        "messageId": "<some ID>",
        "timestamp": "2021-11-24 09:00:25.193"
    },
    "delivery": {
        "destination": "+100000000",
        "smsType": "Transactional",
        "providerResponse": "No quota left for account",
        "dwellTimeMs": 70
    },
    "status": "FAILURE"
}

在这种情况下,SNS 有 1 美元/月的默认配额,您必须通过详细的用例请求增加。

【讨论】:

  • 如果您在控制台中配置它(例如,在console.aws.amazon.com/sns/v3/home?region=us-east-1#/mobile/… - 更改为您选择的区域),您可以将其设置为为 100% 的成功交付发出日志。您需要为此配置一个 IAM 角色。页面上还有一个创建角色的选项。
  • 抱歉,我不确定您访问 ARN 的内容是什么意思?要回答您的第二个问题,是的,所有失败的消息都会生成日志。
  • 这里解释了如何查看 CloudWatch 日志数据:docs.aws.amazon.com/AmazonCloudWatch/latest/logs/…。如果在 SNS 控制台上正确设置了 IAM 角色(还有一个自动为您生成的选项),您应该在发送几条 SMS 后有几个带有跟踪的日志组。
  • 还是这样吗?有时日志可能需要一些时间才能到达。您是否使用自动角色生成器来设置角色?生成日志消息的最快方法是尝试向您知道不存在的号码发送 SMS。
  • 听起来您已经正确设置了所有内容。我建议提交支持案例以找出问题所在。
猜你喜欢
  • 1970-01-01
  • 2018-02-06
  • 2023-03-15
  • 2017-03-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-13
  • 1970-01-01
相关资源
最近更新 更多