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 RDS极光 - 通过boto3或aws cli创建跨区域读取副本
AWS ECS Docker 容器 Boto3 IAM 权限
AWS lambda 使用启动模板和 boto3 创建 ec2 实例,仅使用所需的权限