【问题标题】:Why does S3 file upload not trigger event to SNS topic?为什么 S3 文件上传不会触发 SNS 主题的事件?
【发布时间】:2020-04-03 00:58:35
【问题描述】:

我希望每次将文件上传到 S3 存储桶时调用某个 HTTPS 服务。

我创建了 S3 存储桶和一个 SNS 主题,其中包含经过验证的订阅,并将 HTTPS 服务作为端点。 我可以通过 AWS UI 在 SNS 主题上发布消息,并看到 HTTPS 服务按预期调用。 在 S3 存储桶上,我创建了一个事件,它应该链接存储桶和主题。在我第一次尝试时,我得到了一个错误,因为不允许存储桶写入主题,所以 c.f.文档中,我将主题访问策略更改为:

{
  "Version": "2008-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": "*",
      "Action": "sns:Publish",
      "Resource": "arn:aws:sns:eu-central-1:TOPIC_ID:OrderUpdates",
      "Condition": {
        "StringEquals": {
          "AWS:SourceAccount": "ACCOUNT_ID"
        },
        "ArnLike": {
          "AWS:SourceArn": "arn:aws:s3:*:*:*"
        }
      }
    }
  ]
}

其中 TOPIC_ID 是在 AWS UI 中显示主题时可以看到的主题所有者 ID,ACCOUNT_ID 是在 AWS UI 中的账户设置下显示的账户 ID。 主题访问策略中的这种更改允许我在存储桶上创建事件:

当我调用 API 方法 getBucketNotificationConfiguration 我得到:

{
    "TopicConfigurations": [
        {
            "Id": "OrderFulfilled",
            "TopicArn": "arn:aws:sns:eu-central-1:TOPIC_ID:OrderUpdates",
            "Events": [
                "s3:ObjectCreated:*"
            ]
        }
    ],
    "QueueConfigurations": [],
    "LambdaFunctionConfigurations": []
}

但是没有调用 HTTPS 服务。我在此设置中缺少什么,每次将文件上传到 S3 存储桶时都会触发 SNS 主题订阅调用 HTTPS 服务?

谢谢, -路易丝

【问题讨论】:

    标签: amazon-web-services amazon-s3 amazon-sns


    【解决方案1】:

    即使我们的 sns 访问策略设置正确,S3 上传事件也不会触发 sns 消息。事实证明,我们不能使用 Enable encryption 选项,因为 S3 事件是通过 CloudWatch 警报触发的,这些警报目前不适用于 SNS 加密主题。

    切换回禁用加密选项,一切都恢复正常了。

    【讨论】:

    • S3 事件到 SNS 不起作用。 我关闭了加密,成功了!好的。我不会想到的。讨厌。
    • 如果您的主题需要加密,您可以使用客户托管的密钥进行加密,并根据 AWS 支持授予对 CloudWatch 服务的访问权限:aws.amazon.com/premiumsupport/knowledge-center/…
    【解决方案2】:

    为了重现这种情况,我做了以下操作:

    • 创建了一个Amazon SNS 主题并通过短信订阅我的手机(调试订阅的好方法!)
    • 创建了一个 Amazon S3 存储桶,其中包含一个指向 Amazon SNS 主题的事件

    我收到此错误消息:

    无法验证以下目标配置。目标主题的权限不允许 S3 发布来自此存储桶的通知。

    • 然后我添加了您在上面显示的政策(针对我的帐户和 SNS ARN 进行了调整)
    • 这使事件得以成功保存

    测试

    • 然后我通过将文件上传到 S3 存储桶来测试该事件。
    • 很快收到了短信

    因此,您的配置似乎应该成功启用通过 Amazon SNS 发送消息。这表明问题出在 HTTPS 订阅,无论是从 SNS 发送还是在应用程序中接收。

    我建议您添加电子邮件或 SMS 订阅以验证 Amazon SNS 是否正在接收主题并将其转发给订阅者。如果此操作成功,那么您将需要在 HTTPS 应用程序中调试消息的接收。

    【讨论】:

    • 嗨,约翰。谢谢您的回答。我现在添加了一个额外的电子邮件订阅,并验证它是通过通过 UI 发布关于该主题的消息来触发的。但是当我上传新文件时,我也没有收到电子邮件。您是否通过 UI 上传?您知道必须启用的任何其他设置吗?我是 AWS 的新手,所以可能我错误地阻止了存储桶在某个设置中发布消息,因为有很多设置。
    • 我完全按照上面的描述做了,只更改了策略中的帐户 ID 和 SNS ARN。我不熟悉任何可能阻止它工作的东西。我建议您在配置时“带上一个朋友”,看看是否遗漏了任何明显的步骤。 (我通过 S3 管理控制台上传。)
    • 好的,我尝试使用默认设置从头开始创建主题和存储桶,现在它可以工作了 - 谢谢。
    【解决方案3】:

    您必须添加主题配置

    阅读更多关于enable event notification

    【讨论】:

    • 是的,如果我想以编程方式设置它似乎是这样,但我也应该能够通过 UI 来实现它——就像我添加的事件屏幕截图中的设置一样?
    • 好的,我刚刚确认通过 UI 创建事件与通过 API 创建 TopicConfiguration 相同。当我调用 getBucketNotificationConfiguration 我得到: { "TopicConfigurations": [ { "Id": "OrderFulfilled", "TopicArn": "arn:aws:sns:eu-central-1:ACCOUNT_ID:OrderUpdates", "Events": [ " s3:ObjectCreated:*" ] } ], "QueueConfigurations": [], "LambdaFunctionConfigurations": [] }
    猜你喜欢
    • 2021-10-10
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-02
    • 2019-04-28
    • 1970-01-01
    • 2017-12-01
    相关资源
    最近更新 更多