🦖

AzCopyでデータコピー:GCSからAzure Storage

2025/01/04に公開

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 を設定した上で、以下のコマンドを使用します。

実行例

  1. プロジェクトIDを環境変数に設定:
export GOOGLE_CLOUD_PROJECT=<project-id>
  1. 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へデータをコピーする際、認証設定や命名規則、メタデータの仕様に注意が必要です。また、公式仕様と実行結果に差異が見られる場合があるため、十分なテストを行い、適切なオプションを選択してください。

参考
https://learn.microsoft.com/ja-jp/azure/storage/common/storage-use-azcopy-google-cloud#rename-logic

Discussion