我有一个名为 .s3 的存储桶MyBucket
。
桶策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": [
"arn:aws:s3:::MyBucket/files/*"
]
}
]
}
在存储桶内,我有一个名为files
. 在里面files
,对象可以被公众看到
对于 IAM 用户,我在下面附加了内联策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:PutObjectAcl",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": "arn:aws:s3:::MyBucket/files/*"
}
]
}
当我使用 nodejs 将对象上传到存储桶时:
s3.upload({
ACL: 'public-read',
Bucket: this.app.settings.aws.s3.bucket,
Body: bufferFromFile,
Key: `files/${result.id}/${data.fileName}`,
}, {}).promise();
我有AccessDenied: Access Denied
错误。
如何解决?
更新 1:
我尝试添加s3:PutObject
评论建议的存储桶策略,但错误仍然相同。
我正在使用 EC2 来托管 nodejs 代码
更新 2
我尝试使用下面的 CLI 将一个对象上传到存储桶并且它可以工作。
aws s3 cp s3Test.html s3://MyBucket/files/
更新 3
aws s3api put-object --bucket MyBucket --key files/s3Test.html --body s3Test.html --acl public-read
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
更新 4
只是意识到在同一个 IAM 用户中有另一个可能相关的托管策略。
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "VisualEditor0",
"Effect": "Allow",
"Action": [
"s3:GetAccessPoint",
"s3:PutAccountPublicAccessBlock",
"s3:GetAccountPublicAccessBlock",
"s3:ListAllMyBuckets",
"s3:ListAccessPoints",
"s3:ListJobs",
"s3:CreateJob",
"s3:HeadBucket"
],
"Resource": "*"
},
{
"Sid": "VisualEditor1",
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::MyBucket",
"arn:aws:s3:*:*:accesspoint/*",
"arn:aws:s3:::*/*",
"arn:aws:s3:*:*:job/*"
]
}
]
}
不确定此政策是否会影响该问题。
ACL: 'public-read'
从代码中删除后它可以工作。
@Marcin 和 @John Rotenstein 提供了很好的洞察力和方向,可以在评论中找到原因。真的很感激!
s3.upload({
ACL: 'public-read', //remove this line
Bucket: this.app.settings.aws.s3.bucket,
Body: bufferFromFile,
Key: `files/${result.id}/${data.fileName}`,
}, {}).promise();
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句