使用 AzCopy 將資料從 Amazon S3 複製到 Azure 儲存體

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

注意

AzCopy 支援由 AWS 定義的標準虛擬裝載樣式或路徑樣式 URL。 例如:https://bucket.s3.amazonaws.comhttps://s3.amazonaws.com/bucket

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

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

  • 若要使用 AWS S3 進行授權,使用 AWS 存取金鑰和祕密存取金鑰。

使用 Azure 儲存體進行授權

請參閱開始使用 AzCopy 一文來下載 AzCopy,然後選擇如何為儲存體服務提供授權認證。

注意

此文章中的範例假設您已使用 AzCopy login 命令來驗證您的身分識別。 AzCopy 接著會使用您的 Microsoft Entra 帳戶來授權存取 Blob 儲存體中的資料。

如果您想改為使用 SAS 權杖來授權存取 Blob 資料,則可將該權杖附加至每個 AzCopy 命令中的資源 URL。

例如: https://mystorageaccount.blob.core.windows.net/mycontainer?<SAS-token>

使用 AWS S3 進行授權

收集您的 AWS 存取金鑰和祕密存取金鑰,然後設定下列環境變數:

作業系統 Command
Windows PowerShell:$env:AWS_ACCESS_KEY_ID=<access-key>
$env:AWS_SECRET_ACCESS_KEY=<secret-access-key>
在命令提示字元中,請使用:set AWS_ACCESS_KEY_ID=<access-key>
set AWS_SECRET_ACCESS_KEY=<secret-access-key>
Linux export AWS_ACCESS_KEY_ID=<access-key>
export AWS_SECRET_ACCESS_KEY=<secret-access-key>
macOS export AWS_ACCESS_KEY_ID=<access-key>
export AWS_SECRET_ACCESS_KEY=<secret-access-key>

這些認證可用來產生用來複製物件的預先簽署 URL。

複製物件、目錄和貯體

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

提示

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

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

複製物件

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

語法

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

範例

azcopy copy 'https://s3.amazonaws.com/mybucket/myobject' 'https://mystorageaccount.blob.core.windows.net/mycontainer/myblob'

注意

此文章中的範例使用適用於 AWS S3 貯體的路徑樣式 URL (例如:http://s3.amazonaws.com/<bucket-name>)。

您也可以使用虛擬託管樣式的 URL (例如:http://bucket.s3.amazonaws.com)。

若要深入了解貯體的虛擬託管,請參閱儲存貯體的虛擬託管

複製目錄

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

語法

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

範例

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

注意

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

複製目錄內容

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

語法

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

範例

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

複製貯體

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

語法

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

範例

azcopy copy 'https://s3.amazonaws.com/mybucket' 'https://mystorageaccount.blob.core.windows.net/mycontainer' --recursive=true

複製所有區域中的所有貯體

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

語法

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

範例

azcopy copy 'https://s3.amazonaws.com' 'https://mystorageaccount.blob.core.windows.net' --recursive=true

複製特定 S3 區域中的所有貯體

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

語法

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

範例

azcopy copy 'https://s3-rds.eu-north-1.amazonaws.com' 'https://mystorageaccount.blob.core.windows.net' --recursive=true

處理物件命名規則中的差異

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

AzCopy 會處理可能發生的其中兩個最常見問題:包含句點的貯體,以及包含連續連字號的貯體。 AWS S3 貯體名稱可以包含句點和連續的連字號,但 Azure 中的容器不行。 AzCopy 會以連字號取代句點,並以數字取代連續的連字號,該數字代表連續的連字號數目 (例如:名為 my----bucket 的貯體會變成 my-4-bucket)。

此外,當 AzCopy 複製檔案時,它會檢查命名衝突,並嘗試解決它們。 例如,如果有名稱為 bucket-namebucket.name 的貯體,AzCopy 會先將名為 bucket.name 的貯體解析為 bucket-name,然後再解析為 bucket-name-2

處理物件中繼資料中的差異

AWS S3 和 Azure 允許在物件索引鍵的名稱中有不同的字元組合。 您可以在此處閱讀 AWS S3 所使用的字元。 在 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 儲存體服務上的值。

下一步

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

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