如何从消息 ID 调试 AWS SNS 的传递状态?

How to debug delivery status of AWS SNS from message ID?

我使用 AWS 发送电子邮件和短信。我知道由于邮件守护程序返回的电子邮件而导致电子邮件失败。最近,我停止在我的文本 phone 上接收 SMS 消息,即使代码运行没有问题并且我得到了 SMS 消息的消息 ID。该代码将 SMS 直接发布到 phone,而不是主题。 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-...'.

我查看了 CloudWatch console for the relevant region (eu-west-1) and do not see any metrics at all, either for SES or SNS. The docs 说明如何监控发布到主题,而不是直接发送给 phone 的消息。

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

更新

我现在在 CloudWatch 中看到一个日志组,名称如下:

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

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

我遇到的问题似乎与简单电子邮件服务中的事件有关,例如电子邮件退回和重置。虽然不明白是什么原因,但是过几天问题就解决了。

第二次更新

我在我的 SNS 控制台上看到了这张图片:

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

也可以为 SMS 直接发布启用传递状态日志记录。请参阅 this link 了解如何操作的说明。此设置将为从您在该地区的帐户发送的 所有 条短信发送日志,无论它们是通过主题发布还是直接发布。

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

  1. Open the Amazon CloudWatch console.

  2. On the navigation pane, expand Logs, and then choose Log groups.

一定要select右上角的正确区域。您在第二次更新中显示的图表来自 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 美元/月的默认配额,您必须通过详细的用例请求增加配额。