如何使用云功能调用gsutil或使用GCS对象的路径将数据从GCS移至s3存储桶

时间:2019-01-13 01:54:13

标签: python amazon-s3 google-cloud-platform google-cloud-storage google-cloud-functions

我正在尝试使用GC函数(相当于AWS Lambda)将文件从GCS移到s3存储桶。为此,我尝试了3种不同的方法。在方法1中,我得到了错误,而在其他2个选项中我没有得到错误,但文件实际上并没有被复制。

有人可以帮忙吗?

另外两个方法都用#标记,我分别尝试了每个方法。

s3_client.upload_file无法正常工作,因为它需要源文件的路径,并且当我提供“ gs:// /30327570.pdf”时,它说

“不存在此类文件或目录”

gustil命令正确执行,没有错误,但是在s3存储桶中没有创建新文件。

import os
from google.cloud import storage
import boto3
import subprocess

s3_client=boto3.client('s3',aws_access_key_id='XYZ',aws_secret_access_key='ABC')
client = storage.Client()
def hello_gcs(data, context):
    bucket = client.get_bucket(data['bucket'])
    blob = bucket.blob(data['name'])
   #subprocess.call(['gsutil -m rsync -r gs://<google_bucket_name>/30327570.pdf s3://<aws_bucket_name>'], shell=True)
    subprocess.call(['gsutil cp gs://<google_bucket_name>/30327570.pdf s3://<aws_bucket_name>'], shell=True)
   #s3_client.upload_file('gs://<google_bucket_name>/30327570.pdf','<aws_bucket_name>','30327570.pdf')

3 个答案:

答案 0 :(得分:0)

如果gsutil rsync不起作用,则可以尝试使用rclone,或将过程倒换为migrate data from S3 to GCS

答案 1 :(得分:0)

尽管这是用JavaScript编写的,但是这里有一个Google Cloud Function,可以将文件从GCS存储桶同步到S3存储桶:

https://github.com/pendo-io/gcs-s3-sync

答案 2 :(得分:0)

我曾尝试以相同的方式将文件从GCS复制到S3,但目前尚无法使用。 @Karan:我读到您已经找到了使用云功能将文件从GCS复制到S3的解决方案。可以在这里发布您的最终脚本吗?

错误消息是“找不到文件”,我试图设置文件的完整路径,但它也无法正常工作。

def hello_gcs(event, context):
s3 = boto3.client('s3', aws_access_key_id=ACCESS_KEY, aws_secret_access_key=SECRET_KEY)

file = event

try:
    print(f"Processing file: {file['name']}.")
    s3.upload_file(f"gs://<GCS_BUCKET_NAME>/{file['name']}", "<S3_BUCKET_NAME", "textfile.txt")
    print(f"Processed file: {file['name']} successful.")
    return True
except FileNotFoundError:
    print(f"The file was not found: {file['name']}")
    return False
except NoCredentialsError:
    print(f"Credentials not available {file['name']}")
    return False