如何使用boto3从URL访问S3存储桶?

8

我被授权访问一个S3存储桶:

S3基本路径:s3://folder1/folder2/*

使用IAM用户账户:

arn:aws:iam::<账户>:user/<用户名>

我尝试了以下方法但没有成功。

import boto3
client = boto3.client(
    's3',
    aws_access_key_id='****',
    aws_secret_access_key='****'
)
obj1 = client.get_object("folder1/folder2/*") #TypeError
obj2 = boto3.resource("folder1/folder2/*") # DataNotFoundError

如有任何关于此事的帮助将不胜感激。谢谢!


你是想检索一个对象,还是列出存储桶的内容? - John Rotenstein
1个回答

6

S3路径由桶(bucket)和对象(object)组成,格式如下:

s3://<Bucket>/<Key>

您可以使用以下表达式将"s3_key"拆分为bucket和key:
bucket, key = s3_key.split('/',2)[-1].split('/',1)

要从路径 s3://folder1/folder2 访问对象,您需要执行以下操作:

import boto3
client = boto3.client('s3')
client.get_object(Bucket='folder1', Key='folder2')

如果我只能访问 s3://folder1/folder2/folder3/*,而不能访问 s3://folder1/folder2/*,那该怎么办? - piby190
1
然后,folder2/folder3/* 就是你的关键。 - Vor
1
以下的替代方案都不起作用。 1) Key="folder2/folder3" 2) Key="folder2/folder3/" 3) Key="folder2/folder3/*"然而在aws-cli上,以下命令完美地工作: aws s3 ls s3://folder1/folder2/folder3/ - piby190
1
aws s3 ls 是列出对象。这不是 get_object() 的作用,所以...没错,那根本行不通。 - Michael - sqlbot
正如sqlbot所指出的那样,get_object()不适用于列表。请尝试使用list_objects()。 http://boto3.readthedocs.org/en/latest/reference/services/s3.html#S3.Client.list_objects 使用“prefix”参数将您的文件夹指定为前缀。 - mootmoot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接