从Google Cloud Storage Bucket复制到S3 Bucket

时间:2018-01-09 13:20:19

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

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

我已经破解了使用BigQueryToCloudStorageOperator python运算符将Big Query表转移到Google Cloud Storage时没有问题。然而,似乎从谷歌云存储到S3的转移是一个不那么简单的路线,我一直无法找到我可以在我的Airflow工作流程中自动化的解决方案。

我知道rsyncgsutil的一部分,并且已经开始工作(请参阅帖子Exporting data from Google Cloud Storage to Amazon S3),但我无法将其添加到我的工作流程中。

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

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

非常感谢!

3 个答案:

答案 0 :(得分:4)

因此我们也使用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)

答案 1 :(得分:1)

Google建议将其transfer service用于云平台之间的转移。您可以使用他们的python API以编程方式设置传输。这样,数据就可以直接在S3和谷歌云存储之间传输。使用gsutilrsync的缺点是数据必须通过执行rsync命令的机器/实例。这可以是一个瓶颈。

Google Cloud Storage Transfer Service Doc

答案 2 :(得分:0)

我需要使用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存储桶的人。