使用 AzCopy 將資料從 Google Cloud Storage 複製到 Azure 儲存體

AzCopy 是命令列公用程式,可讓您在儲存體帳戶之間複製 Blob 或檔案。 此文章可協助您使用 AzCopy,將物件、目錄和貯體從 Google Cloud Storage 複製到 Azure Blob 儲存體。

選擇您要如何提供授權認證

  • 若要使用 Azure 儲存體進行授權,請使用 Microsoft Entra ID 或共用存取簽章 (SAS) 權杖。

  • 若要使用 Google Cloud Storage 進行授權,請使用服務帳戶金鑰。

使用 Azure 儲存體進行授權

請參閱開始使用 AzCopy (部分機器翻譯) 一文來下載 AzCopy,並了解如何提供授權認證給儲存體服務。

注意

本文中的範例假設您已使用 Microsoft Entra ID 提供授權認證。

如果您想改為使用 SAS 權杖來授權存取 Blob 資料,則可將該權杖附加至每個 AzCopy 命令中的資源 URL。 例如: 'https://<storage-account-name>.blob.core.windows.net/<container-name><SAS-token>'

使用 Google Cloud Storage 進行授權

若要使用 Google Cloud Storage 進行授權,您將需要使用服務帳戶金鑰。 如需有關如何建立服務帳戶金鑰的詳細資訊,請參閱建立和管理服務帳戶金鑰

取得服務金鑰之後,請將 GOOGLE_APPLICATION_CREDENTIALS 環境變數設為服務帳戶金鑰檔案的絕對路徑:

作業系統 Command
Windows set GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>
Linux export GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>
macOS export GOOGLE_APPLICATION_CREDENTIALS=<path-to-service-account-key>

複製物件、目錄和貯體

AzCopy 會使用Put Block From URL API,因此會直接在 Google Cloud Storage 與儲存體伺服器之間複製資料。 這些複製作業不會使用您電腦的網路頻寬。

提示

此節中的範例會以單引號 ('') 括住路徑引數。 除了 Windows 命令殼層 (cmd.exe) 以外,在所有命令殼層中使用單引號。 如果您使用 Windows 命令殼層 (cmd.exe),請使用雙引號 ("") 括住路徑引數,而非單引號 ('')。

這些範例也會使用具有階層命名空間的帳戶。 Data Lake Storage 上的多重通訊協定存取可讓您在那些帳戶上使用相同的 URL 語法 (blob.core.windows.net)。

複製物件

針對具有階層命名空間的帳戶,使用相同的 URL 語法 (blob.core.windows.net)。

語法

azcopy copy 'https://storage.cloud.google.com/<bucket-name>/<object-name>' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<blob-name>'

範例

azcopy copy 'https://storage.cloud.google.com/mybucket/myobject' 'https://mystorageaccount.blob.core.windows.net/mycontainer/myblob'

複製目錄

針對具有階層命名空間的帳戶,使用相同的 URL 語法 (blob.core.windows.net)。

語法

azcopy copy 'https://storage.cloud.google.com/<bucket-name>/<directory-name>' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<directory-name>' --recursive=true

範例

azcopy copy 'https://storage.cloud.google.com/mybucket/mydirectory' 'https://mystorageaccount.blob.core.windows.net/mycontainer/mydirectory' --recursive=true

注意

此範例會附加 --recursive 旗標,以複製所有子目錄中的檔案。

複製目錄內容

您可以複製目錄的內容,而不需使用萬用字元符號 (*) 來複製包含的目錄本身。

語法

azcopy copy 'https://storage.cloud.google.com/<bucket-name>/<directory-name>/*' 'https://<storage-account-name>.blob.core.windows.net/<container-name>/<directory-name>' --recursive=true

範例

azcopy copy 'https://storage.cloud.google.com/mybucket/mydirectory/*' 'https://mystorageaccount.blob.core.windows.net/mycontainer/mydirectory' --recursive=true

複製雲端儲存體貯體

針對具有階層命名空間的帳戶,使用相同的 URL 語法 (blob.core.windows.net)。

語法

azcopy copy 'https://storage.cloud.google.com/<bucket-name>' 'https://<storage-account-name>.blob.core.windows.net' --recursive=true

範例

azcopy copy 'https://storage.cloud.google.com/mybucket' 'https://mystorageaccount.blob.core.windows.net' --recursive=true

複製 Google Cloud 專案中的所有貯體

