为什么 S3 文件上传不触发事件到 SNS 主题?
Why does S3 file upload not trigger event to SNS topic?
我希望每次将文件上传到 S3 存储桶时调用某个 HTTPS 服务。
我已经创建了 S3 存储桶和一个 SNS 主题,其中包含经过验证的订阅,并将 HTTPS 服务作为端点。
我可以通过 AWS UI 在 SNS 主题上发布消息,并看到 HTTPS 服务按预期被调用。
在 S3 存储桶上,我创建了一个事件,它应该 link 存储桶和主题。第一次尝试时出现错误,因为不允许存储桶写入主题,所以 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 是帐户设置下显示的帐户 ID AWS UI。
主题访问策略中的这一更改允许我在存储桶上创建事件:
当我调用 API 方法 getBucketNotificationConfiguration 时,我得到:
{
"TopicConfigurations": [
{
"Id": "OrderFulfilled",
"TopicArn": "arn:aws:sns:eu-central-1:TOPIC_ID:OrderUpdates",
"Events": [
"s3:ObjectCreated:*"
]
}
],
"QueueConfigurations": [],
"LambdaFunctionConfigurations": []
}
但是没有调用HTTPS服务。我在此设置中缺少什么,每次将文件上传到 S3 存储桶时都会触发 SNS 主题订阅调用 HTTPS 服务?
谢谢,
-路易丝
您必须添加主题配置
阅读更多关于 enable event notification
为了重现这种情况,我做了以下操作:
- 创建了一个 Amazon SNS 主题 并且 订阅了 我的 phone 通过短信(调试订阅的好方法!)
- 创建了一个 Amazon S3 存储桶,其中 事件 指向 Amazon SNS 主题
我收到此错误消息:
Unable to validate the following destination configurations. Permissions on the destination topic do not allow S3 to publish notifications from this bucket.
- 然后我添加了上面显示的策略(针对我的帐户和 SNS ARN 进行了调整)
- 这使得事件成功保存
测试
- 然后我通过将文件上传到 S3 存储桶来测试该事件。
- 我很快就收到了短信
因此,看起来您的配置应该成功启用通过 Amazon SNS 发送的消息。这表明问题出在 HTTPS 订阅,要么是从 SNS 发送,要么是在应用程序中接收。
我建议您添加电子邮件或短信订阅,以验证 Amazon SNS 是否正在接收主题并将其转发给订阅者。如果此操作成功,那么您将需要在 HTTPS 应用程序中调试消息的接收。
即使我们的 sns 访问策略设置正确,S3 上传事件也不会触发 sns 消息。事实证明我们不能使用 Enable encryption
选项,因为 S3 事件是通过 CloudWatch 警报触发的,它目前不适用于 SNS encrypted 主题。
切换回 禁用加密 选项,一切正常。
我希望每次将文件上传到 S3 存储桶时调用某个 HTTPS 服务。
我已经创建了 S3 存储桶和一个 SNS 主题,其中包含经过验证的订阅,并将 HTTPS 服务作为端点。 我可以通过 AWS UI 在 SNS 主题上发布消息,并看到 HTTPS 服务按预期被调用。 在 S3 存储桶上,我创建了一个事件,它应该 link 存储桶和主题。第一次尝试时出现错误,因为不允许存储桶写入主题,所以 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 是帐户设置下显示的帐户 ID AWS UI。
主题访问策略中的这一更改允许我在存储桶上创建事件:
当我调用 API 方法 getBucketNotificationConfiguration 时,我得到:
{
"TopicConfigurations": [
{
"Id": "OrderFulfilled",
"TopicArn": "arn:aws:sns:eu-central-1:TOPIC_ID:OrderUpdates",
"Events": [
"s3:ObjectCreated:*"
]
}
],
"QueueConfigurations": [],
"LambdaFunctionConfigurations": []
}
但是没有调用HTTPS服务。我在此设置中缺少什么,每次将文件上传到 S3 存储桶时都会触发 SNS 主题订阅调用 HTTPS 服务?
谢谢, -路易丝
您必须添加主题配置
阅读更多关于 enable event notification
为了重现这种情况,我做了以下操作:
- 创建了一个 Amazon SNS 主题 并且 订阅了 我的 phone 通过短信(调试订阅的好方法!)
- 创建了一个 Amazon S3 存储桶,其中 事件 指向 Amazon SNS 主题
我收到此错误消息:
Unable to validate the following destination configurations. Permissions on the destination topic do not allow S3 to publish notifications from this bucket.
- 然后我添加了上面显示的策略(针对我的帐户和 SNS ARN 进行了调整)
- 这使得事件成功保存
测试
- 然后我通过将文件上传到 S3 存储桶来测试该事件。
- 我很快就收到了短信
因此,看起来您的配置应该成功启用通过 Amazon SNS 发送的消息。这表明问题出在 HTTPS 订阅,要么是从 SNS 发送,要么是在应用程序中接收。
我建议您添加电子邮件或短信订阅,以验证 Amazon SNS 是否正在接收主题并将其转发给订阅者。如果此操作成功,那么您将需要在 HTTPS 应用程序中调试消息的接收。
即使我们的 sns 访问策略设置正确,S3 上传事件也不会触发 sns 消息。事实证明我们不能使用 Enable encryption
选项,因为 S3 事件是通过 CloudWatch 警报触发的,它目前不适用于 SNS encrypted 主题。
切换回 禁用加密 选项,一切正常。