AWS CLI 和 BOTO3 开发工具包(权限问题)

Posted

技术标签:

【中文标题】AWS CLI 和 BOTO3 开发工具包(权限问题)【英文标题】:AWS CLI and BOTO3 SDK (permissions issue) 【发布时间】:2020-04-21 05:24:48 【问题描述】:

我可以像这样使用 aws cli 下载 s3 文件夹:

aws s3 cp --recursive s3://bucketname/custom-folder /tmp

但我无法列出 boto3 库中的文件夹文件:

import boto3

s3 = boto3.resource('s3')
bucket = s3.Bucket('my-bucket')
for obj in bucket.objects.all():
    print(obj.key)

botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the ListObjects operation: Access Denied

但是,如果我知道特定路径,我可以下载特定文件,因为 bash 命令可以正常工作,所以我知道:

s3.download_file(Bucket='mybucket',Key='custom-folder/1.gz',Filename='/tmp/1.gz')

我的问题是:

如何在没有读取/列出 S3 存储桶中文件的权限的情况下在 Boto3 中递归下载一个文件夹?????

谢谢!

【问题讨论】:

你从 lambda 函数运行 boto3 吗? nop,在我自己机器上的脚本上(docker 容器) 听起来 IAM 角色缺少s3:ListObjects 权限。您的 IAM 角色配置是什么? 我不知道,因为凭据来自第三方公司。 【参考方案1】:

--recursive 命令实际上需要列出文件才能知道要复制哪些文件。因此,您似乎被授予列出文件的权限,但仅限于custom-folder

您可以使用以下方法进行测试:

aws s3 ls s3://bucketname/custom-folder

如果可行,您可以使用以下方法修改您的 Python 应用:

for obj in bucket.objects.filter(Prefix='custom-folder/'):

这应该将列表请求限制在该文件夹中。

如果有问题,您可能需要使用 API 调用的 client 版本,而不是 resource 版本。

【讨论】:

是的,前缀参数是关键。我添加了前缀,我可以列出自定义文件夹中的所有文件和子目录,谢谢!虽然我仍然不明白我是否在 cli 上制作:aws s3 ls s3://bucketname/custom-folder 我得到了一个权限被拒绝:An error occurred (AccessDenied) when calling the ListObjectsV2 operation: Access Denied

以上是关于AWS CLI 和 BOTO3 开发工具包(权限问题)的主要内容,如果未能解决你的问题,请参考以下文章

AWS 无法对 cli 执行操作

AWS RDS极光 - 通过boto3或aws cli创建跨区域读取副本

AWS ECS Docker 容器 Boto3 IAM 权限

AWS lambda 使用启动模板和 boto3 创建 ec2 实例,仅使用所需的权限

如何使用 python boto3 将新角色权限附加到 aws 中的 iam_role?

AWS Glue - boto3 爬虫未创建表