为什么 S3 文件上传没有触发事件到 SNS 主题?

Lul*_*ull 2 amazon-s3 amazon-web-services amazon-sns

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

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

{
  "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:*:*:*"
        }
      }
    }
  ]
}
Run Code Online (Sandbox Code Playgroud)

其中 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": []
}
Run Code Online (Sandbox Code Playgroud)

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

谢谢,-路易斯

LeO*_* Li 8

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

切换回禁用加密选项,一切正常。

  • 如果您的主题需要加密,您可以使用客户管理的密钥进行加密,并根据 AWS 支持授予对 CloudWatch 服务的访问权限:https://aws.amazon.com/premiumsupport/knowledge-center/cloudwatch-receive-sns -警报触发/ (2认同)

Joh*_*ein 1

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

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

我收到此错误消息:

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

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

测试

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

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

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