从Google云存储桶复制到s3bu

2024-10-01 15:36:53 发布

您现在位置:Python中文网/ 问答频道 /正文

我已经建立了一个气流工作流,从s3接收一些文件到Google云存储,然后运行一个sql查询工作流来创建大查询的新表。在工作流的最后,我需要将最后一个大查询表的输出推送到Google云存储,然后从那里转到S3。在

我使用BigQueryToCloudStorageOperatorpython操作符成功地破解了将大查询表转移到Google云存储的问题。然而,从Google云存储到S3的转移似乎是一条不那么容易走的路线,我一直无法找到一个可以在我的气流工作流中实现自动化的解决方案。在

我知道rsync,它是gsutil的一部分,并且已经实现了这一点(参见文章Exporting data from Google Cloud Storage to Amazon S3),但我无法将其添加到我的工作流中。在

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

非常感谢你帮我解决这个问题。在

非常感谢!在


Tags: 文件fromsqldatas3google文章解决方案
3条回答

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

Python boto3库允许从GC bucket中列出并下载对象。在

下面是将“sample-data-s3.csv”对象从GC bucket复制到s3bucket的示例lambda代码。在

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 bucket下载所有对象。在

希望这能帮助那些想使用awslambda将对象从GC bucket转移到s3bucket的人。在

所以我们还使用rsync在S3和GCS之间移动数据

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

对于s3,还需要提供AWS_ACCESS_KEY_ID和{}作为环境变量。在

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

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

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

Google Cloud Storage Transfer Service Doc

相关问题 更多 >

    热门问题