Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何使用Python从AWS S3向Google GCS发送/复制/上载文件_Python_Amazon S3_Google Cloud Storage_Boto3_Gcloud - Fatal编程技术网

如何使用Python从AWS S3向Google GCS发送/复制/上载文件

如何使用Python从AWS S3向Google GCS发送/复制/上载文件,python,amazon-s3,google-cloud-storage,boto3,gcloud,Python,Amazon S3,Google Cloud Storage,Boto3,Gcloud,我正在寻找一种pythonic方法来将文件从AWS S3复制到GCS 我不想打开/读取文件,然后使用blob.upload\u from\u string()方法。我想按原样转让 我不能使用“gsutils”。我所使用的库的范围是gcloud,boto3(也对s3fs进行了实验) 下面是一个使用blob.upload\u from\u string()方法的简单示例(似乎有效),我试图避免使用该方法,因为我不想打开/读取文件。我无法使用blob.upload\u from_file()方法使其正

我正在寻找一种pythonic方法来将文件从AWS S3复制到GCS

我不想打开/读取文件,然后使用blob.upload\u from\u string()方法。我想按原样转让

不能使用“gsutils”。我所使用的库的范围是gcloudboto3(也对s3fs进行了实验)

下面是一个使用blob.upload\u from\u string()方法的简单示例(似乎有效),我试图避免使用该方法,因为我不想打开/读取文件。我无法使用blob.upload\u from_file()方法使其正常工作,因为GCS api需要一个可访问的、可读的、类似文件的对象,而我未能正确提供该对象

我错过了什么?建议

import boto3
from gcloud import storage
from oauth2client.service_account import ServiceAccountCredentials

GSC_Token_File = 'path/to/GSC_token'

s3 = boto3.client('s3', region_name='MyRegion') # im running from AWS Lambda, no authentication required

gcs_credentials = ServiceAccountCredentials.from_json_keyfile_dict(GSC_Token_File)
gcs_storage_client = storage.Client(credentials=gcs_credentials, project='MyGCP_project')
gcs_bucket = gcs_storage_client.get_bucket('MyGCS_bucket')

s3_file_to_load = str(s3.get_object(Bucket='MyS3_bucket', Key='path/to/file_to_copy.txt')['Body'].read().decode('utf-8'))
blob = gcs_bucket.blob('file_to_copy.txt')

blob.upload_from_string(s3_file_to_load)


我知道您试图在AWS Lambda函数中使用Python将文件从S3移动到CGS。有一件事我想从“我不想打开/读取文件”这句话中澄清,那就是当文件从S3下载时,您确实在读取它并将其写入某个地方,无论是内存字符串还是临时文件。从这个意义上说,实际上使用
blob.upload\u from\u file()
blob.upload\u from\u string()
中的哪一个并不重要,因为它们是等效的;第一个将从文件中读取,而第二个不会,因为数据已在内存中读取。因此,我的建议是保持代码的原样,我看不出修改它有什么好处

无论如何,文件方法应该可以按照下面的思路进行操作(未经测试,我没有S3要检查):


最后值得一提的是,该工具旨在将大量数据从S3移动到GCS。如果这听起来像是您的用例,您可以看看Python的解决方案。

所以我仔细研究了一下,发现了一篇文章,这篇文章最终引导我找到了解决方案。显然,可以使用AWSboto3SDK调用GCS API

请注意HMAC密钥先决条件,它可以使用说明轻松创建

import boto3

# im using GCP Service Account so my HMAC was created accordingly. 
# HMAC for User Account can be created just as well

service_Access_key = 'YourAccessKey'
service_Secret = 'YourSecretKey'

# Reminder: I am copying from S3 to GCS
s3_client = boto3.client('s3', region_name='MyRegion')
gcs_client  =boto3.client(
        "s3", # !just like that
        region_name="auto",
        endpoint_url="https://storage.googleapis.com",
        aws_access_key_id=service_Access_key,
        aws_secret_access_key=service_Secret,
    )


file_to_transfer = s3_client.get_object(Bucket='MyS3_bucket', Key='path/to/file_to_copy.txt')
gcs_client.upload_fileobj(file_to_transfer['Body'], 'MyGCS_bucket', 'file_to_copy.txt')



非常感谢你
import boto3

# im using GCP Service Account so my HMAC was created accordingly. 
# HMAC for User Account can be created just as well

service_Access_key = 'YourAccessKey'
service_Secret = 'YourSecretKey'

# Reminder: I am copying from S3 to GCS
s3_client = boto3.client('s3', region_name='MyRegion')
gcs_client  =boto3.client(
        "s3", # !just like that
        region_name="auto",
        endpoint_url="https://storage.googleapis.com",
        aws_access_key_id=service_Access_key,
        aws_secret_access_key=service_Secret,
    )


file_to_transfer = s3_client.get_object(Bucket='MyS3_bucket', Key='path/to/file_to_copy.txt')
gcs_client.upload_fileobj(file_to_transfer['Body'], 'MyGCS_bucket', 'file_to_copy.txt')