AzCopy を使用して Google Cloud Storage から Azure Storage にデータをコピーする

AzCopy は、ストレージ アカウント間の BLOB またはファイル コピーに利用できるコマンドライン ユーティリティです。 この記事は、AzCopy を使用して Google Cloud Storage から Azure Blob Storage にオブジェクト、ディレクトリ、バケットをコピーする場合に役立ちます。

認証資格情報の提供方法を選択する

  • Azure Storage を使って認可するには、Microsoft Entra ID または Shared Access Signature (SAS) トークンを使います。

  • Google Cloud Storage による承認を行うには、サービス アカウント キーを使用します。

Azure Storage による認証

AzCopy のダウンロード方法と、ストレージ サービスに認証資格情報を与える方法については、AzCopy の作業開始に関するページをご覧ください。

Note

この記事の例では、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 環境変数をサービス アカウント キー ファイルへの絶対パスに設定します。

オペレーティング システム コマンド
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

Note

この例では、--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 プロジェクトのプロジェクト ID に設定します。

階層型名前空間があるアカウントに同じ 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 プロジェクトのプロジェクト ID に設定します。

バケット名にワイルドカード記号 (*) を使用して、バケットのサブセットをコピーします。 階層型名前空間があるアカウントに同じ 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

バケットの名前付け規則の違いに対処する

Google Cloud Storage では、Azure BLOB コンテナーと比べると異なるバケット名の名前付け規則があります。 詳しくは、こちらをご覧ください。 バケットのグループを Azure ストレージ アカウントにコピーする場合は、名前付けの違いのためにコピー操作が失敗することがあります。

AzCopy は、発生する可能性のある最も一般的な 3 つの問題を処理します。ピリオドが含まれているバケットと、連続するハイフンが含まれているバケッと、アンダースコアが含まれているバケットです。 Google Cloud Storage バケットの名前にはピリオドと連続するハイフンを含めることができますが、Azure 内のコンテナーには含めることができません。 AzCopy では、期間はハイフンに置き換えられ、連続するハイフンは、連続するハイフンの数を表す数に置き換えられます (たとえば、my----bucket という名前のバケットは my-4-bucket になります)。 バケット名にアンダースコア (_) が含まれている場合、AzCopy を実行するとアンダースコアがハイフンに置き換えられます。 たとえば、my_bucket という名前のバケットは my-bucket になります。

オブジェクトの名前付け規則の違いに対処する

Google Cloud Storage では、Azure BLOB コンテナーと比べると異なるオブジェクト名の名前付け規則があります。 詳しくは、こちらをご覧ください。

Azure Storage では、オブジェクト名 (または仮想ディレクトリ パス内の任意のセグメント) が連続するドットで終わることは許可されていません (たとえば 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_ を新しい有効なキーの先頭に追加します。 このキーは、元のメタデータの無効なキーを保存するために使用されます。 メタデータ キーは BLOB ストレージ サービスに値として保持されるため、このキーを使用して、Azure 側でメタデータを試して復元することができます。

次のステップ

他の例については、次の記事を参照してください。

設定の構成、パフォーマンスの最適化、および問題のトラブルシューティングを行うには、次の記事を参照してください。