如何在具有两个不同项目 gcp 的 2 个存储桶之间自动复制文件?

How copy file automatically bewteen 2 buckets with two different projects gcp?

实际上我使用了那个命令,而且效果很好:

gsutil cp gs:/bucket1/file.xml gs://bucket2/destination_folder

(bucket1 在 GCP 的 project1 中,bucket2 在 GCP 的另一个项目中)

但是我想每天早上 9 点执行该命令,我怎样才能以简单的方式在我的 GCP 项目上执行该命令?

编辑:它将每天一遍又一遍地将文件从源存储桶复制到目标存储桶(这两个存储桶各自在不同的项目中)。 (实际上,当文件到达目标存储桶时,它会自动消耗并在 bigquery 中摄取,我只想触发我的命令 gsutil 并停止每天早上手动执行)

(带数据传输的方法除外,因为我没有源项目的权限,所以我无法激活数据传输的服务帐户,我只有目标项目的权限。)

此致,

实际上我可以将文件从一个存储桶复制到另一个存储桶中的特定文件夹中(RQ:2 个存储桶在同一个 gcp 项目中) 我不打算使用带有 gs://

的第二种方法

编辑 2:

import base64
import  sys
import urllib.parse
# Imports the Google Cloud client library , dont forget the requirement or else it's ko
from google.cloud import storage


def copy_blob(
    bucket_name ="prod-data", blob_name="test.csv", destination_bucket_name = "prod-data-f", destination_blob_name ="channel_p"
):
    """Copies a blob from one bucket to another with a new name."""
    bucket_name = "prod-data"
    blob_name = "test.csv"
    destination_bucket_name = "prod-data-f"
    destination_blob_name = "channel_p/test.csv"

    storage_client = storage.Client()

    source_bucket = storage_client.bucket(bucket_name)
    source_blob = source_bucket.blob("huhu/"+blob_name)
    destination_bucket = storage_client.bucket(destination_bucket_name)

    blob_copy = source_bucket.copy_blob(
        source_blob, destination_bucket, destination_blob_name
    )

# Second Method (KO)
#
#   client = storage.Client()
#   with open('gs://prod-data-f/channelp.xml','wb') as file_obj:
#       client.download_blob_to_file(
#           'gs://pathsource/somefolder/channelp.xml', file_obj)
#
# End of second Method

    print(
        "Blob {} in bucket {} copied to blob {} in bucket {}.".format(
            source_blob.name,
            source_bucket.name,
            blob_copy.name,
            destination_bucket.name,
        )
    )

数据传输显然是执行此操作的正确工具,但由于您无法使用它,因此还有其他解决方案。

其中之一是使用云功能复制文件(您可以使用 this snippet), and trigger each day at 9am that Cloud Function using Cloud Scheduler。云功能也可以通过 Pub/Sub 消息触发。

我正在寻找的解决方案(当我测试时它对我有用):

Main.py

import base64
import os
import sys
import json
import uuid
import logging
from time import sleep
from flask import request
from random import uniform
from google.cloud import firestore
from google.cloud.exceptions import Forbidden, NotFound
from google.cloud import storage

# set retry deadline to 60s
DEFAULT_RETRY = storage.retry.DEFAULT_RETRY.with_deadline(60)

def Move2FinalBucket(data, context):

#    if 'data' in event:
#        name = base64.b64decode(event['data']).decode('utf-8')
#    else:
#        name = 'NO_DATA'
#        print('Message {}!'.format(name))


    # Get cache source bucket
    cache_bucket = storage.Client().get_bucket('nameofmysourcebucket', timeout=540, retry=DEFAULT_RETRY)

    # Get source file to copy
    blob2transfer = cache_bucket.blob('uu/oo/pp/filename.csv')

    # Get cache destination bucket
    destination_bucket = storage.Client().get_bucket('nameofmydestinationbucket', timeout=540, retry=DEFAULT_RETRY)

    # Get destination file
    new_file = destination_bucket.blob('kk/filename.csv')

    #rewrite into new_file
    new_file.rewrite(blob2transfer, timeout=540, retry=DEFAULT_RETRY)

requirement.txt

# Function dependencies, for example:
# package>=version
#google-cloud-storage==1.22.0
google-cloud-storage
google-cloud-firestore
google-api-core
flask==1.1.4

不要忘记在此 CF 上添加一个具有正确存储管理员的服务帐户,它将起作用。

此致,