【问题标题】:How to send/copy/upload file from AWS S3 to Google GCS using Python如何使用 Python 将文件从 AWS S3 发送/复制/上传到 Google GCS
【发布时间】:2020-11-11 10:03:38
【问题描述】:

我正在寻找一种将文件从 AWS S3 复制到 GCS 的 Python 方法。

我不想打开/读取文件然后使用 blob.upload_from_string() 方法。我想“按原样”转移它。

不能使用“gsutils”。我使用的库的范围是 gcloudboto3(也尝试了 s3fs)。

这是一个使用 blob.upload_from_string() 方法的简单示例(似乎有效),我试图避免该方法,因为我不想打开/读取文件。我无法使用 blob.upload_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)

【问题讨论】:

    标签: python amazon-s3 google-cloud-storage boto3 gcloud


    【解决方案1】:

    所以我又看了看this 文章,最终我找到了this 解决方案。显然可以使用 AWS boto3 SDK 调用 GCS API。

    请注意可以使用these 指令轻松创建的 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')
    
    
    

    【讨论】:

      【解决方案2】:

      我了解到您正在尝试在 AWS Lambda 函数中使用 Python 将文件从 S3 移动到 CGS。我想从“我不想打开/读取文件”的声明中澄清一件事,那就是当从 S3 下载文件时,您确实是在读取它并将其写入某处,无论是内存中的字符串或临时文件。从这个意义上说,使用blob.upload_from_file()blob.upload_from_string() 中的哪一个实际上并不重要,因为它们是等效的;第一个将从文件中读取,第二个不会,因为数据已经在内存中读取。因此,我的建议是保持代码不变,我认为更改它没有任何好处。

      无论如何,文件方法应该可以按照以下方式做一些事情(未经测试,我没有要检查的 S3):

      # From S3 boto docs: https://boto3.amazonaws.com/v1/documentation/api/latest/guide/s3-example-download-file.html
      s3.download_file('BUCKET_NAME', 'OBJECT_NAME', 'FILE_NAME')
      blob.upload_from_file('FILE_NAME')
      

      最后值得一提的是Storage Transfer 工具,它用于将大量数据从 S3 移动到 GCS。如果这听起来像您的用例,您可以查看用于 Python 的 code samples

      【讨论】:

        猜你喜欢
        • 2020-01-04
        • 1970-01-01
        • 1970-01-01
        • 2018-07-07
        • 1970-01-01
        • 1970-01-01
        • 2018-04-04
        • 2018-07-09
        • 1970-01-01
        相关资源
        最近更新 更多