繁体   English   中英

从 Google Cloud Storage 存储桶复制到 S3 存储桶

[英]Copy from Google Cloud Storage Bucket to S3 Bucket

我设置了一个气流工作流,将一些文件从 s3 摄取到 Google Cloud 存储,然后运行 ​​sql 查询工作流以在 Big Query 上创建新表。 在工作流程结束时,我需要将最后一个 Big Query 表的输出推送到 Google Cloud Storage,然后从那里推送到 S3。

我已经使用BigQueryToCloudStorageOperator python 运算符破解了将 Big Query 表传输到 Google Cloud Storage 的问题。 然而,从 Google Cloud Storage 到 S3 的转移似乎是一条不太容易走的路线,我一直无法找到可以在我的 Airflow 工作流程中自动化的解决方案。

我知道rsyncgsutil一部分,并且已经开始工作(请参阅将数据从 Google Cloud Storage 导出到 Amazon S3 一文),但我无法将其添加到我的工作流程中。

我有一个在计算引擎实例上运行的 dockerised 气流容器。

非常感谢帮助解决这个问题。

非常感谢!

因此,我们还使用rsync在S3和GCS之间移动数据,

您首先需要使bash脚本正常工作,例如gsutil -m rsync -d -r gs://bucket/key s3://bucket/key

对于s3,您还需要提供AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY作为环境变量。

然后定义您的BashOperator并将其放入DAG文件中

rsync_yesterday = BashOperator(task_id='rsync_task_' + table,
                                bash_command='Your rsync script',
                                dag=dag)

Google建议使用其transfer service在云平台之间进行传输。 您可以使用其python API以编程方式设置传输。 这样,数据直接在S3和Google云存储之间传输。 使用gsutilrsync的缺点是数据必须经过执行rsync命令的计算机/实例。 这可能是瓶颈。

Google云端存储传输服务文档

我需要使用AWS Lambda将对象从GC存储桶复制到S3。

Python boto3库允许从GC存储桶中列出和下载对象。

以下是示例lambda代码,用于将“ sample-data-s3.csv”对象从GC存储桶复制到s3存储桶。

import boto3
import io

s3 = boto3.resource('s3')

google_access_key_id="GOOG1EIxxMYKEYxxMQ"
google_access_key_secret="QifDxxMYSECRETKEYxxVU1oad1b"

gc_bucket_name="my_gc_bucket"


def get_gcs_objects(google_access_key_id, google_access_key_secret,
                     gc_bucket_name):
    """Gets GCS objects using boto3 SDK"""
    client = boto3.client("s3", region_name="auto",
                          endpoint_url="https://storage.googleapis.com",
                          aws_access_key_id=google_access_key_id,
                          aws_secret_access_key=google_access_key_secret)

    # Call GCS to list objects in gc_bucket_name
    response = client.list_objects(Bucket=gc_bucket_name)

    # Print object names
    print("Objects:")
    for blob in response["Contents"]:
        print(blob)    

    object = s3.Object('my_aws_s3_bucket', 'sample-data-s3.csv')
    f = io.BytesIO()
    client.download_fileobj(gc_bucket_name,"sample-data.csv",f)
    object.put(Body=f.getvalue())

def lambda_handler(event, context):
    get_gcs_objects(google_access_key_id,google_access_key_secret,gc_bucket_name) 

您可以遍历blob以从GC存储桶下载所有对象。

希望这对希望使用AWS Lambda来将对象从GC存储桶传输到s3存储桶的人有所帮助。

最简单的整体选项是gsutil rsync ,但是在某些情况下 rsync 可能会占用太多资源或速度不够快。

其他几种选择:

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM