我正在一个项目中,我需要将电子邮件存储在S3中,然后通过公共链接进行访问。电子邮件已成功接收并存储在S3存储桶中,问题是我无法公开访问存储的电子邮件。为了访问它,我必须从控制台手动将其公开。我已经正确设置了存储桶策略,并且为了测试它,我上传了图像,然后通过公共链接访问它,可以访问它,但是如果没有电子邮件,则可以访问。
以下是我的存储桶的策略配置:
{
"Version": "2012-10-17",
"Id": "Policy1562997205894",
"Statement": [
{
"Sid": "Stmt1562997204081",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::payprworkbucket",
"arn:aws:s3:::payprworkbucket/*"
]
}
]
}
我进行了很多搜索,发现了这个solution,但它也不适用于我。请告诉我如何解决此问题,我们将不胜感激。
答案 0 :(得分:1)
AWS论坛上一位AWS官员的最后回答描述了[1],SES服务使用 bucket-owner-full-control罐头ACL 将对象放入S3。
>查看有关 bucket-owner-full-control [2]的文档,他们指出:
对象所有者和存储桶所有者都对对象进行FULL_CONTROL。如果在创建存储桶时指定了此罐头ACL,则Amazon S3会忽略它。
因此,我认为,ACL授予存储桶拥有者读取SES放置到存储桶中的对象的权限。它还授予所有者执行更多操作的权限,例如 s3:PutObject , s3:DeleteObject , s3:GetObjectAcl , s3 :PutObjectAcl 。 [3]但是,未为所有人指定授予。
为了允许公共读取对象,您可以使用所有者帐户权限手动更新每个对象的ACL。只需通过以下cli命令授予罐头ACL 公开读取:aws s3api put-object-acl --bucket awsexamplebucket --key exampleobject --acl public-read
[4] [5]
有一篇文章介绍了如何将罐装ACL应用于大量对象。 [6]
另一种方法是使用S3跨区域复制。有一个选项可以更改副本所有者(要使此方法起作用,源桶和目标存储桶所有者必须不同)。 [7] [8]一旦存储桶所有者和对象所有者相同,则上面讨论的策略应该可以正常工作。
最后,您可以配置S3事件通知[9]来触发Lambda函数,该函数将任何传入文件复制到另一个存储桶或另一个键中,从而有效地更改了新创建对象的所有者。
[1] https://forums.aws.amazon.com/thread.jspa?threadID=219058
[2] https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#canned-acl
[3] https://docs.aws.amazon.com/AmazonS3/latest/dev/acl-overview.html#acl-access-policy-permission-mapping
[4] https://aws.amazon.com/de/premiumsupport/knowledge-center/read-access-objects-s3-bucket/
[5] https://docs.aws.amazon.com/cli/latest/reference/s3api/put-object-acl.html
[6] https://alexwilson.tech/blog/2017/11/30/updating-permissions-in-large-s3-buckets/
[7] https://docs.aws.amazon.com/AmazonS3/latest/dev/crr-change-owner.html
[8] https://docs.aws.amazon.com/AmazonS3/latest/dev/crr-walkthrough-3.html
[9] https://docs.aws.amazon.com/AmazonS3/latest/dev/NotificationHowTo.html