首先,將 GOOGLE_CLOUD_PROJECT 設定為 Google Cloud 專案的專案識別碼。

針對具有階層命名空間的帳戶,使用相同的 URL 語法 (blob.core.windows.net)。

語法

azcopy copy 'https://storage.cloud.google.com/' 'https://<storage-account-name>.blob.core.windows.net' --recursive=true

範例

azcopy copy 'https://storage.cloud.google.com/' 'https://mystorageaccount.blob.core.windows.net' --recursive=true

複製 Google Cloud 專案中的貯體子集

首先,將 GOOGLE_CLOUD_PROJECT 設定為 Google Cloud 專案的專案識別碼。

在貯體名稱中使用萬用字元符號 (*),以複製貯體的子集。 針對具有階層命名空間的帳戶,使用相同的 URL 語法 (blob.core.windows.net)。

語法

azcopy copy 'https://storage.cloud.google.com/<bucket*name>' 'https://<storage-account-name>.blob.core.windows.net' --recursive=true

範例

azcopy copy 'https://storage.cloud.google.com/my*bucket' 'https://mystorageaccount.blob.core.windows.net' --recursive=true

處理貯體命名規則的差異

相較於 Azure Blob 容器,Google Cloud Storage 有一組不同的貯體名稱命名慣例。 您可以在這裡閱讀相關資訊。 如果您選擇將一組貯體複製到 Azure 儲存體帳戶,複製作業可能會因為命名差異而失敗。

AzCopy 會處理可能發生的三個最常見問題:包含句點的貯體、包含連續連字號的貯體,以及包含底線的貯體。 Google Cloud Storage 貯體名稱可以包含句點和連續的連字號,但 Azure 中的容器不行。 AzCopy 會以連字號取代句點,並以數字取代連續的連字號,該數字代表連續的連字號數目 (例如:名為 my----bucket 的貯體會變成 my-4-bucket)。 如果貯體名稱具有底線 (_),則 AzCopy 會將底線取代為連字號。 例如,名為 my_bucket 的貯體會成為 my-bucket

處理物件命名規則的差異

相較於 Azure Blob,Google Cloud Storage 有一組不同的物件名稱命名慣例。 您可以在這裡閱讀相關資訊。

Azure 儲存體不允許物件名稱 (或虛擬目錄路徑中的任何區段) 以點結尾 (例如 my-bucket...)。 執行複製作業時,尾端的點會被修剪掉。

處理物件中繼資料的差異

Google Cloud Storage 和 Azure 允許在物件索引鍵的名稱中有不同的字元組合。 您可以在這裡閱讀有關 Google Cloud Storage 中繼資料的資訊。 在 Azure 端,Blob 物件索引鍵會遵守 C# 識別碼的命名規則。

作為 AzCopy copy 命令的一部分,您可以選擇性地為 s2s-handle-invalid-metadata 旗標提供值,以指定您要如何處理檔案的中繼資料包含不相容索引鍵名稱的檔案。 下表描述每一個旗標值。

旗標值 描述
ExcludeIfInvalid (預設選項) 中繼資料不會包含在已傳輸的物件中。 AzCopy 會記錄警告。
FailIfInvalid 不會複製物件。 AzCopy 會記錄錯誤,並將該錯誤包含在傳輸摘要中出現的失敗計數中。
RenameIfInvalid AzCopy 會解析無效的中繼資料索引鍵,並使用已解析的中繼資料索引鍵值組,將物件複製到 Azure。 若要了解 AzCopy 採取來將物件索引鍵重新命名的確切步驟,請參閱下面的 AzCopy 如何將物件索引鍵重新命名一節。 如果 AzCopy 無法將索引鍵重新命名,就不會複製該物件。

AzCopy 如何將物件索引鍵重新命名

AzCopy 會執行下列步驟:

  1. 以 '_' 取代無效的字元。

  2. 將字串 rename_ 新增至新的有效索引鍵開頭。

    此索引鍵將用來儲存原始中繼資料

  3. 將字串 rename_key_ 新增至新的有效索引鍵開頭。 此索引鍵將用來儲存原始中繼資料的無效。 您可以使用此索引鍵來嘗試復原 Azure 端的中繼資料,因為中繼資料索引鍵會保留為 Blob 儲存體服務上的值。

下一步

如需更多範例,請參閱以下文章:

請參閱下列文章,以進行設定、將效能最佳化,以及針對問題進行疑難排解: