【发布时间】:2020-09-23 09:54:51
【问题描述】:
我有两个帐户(acc-1 和 acc-2)。acc-1 托管一个 API,用于处理将文件上传到 acc-1 的存储桶(我们称之为 upload)。上传会触发 SNS 来转换图像或转码视频。生成的文件被放入acc-1 (output) 中的另一个存储桶中,该存储桶再次触发 SNS。然后我将文件(作为用户api 从acc-1)复制到acc-2(content)中的最终存储桶。
contentacc-2 中的存储桶策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACC_1_ID>:user/api"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::content/*"
}
]
}
acc-1 中的api 用户策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::upload/*",
"arn:aws:s3:::output/*",
"arn:aws:s3:::content/*"
]
}
]
}
我使用 nodejs 的 aws-sdk 复制文件并将 ACL 设置为bucket-owner-full-control,以便来自acc-2 的用户可以访问在content 中复制的文件,尽管来自acc-1 的api 用户是仍然是文件的所有者。
这一切正常 - 文件存储在 content 存储桶中,存储桶所有者和 api 用户可以访问。
content 存储桶中的文件对其他人是私有的,应通过 Cloudfront 分发提供。
我为网络创建了一个新的 Cloudfront 发行版并使用了以下设置:
源域名:content
来源路径:/folder1
限制存储桶访问:yes
源访问身份:create new identity
授予对存储桶的读取权限:yes, update bucket policy
这创建了一个新的原始访问身份并将存储桶策略更改为:
content 之后的存储桶策略
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::<ACC_1_ID>:user/api"
},
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject"
],
"Resource": "arn:aws:s3:::content/*"
},
{
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::cloudfront:user/CloudFront Origin Access Identity <OAI_ID>"
},
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::content/*"
}
]
}
但是当我使用 Cloudfront URL 时,尝试从 folder1 文件夹内的 content 存储桶访问文件不起作用:
❌ https://abcdef12345.cloudfront.net/test1.jpg
这将返回 403“拒绝访问”。
如果我将文件 (test2.jpg) 从 acc-2 直接上传到 content/folder1 并尝试访问它,它可以工作...!?
✅ https://abcdef12345.cloudfront.net/test2.jpg
除了拥有不同的所有者之外,test1.jpg 和 test2.jpg 似乎完全相同。
我做错了什么?
【问题讨论】:
标签: amazon-web-services amazon-s3 amazon-cloudfront