我正在
调用ListObjects操作时发生错误(AccessDenied):拒绝访问
当我尝试从我的S3存储桶中获取文件夹时。
使用此命令
aws s3 cp s3://bucket-name/data/all-data/ . --recursive
存储桶的IAM权限如下所示
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname/*"
]
}
] }
我需要更改哪些内容才能成功copy
和ls
?
答案 0 :(得分:134)
您已授权对S3存储桶内的对象执行命令,但您未授权对存储桶本身执行任何操作。将您的政策修改为以下内容:
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:*"
],
"Resource": [
"arn:aws:s3:::bucketname",
"arn:aws:s3:::bucketname/*"
]
}
] }
答案 1 :(得分:19)
如果要使用命令" aws s3 cp s3:// bucket-name / data / all-data /递归复制所有s3存储桶对象。 --recursive"正如您所提到的,这是执行此操作所需的最低政策:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
]
},
{
"Effect": "Allow",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/data/all-data/*"
]
}
]
}
此策略中的第一个语句允许列出存储桶内的对象。请注意,使用此设置,您还可以在此存储桶的子目录中列出对象。似乎不可能仅对s3子目录赋予ls权限,因此尝试将此操作应用于资源" arn:aws:s3 ::: // bucket-name / data / all-数据/"不能按预期工作(我已经测试并尝试了多种方法,这里的帮助将不胜感激)。
此策略中的第二个语句允许在特定子目录中获取存储桶内的对象。这意味着" s3:// bucket-name / data / all-data /"你将能够复制的路径。请注意,这不允许您从父路径复制,例如" s3:// bucket-name / data /"。
这里可以找到类似的问题,这使我得到了解决方案。 https://github.com/aws/aws-cli/issues/2408
希望这有帮助!
答案 2 :(得分:9)
您必须通过“arn:aws:3 ::: bucketname”或“arn:aws:3 ::: bucketname *”为存储桶指定资源。后者是首选,因为它也允许对铲斗的物体进行操纵。请注意,没有斜线!
列出对象是Bucket上的一个操作。因此,需要操作“s3:ListBucket”。 将对象添加到Bucket是对Object的操作。因此,需要动作“s3:PutObject”。 当然,您可能希望根据需要添加其他操作。
{
"Version": "version_id",
"Statement": [
{
"Sid": "some_id",
"Effect": "Allow",
"Action": [
"s3:ListBucket",
"s3:PutObject"
],
"Resource": [
"arn:aws:s3:::bucketname*"
]
}
]
}
答案 3 :(得分:4)
我无法访问S3,因为
解决方案:WKWebViewConfiguration * config = [WKWebViewConfiguration new];
config.websiteDataStore = [WKWebsiteDataStore nonPersistentDataStore];
webView = [[WKWebView alloc]initWithFrame:viewFrame configuration:config];
,然后rm -rf .aws/credentials
使用角色。
答案 4 :(得分:2)
我在使用如下政策时遇到了同样的错误,虽然我有" s3:ListBucket"对于s3:ListObjects操作。
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucketname>/*",
"arn:aws:s3:::*-bucket/*"
],
"Effect": "Allow"
}
]
}
然后我通过添加一行来修复它 &#34; arn:aws:s3 ::: bucketname&#34;
{
"Version": "2012-10-17",
"Statement": [
{
"Action": [
"s3:ListBucket",
"s3:GetObject",
"s3:GetObjectAcl"
],
"Resource": [
"arn:aws:s3:::<bucketname>",
"arn:aws:s3:::<bucketname>/*",
"arn:aws:s3:::*-bucket/*"
],
"Effect": "Allow"
}
]
}
答案 5 :(得分:2)
我以为该错误是由于“ s3:ListObjects” 操作引起的,但是我不得不添加操作“ s3:ListBucket” 来解决“ AccessDenied for S3存储桶的ListObjects”
答案 6 :(得分:2)
我面临着同样的问题。我刚刚添加了凭据配置:
aws_access_key_id = your_aws_access_key_id
aws_secret_access_key = your_aws_secret_access_key
进入“〜/ .aws / credentials” +重新启动终端以获取默认配置文件。
如果是多个配置文件,则需要添加-profile arg:
aws s3 sync ./localDir s3://bucketName --profile=${PROFILE_NAME}
其中 PROFILE_NAME :
.bash_profile ( or .bashrc) -> export PROFILE_NAME="yourProfileName"
有关如何配置凭据和多配置文件的更多信息,请参见here
答案 7 :(得分:1)
我尝试了以下操作:
aws s3 ls s3.console.aws.amazon.com/s3/buckets/{bucket name}
这给了我错误:
An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied
使用此表单有效:
aws s3 ls {bucket name}
答案 8 :(得分:0)
遇到了类似的问题,对我来说,问题是我在bash_profile中设置了不同的AWS密钥。
我在这里回答了类似的问题:https://stackoverflow.com/a/57317494/11871462
如果您的bash_profile中的AWS密钥冲突,则AWS CLI默认为这些密钥。
答案 9 :(得分:0)
我遇到了这个问题 我的要求是我希望允许用户写入特定路径
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>/scripts",
"arn:aws:s3:::<bucketname>/scripts/*"
]
},
并且此更改解决了问题
{
"Sid": "raspiiotallowspecificBucket",
"Effect": "Allow",
"Action": [
"s3:GetObject",
"s3:PutObject",
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::<bucketname>",
"arn:aws:s3:::<bucketname>/*"
]
},
答案 10 :(得分:0)
我要添加的答案的方向与接受的答案相同,但差异很小(重要),并添加更多详细信息。
请考虑以下配置:
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": ["s3:ListBucket"],
"Resource": ["arn:aws:s3:::<Bucket-Name>"]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:DeleteObject"
],
"Resource": ["arn:aws:s3:::<Bucket-Name>/*"]
}
]
}
该策略授予程序性写-删除访问权限,并分为两部分:
ListBucket
操作提供存储桶级别的权限,其他PutObject/DeleteObject
操作则需要存储桶内部的对象的权限。
第一个Resource元素为arn:aws:s3:::<Bucket-Name>
操作指定ListBucket
,以便应用程序可以列出存储桶中的所有对象。
第二个Resource元素为arn:aws:s3:::<Bucket-Name>/*
和PutObject
操作指定DeletObject
,以便应用程序可以写入或删除存储桶中的任何对象。
出于安全原因,将两个不同的“ arns”分开很重要,以便指定存储桶级和对象级细粒度权限。
请注意,如果我在第二个块中仅指定了GetObject
,将会发生的情况是,在进行程序访问的情况下,我将收到类似以下的错误:
Upload failed: <file-name> to <bucket-name>:<path-in-bucket> An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
。
答案 11 :(得分:0)
我比以前的任何一个答案都更喜欢这个。它显示了如何使用YAML格式,并允许您使用变量指定存储桶。
- PolicyName: "AllowIncomingBucket"
PolicyDocument:
Version: "2012-10-17"
Statement:
- Effect: "Allow"
Action: "s3:*"
Resource:
- !Ref S3BucketArn
- !Join ["/", [!Ref S3BucketArn, '*']]
答案 12 :(得分:0)
我的问题是设置
env:
AWS_ACCESS_KEY_ID: {{ secrets.AWS_ACCESS_KEY_ID }}
AWS_SECRET_ACCESS_KEY: {{ secrets.AWS_SECRET_ACCESS_KEY }}
再次,在 aws-sync GitHub Action 下作为环境变量。它们来自我的 GitHub 设置。虽然在我的情况下,我在上一步中扮演了一个角色,它将为我设置一些新的键到那些同名的环境变量中。所以我用坏的 GitHub 基本密钥覆盖了好的假设密钥。
如果您要担任角色,请注意这一点。
答案 13 :(得分:0)
我遇到了同样的问题。我必须提供正确的资源和操作,资源是您的存储桶的 arn 和您想要的权限中的操作。另外请确保您拥有正确的用户 arn。以下是我的解决方案。
{
"Version": "2012-10-17",
"Id": "Policy1546414123454",
"Statement": [
{
"Sid": "Stmt1546414471931",
"Effect": "Allow",
"Principal": {
"AWS": "arn:aws:iam::123456789101:root"
},
"Action": ["s3:ListBucket", "s3:ListBucketVersions"],
"Resource": "arn:aws:s3:::bucket-name"
}
]
}
答案 14 :(得分:0)
这是对我有用的政策。
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::bucket-name"
]
},
{
"Effect": "Allow",
"Principal": "*",
"Action": [
"s3:GetObject"
],
"Resource": [
"arn:aws:s3:::bucket-name/*"
]
}
]
}
答案 15 :(得分:-1)
要在s3存储桶中允许权限,请转至s3存储桶中的“权限”标签,然后在存储桶策略中将操作更改为此,这将允许执行所有操作:
let test1 = '2=2';
let test2 = '8<7';
let test3 = '5=13';
let test4 = '15>4';
function isTrue(relation) {
let separate = [];
let num1 = 0;
let num2 = 0;
let newArray = [];
let a = 0;
let b = 0;
if (relation.includes('=')) {
separate = relation.split('=');
num1 = parseInt(separate[0]);
num2 = parseInt(separate[1]);
newArray = [num1, num2];
a = newArray[0];
b = newArray[1];
if (a === b) {
return true;
} else {
return false;
}
} else if (relation.includes('<')) {
separate = relation.split('<');
num1 = parseInt(separate[0]);
num2 = parseInt(separate[1]);
newArray = [num1, num2];
a = newArray[0];
b = newArray[1];
if (a < b) {
return true;
} else {
return false;
}
} else if (relation.includes('>')) {
separate = relation.split('>');
num1 = parseInt(separate[0]);
num2 = parseInt(separate[1]);
newArray = [num1, num2];
a = newArray[0];
b = newArray[1];
if (a > b) {
return true;
} else {
return false;
}
} else {
return 'This is not a valid comparison. Please try again.';
}
}
isTrue(test1);
isTrue(test2);
isTrue(test3);
isTrue(test4);