![](/img/trans.png)
[英]How to copy a file from Google Cloud Storage bucket 1 to bucket 2 while keeping ACLs using gsutil
[英]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 工作流程中自动化的解决方案。
我知道rsync
是gsutil
一部分,并且已经开始工作(请参阅将数据从 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_ID
和AWS_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云存储之间传输。 使用gsutil
和rsync
的缺点是数据必须经过执行rsync
命令的计算机/实例。 这可能是瓶颈。
我需要使用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.