簡體   English   中英

如何使用 Python 從 AWS S3 發送/復制/上傳文件到 Google GCS

[英]How to send/copy/upload file from AWS S3 to Google GCS using Python

我正在尋找一種將文件從 AWS S3 復制到 GCS 的 Pythonic 方法。

我不想打開/讀取文件然后使用blob.upload_from_string()方法。 我想“按原樣”傳輸它。

不能使用'gsutils'。 林與被gcloud工作的庫的范圍,boto3(也與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)

所以我多看了一些,發現了這篇文章,最終讓我找到了這個解決方案。 顯然可以使用 AWS boto3 SDK 調用 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')


我了解您正嘗試在 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')

最后值得一提的是存儲傳輸工具,該工具旨在將大量數據從 S3 移動到 GCS。 如果這聽起來像您的用例,您可以查看 Python 的代碼示例

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM