AzCopyでデータコピー:GCSからAzure Storage
1. この記事の範囲
この記事では、AzCopyを使用してGoogle Cloud Storage(以下、GCS)から Azure Blob Storageへのデータコピー方法について解説します。この記事では認証設定、SASトークン生成、データコピーの手順、命名規則の違い、メタデータの互換性について記載します。
2. 内容
2-1. 認証資格
AzCopyを使用してGCSかAzure Blob Storageにオブジェクト、ディレクトリ、バケットをコピーするには、それぞれのストレージに対応した認証資格が必要です。
Google Cloud Storage:
-
権限:
GCSバケットへの読み取り権限(例:roles/storage.objectViewer
またはroles/storage.admin
)。 -
認証方法:
サービス アカウント キーを使用し、GOOGLE_APPLICATION_CREDENTIALS
環境変数にキー ファイルの絶対パスを設定します。
Azure Storage:
-
権限:
Azure Storageコンテナへの書き込み権限。 -
認証方法:
Microsoft Entra IDまたはShared Access Signature (SAS) トークンを使用します。
2-2. Azure Storageにアクセス権を付与
Azure Storageでは、SASトークンを使用してデータを書き込むことができます。
SASトークンの作成方法
以下のコマンドで、Azure CLIを使用しSASトークンを生成します。
az storage container generate-sas \
--name <container-name> \
--permissions racwdl \
--account-name <storage-account-name> \
--expiry <expiry-date>
-
<container-name>
: データを書き込むAzure Storageコンテナ名。 -
<storage-account-name>
: Azure Storageアカウント名。 -
<expiry-date>
: トークンの有効期限 (例: 2025-01-10T00:00:00Z)。
生成されたSASトークンを使用してURLを作成。
https://<storage-account-name>.blob.core.windows.net/<container-name>?<sas-token>
2-3. AzCopyを使用したデータコピー
SASトークンと署名付きURLを準備した後、AzCopyを使用してデータをコピーします。
2-3-1. ディレクトリの内容のコピー
以下のコマンドでディレクトリ内のすべてのファイルをコピーします。
azcopy copy 'https://storage.cloud.google.com/<bucket-name>/<directory-name>' \
'https://<storage-account-name>.blob.core.windows.net/<container-name>/<directory-name>?<sas-token>' \
--recursive=true
--recursive=true
フラグを指定することで、すべてのサブディレクトリ内のファイルもコピー対象となります。このフラグを使用しない場合、サブディレクトリ内のデータはコピーされません。
実行結果例
Total Number of Transfers: 5
Number of File Transfers Completed: 5
Number of File Transfers Failed: 0
Total Number of Bytes Transferred: 18007
Final Job Status: Completed
2-3-2. 全バケットのコピー
GCSプロジェクト全体のバケットデータをコピーするには、以下を実行します。GOOGLE_CLOUD_PROJECT
を設定した上で、以下のコマンドを使用します。
実行例
- プロジェクトIDを環境変数に設定:
export GOOGLE_CLOUD_PROJECT=<project-id>
- AzCopy を実行:
azcopy copy 'https://storage.cloud.google.com/' \
'https://<storage-account-name>.blob.core.windows.net?sp=racwdl&<sas-token>' \
--recursive=true
2-4. 命名規則への考慮
2-4-1. バケット名の変換
GCSのバケット名にAzure Storageでは使用できない文字(例: ピリオド、連続するハイフン)が含まれる場合、AzCopyによって自動変換されます。
実行例:
連続するハイフンは、連続するハイフンの数を表す数に置き換えられます。
- Google Cloud Storageバケット名: sample----hyphen
- 変換後のAzureコンテナ名: gs-4-sample-2
2-4-2. オブジェクト名の変換
Azure Storageでは、オブジェクト名に連続するドット(..)を末尾に含めることができません。このため、AzCopyによって末尾のドットが削除されます。
実行例:
「/sampleDot..」末尾のドットは、コピー操作の実行時にトリミングされます。
- Google Cloud Storage オブジェクト名: gs-sample-1/sampleDot../sampleDot.....png
- 変換後のオブジェクト名: gs-sample-1/sampleDot/sampleDot.....png
2-5. オブジェクトのメタデータの違い
2-5-1. メタデータの互換性とオプション
GCSとAzure Storageのメタデータ仕様は以下の通りです。
- GCS: 非ASCII文字や特殊文字を含むメタデータキーをサポート。
- Azure Storage: メタデータキーは C#の識別子規則に従い、特殊文字や非ASCII文字を許可しません。
AzCopyの --s2s-handle-invalid-metadata
オプションを使用して、互換性のないメタデータキーを制御します。
フラグ値 | 説明 |
---|---|
ExcludeIfInvalid | 無効なメタデータは無視され、ファイルはコピーされます(デフォルト) |
FailIfInvalid | 無効なメタデータがある場合、ファイルコピーを中断しエラーを記録 |
RenameIfInvalid | 無効なメタデータキーを修正してコピーを実行(修正不能の場合はエラー) |
実行例
メタデータが含まれるファイルのコピー。
( sample1/sample5.pngにContent-Disposition:my-key*€を設定 )
azcopy copy 'https://storage.cloud.google.com/' \
'https://<storage-account-name>.blob.core.windows.net?sp=racwdl&<sas-token>' \
--recursive=true --s2s-handle-invalid-metadata=ExcludeIfInvalid
実行結果例
Total Number of Transfers: 8
Number of File Transfers Completed: 7
Number of Folder Transfers Completed: 0
Number of File Transfers Failed: 1
Number of Folder Transfers Failed: 0
Number of File Transfers Skipped: 0
Number of Folder Transfers Skipped: 0
Total Number of Bytes Transferred: 27252
Final Job Status: CompletedWithErrors
結果概要
- 総数: 8 ファイル
- 成功: 7 ファイル
- 失敗: 1 ファイル
- ジョブステータス: CompletedWithErrors
失敗したファイルの詳細
-
ファイル名:
sample1/sample5.png -
エラー原因:
メタデータキー my-key*€ に含まれる特殊文字(€)がAzure Storageの規則に違反。
実行結果と公式記載の差分
- 公式仕様ではExcludeIfInvalidにより、無効なメタデータキーが除外され、ファイルコピーが続行されるとされていますが、実際には対象ファイルはコピーされずエラーとして記録されました。
- RenameIfInvalidの動作は「無効なキーを修正」または「AzCopy でキーの名前を変更できない場合、オブジェクトはコピーされない」とされていますが、実行例の結果はExcludeIfInvalidと同様で、該当ファイルのコピーは失敗しました。
3. まとめ
AzCopyを使用してGCSからAzure Blob Storageへデータをコピーする際、認証設定や命名規則、メタデータの仕様に注意が必要です。また、公式仕様と実行結果に差異が見られる場合があるため、十分なテストを行い、適切なオプションを選択してください。
参考
Discussion