跳至内容

为什么我的 Amazon SNS 主题没有收到 Amazon S3 事件通知?

2 分钟阅读
0

我创建了一个 Amazon Simple Storage Service (Amazon S3) 事件通知,以通过 Amazon Simple Notification Service (Amazon SNS) 主题发送消息。但是,我的 Amazon S3 存储桶中的新事件通知并未向 Amazon SNS 主题发布消息。

解决方法

确认您已正确配置 Amazon S3 事件类型

在配置 Amazon S3 事件通知时,所指定的支持的 Amazon S3 事件类型必须能使 Amazon S3 发送通知。如果 Amazon S3 存储桶中出现了未指定的事件类型,则 Amazon S3 不会发送通知。

确认对象键名筛选条件采用 URL 编码格式

如果您将事件通知配置为使用对象键名筛选,则 Amazon S3 仅会针对具有特定前缀或后缀的对象发布通知。

如果您在前缀或后缀中使用特殊字符,请将空格替换为“+”字符。确保以 URL 编码(百分号编码)格式输入所有其他特殊字符。有关详细信息,请参阅对象键命名准则使用对象元数据

注意: 不能在筛选条件中使用通配符(“*”)作为前缀或后缀来表示某个字符。

确认您已授予 Amazon S3 所需的权限

您 Amazon SNS 主题的基于资源的策略必须允许 Amazon S3 存储桶向该主题发布消息。检查您主题的 AWS Identity and Access Management (IAM) 策略,确认该策略具有所需的权限,并在必要时授予权限

对于使用 SSE 加密的主题,确认您的主题具有 AWS KMS 权限

如果您在 SNS 主题上激活了服务器端加密 (SSE),则您的主题必须使用客户自主管理型 AWS Key Management (AWS KMS) 密钥。Amazon S3 无法向使用默认 AWS 托管式密钥 (alias/aws/sns) 加密的主题发布内容。AWS KMS 密钥必须包含一个自定义密钥策略,以此向 Amazon S3 授予使用该密钥的权限。

要设置所需的 AWS KMS 权限,请完成以下步骤:

1.创建新的客户自主管理型 AWS KMS 密钥和密钥策略

2.编辑密钥策略,向其中添加一条声明,以便允许 Amazon S3 向您的加密 SNS 主题发布消息,如下所示:

{
    "Version":"2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Principal": {
                "Service": "s3.amazonaws.com"
            },
            "Action": [
                "kms:GenerateDataKey*",
                "kms:Decrypt"
            ],
            "Resource": "*"
        }
    ]
}

3.使用 AWS KMS 密钥为 Amazon SNS 主题配置 SSE

留出时间传送通知

Amazon S3 通常](https://docs.aws.amazon.com/AmazonS3/latest/userguide/EventNotifications.html)在几秒钟内传送[事件通知,但也可能需要一分钟或更长时间。

使用 CloudWatch 指标进行其他故障排除操作

如果 SNS 主题仍未收到 Amazon S3 事件通知,请检查 SNS 的 Amazon CloudWatch 指标 NumberOfMessagePublished。该指标显示 Amazon S3 是否发布了事件。如果 NumberOfMessagePublished 指标不存在,则表示 Amazon S3 到 Amazon SNS 的配置存在问题。

如果 NumberOfMessagePublished 指标存在,请检查 NumberOfNotificationsDeliveredNumberOfNotificationsFailed 指标。这两个指标显示 SNS 主题是否已将消息传送到订阅端点。

为了帮助您进行故障排除,您还可以为 SNS 主题配置传送状态日志记录

相关信息

演练: 为通知配置存储桶(SNS 主题或 SQS 队列)Amazon S3 通常在几秒钟内传送事件通知,但也可能需要一分钟或更长时间。

AWS 官方已更新 5 个月前