python 使用Boto3将文件上载到带前缀的S3存储桶

92vpleto  于 2023-02-11  发布在  Python
关注(0)|答案(6)|浏览(186)

我试图上传一个文件到S3 bucket,但是我没有访问bucket根级别的权限,我需要将它上传到某个前缀。

import boto3
s3 = boto3.resource('s3')
open('/tmp/hello.txt', 'w+').write('Hello, world!')
s3_client.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt')

给我一个错误:
An error occurred (AccessDenied) when calling the PutObject operation: Access Denied: ClientError Traceback (most recent call last): File "/var/task/tracker.py", line 1009, in testHandler s3_client.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt') File "/var/runtime/boto3/s3/inject.py", line 71, in upload_file extra_args=ExtraArgs, callback=Callback) File "/var/runtime/boto3/s3/transfer.py", line 641, in upload_file self._put_object(filename, bucket, key, callback, extra_args) File "/var/runtime/boto3/s3/transfer.py", line 651, in _put_object **extra_args) File "/var/runtime/botocore/client.py", line 228, in _api_call return self._make_api_call(operation_name, kwargs) File "/var/runtime/botocore/client.py", line 492, in _make_api_call raise ClientError(parsed_response, operation_name) ClientError: An error occurred (AccessDenied) when calling the PutObject operation: Access Denied
bucket_name的格式为abcd,而prefix的格式为a/b/c/d/。我不确定该错误是由于斜杠错误,还是您可以在其他地方指定前缀,或者我没有写权限(尽管我应该有)。
此代码执行时没有任何错误:

for object in output_bucket.objects.filter(Prefix=prefix):
    print(object.key)

尽管由于桶是空的而没有输出。

zdwk9cvp

zdwk9cvp1#

我想你已经准备好了

  1. AWS访问密钥ID和密钥设置(通常存储在~/.aws/credentials
    1.您可以访问S3,并且知道存储区名称和前缀(子目录)
    根据Boto 3 S3 upload_file文档,您应该按如下方式上传您的上传:
    upload_file(Filename, Bucket, Key, ExtraArgs=None, Callback=None, Config=None)
import boto3
s3 = boto3.resource('s3')
s3.meta.client.upload_file('/tmp/hello.txt', 'mybucket', 'hello.txt')

这里要注意的关键是s3.meta.client。不要忘记这一点--它对我很有效!
希望能帮上忙。

ahy6op9u

ahy6op9u2#

import boto3

s3 = boto3.resource('s3')
s3.meta.client.upload_file( 'csv1.csv', "bucketname", "prefixna/csv1.csv")
7kqas0il

7kqas0il3#

结果我需要SSE:

transfer = S3Transfer(s3_client)
transfer.upload_file('/tmp/hello.txt', bucket_name, prefix+'hello-remote.txt', extra_args={'ServerSideEncryption': "AES256"})
ztmd8pv5

ztmd8pv54#

下面是John Adjei的另一个答案。这也来自Boto3 S3 upload_file documentation。因为客户端是低级别的(低抽象/更接近机器代码),它可以提高性能-特别是如果你要处理大数据。

import boto3
s3 = boto3.client('s3')
with open("FILE_NAME", "rb") as f:
    s3.upload_fileobj(f, "BUCKET_NAME", "OBJECT_NAME")
zi8p0yeb

zi8p0yeb5#

以下是我的回答:

import boto3

s3_client = boto3.client(service_name='s3', region_name='ap-southeast-1',
                         aws_access_key_id='AWS_ACCESS_KEY_ID',
                         aws_secret_access_key='AWS_SECRET_ACCESS_KEY')

dest_bucket = 'data-lake'
dest_prefix = 'datamart/my_file_name/'

file_name = 'my_file_name'+ '.parquet'

s3.meta.client.delete_object(Bucket=dest_bucket,Key=dest_prefix + file_name)
kyvafyod

kyvafyod6#

使用resource

s3 = boto3.resource('s3')
s3.Bucket('mybucket').upload_file('/tmp/hello.txt', '/detination/s3/path/hello.txt')

带有client

s3_client = boto3.client('s3')
s3_client.upload_file('/tmp/hello.txt', 'BUCKET_NAME', '/detination/s3/path/hello.txt',)

相关问题