google-cloud-storage - 以编程方式将文件从 Azure Blob 存储传输到 Google Cloud Storage

标签 google-cloud-storage azure-blob-storage azure-data-factory

我有许多文件通过 Azure 数据工厂传输到 Azure Blob 存储。不幸的是,这个工具似乎没有为任何值设置 Content-MD5 值,所以当我从 Blob 存储 API 中提取该值时,它是空的。

我的目标是将这些文件从 Azure Blob 存储传输到 Google 存储。我在 https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec#HttpData 上看到的有关 Google Storagetransfer 服务的文档表示如果我提供包含 URL、长度(以字节为单位)和每个文件的 MD5 哈希的文件列表,我可以轻松启动此类传输。

好吧,我可以轻松地从 Azure 存储中提取前两个,但第三个似乎不会自动由 Azure 存储填充,我也找不到任何方法让它这样做。

不幸的是,我的其他选择看起来很有限。到目前为止的可能性:

  • 将文件下载到本地机器,确定哈希值并更新 Blob MD5 值
  • 看看我是不是不能在同一个区域中编写一个 Azure Functions 应用程序来计算哈希值并将其写入容器中每个的 blob
  • 使用来自数据工厂的 Amazon S3 导出,然后根据 https://cloud.google.com/storage/transfer/reference/rest/v1/TransferSpec#AwsS3Data 使用 Google 对从 S3 导入的支持将其从那里拉出但这似乎真的是在浪费带宽(而且我必须设置一个亚马逊帐户)。

  • 理想情况下,我希望能够编写一个脚本,然后点击开始并不管它。我没有从 Azure 获得最快的下载速度,所以 #1 会不太理想,因为它需要很长时间。

    还有其他方法吗?

    最佳答案

    我知道为你回答这个问题有点晚了,但它可能会帮助其他所有正在尝试的人迁移数据来自 Azure Blob 存储 谷歌云存储

    谷歌云存储和 Azure Blob 存储这两个平台都是存储服务,没有命令行界面,我们可以在其中简单地运行传输命令。为此,我们需要一个中间计算实例,它实际上能够运行所需的命令。我们将按照以下步骤来实现云到云的传输。

    首先,在 Google Cloud Platform 中创建一个计算实例。您无需创建计算能力强大的实例,您只需要一台 Debian-10GB 机器,带有 2 核 CPU 和 4 GB 内存。

    在早期,您可能会将数据下载到 GCP 中的计算实例,然后将其进一步移动到 Google Cloud Storage。但是现在随着gcsfuse的引入我们可以简单地将 Google 存储帐户挂载为文件系统。

    创建计算实例后,只需使用 SSH 登录到该实例即可。从 Google Console 并安装以下软件包。

    Install Google Cloud Storage Fuse

    export GCSFUSE_REPO=gcsfuse-`lsb_release -c -s`
    echo "deb http://packages.cloud.google.com/apt $GCSFUSE_REPO main" | sudo tee /etc/apt/sources.list.d/gcsfuse.list
    curl https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo apt-key add -
    
    sudo apt-get update -y
    sudo apt-get install gcsfuse -y
    
    # Create local folder 
    mkdir local_folder_name
    
    # Mount the Storage Account as a bucket
    gcsfuse <bucket_name> <local_folder_path>
    

    Install Azcopy
    wget https://aka.ms/downloadazcopy-v10-linux
    tar -xvf downloadazcopy-v10-linux
    sudo cp ./azcopy_linux_amd64_*/azcopy /usr/bin/
    

    安装这些软件包后,下一步是创建共享签名访问 key 。如果您有 Azure Blob 存储资源管理器,只需右键单击目录树中的存储帐户名称并选择 Generate Shared Access Signature
    现在,您必须为 blob 对象创建一个 URL。为此,只需右键单击任何 blob 对象,选择 Properties并从对话框中复制 URL。

    您的最终网址应如下所示。
    <https://URL_to_file> + <SAS Token>
    
    https://myaccount.blob.core.windows.net/sascontainer/sasblob.txt?sv=2015-04-05&st=2015-04-29T22%3A18%3A26Z&se=2015-04-30T02%3A23%3A26Z&sr=b&sp=rw&sip=168.1.5.60-168.1.5.70&spr=https&sig=Z%2FRHIX5Xcg0Mq2rqI3OlWTjEg2tYkboXr1P9ZUXDtkk%3D
    

    现在,使用以下命令开始将文件从 Azure 复制到 GCP 存储。
    azcopy cp --recursive=true "<-source url->" "<-destination url->"
    

    如果您的工作失败,您可以使用以下方法列出您的工作:
    azcopy jobs list
    

    并恢复失败的工作:
    azcopy jobs resume jobid <-source sas->
    

    您可以将所有步骤整理到一个 bash 中,让它一直运行直到您的数据传输完成。

    就这样!我希望它能帮助别人

    关于google-cloud-storage - 以编程方式将文件从 Azure Blob 存储传输到 Google Cloud Storage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41157327/

    相关文章:

    Azure数据工厂: Handling inner failure in until/for activity

    python - Azure blob 触发器错误 :The condition specified using HTTP conditional header(s) is not met

    firebase - 云函数内如何获取存储file.txt内容

    firebase - 从 Google Cloud Storage 获取永久 URL?

    android - 如何通过 Google Cloud Endpoint API (Android) 在 Google Datastore 上获取和设置对象

    windows - 在 Azure Blob 存储中存储我的角色服务包有多安全?

    java - Azure Java SDK - VHD 上传

    Azure数据工厂: filter rows from parquet input file and output the result to delimited file

    azure - 从数据工厂链接服务获取存储帐户名称

    javascript - Firebase storage.object().onChange 现已弃用,