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

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

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

  • Azure Storage による承認を行うには、Azure Active Directory (AD) または Shared Access Signature (SAS) トークンを使用します。

  • AWS S3 による承認を行うには、AWS アクセス キーとシークレット アクセス キーを使用します。

Azure Storage による認証

AzCopy のダウンロード方法と、ストレージ サービスに認証資格情報を提供する方法については、「AzCopy を使ってみる」という記事をご覧ください。

Note

この記事の例では、AzCopy login コマンドを使用して ID を認証したと想定しています。 AzCopy では次に、Blob Storage のデータへのアクセスを承認するために、Azure AD アカウントが使用されます。

SAS トークンを使用して BLOB データへのアクセスを承認する場合、各 AzCopy コマンドのリソース URL の先頭にそのトークンを追加できます。

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

AWS S3 による承認

AWS アクセス キーとシークレット アクセス キーを収集して、以下の環境変数を設定します。

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

オブジェクト、ディレクトリ、バケットをコピーする

AzCopy では、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'

Note

この記事の例では、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

Note

この例では、--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

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

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

AzCopy は、発生する可能性のある最も一般的な 2 つの問題を処理します。期間が含まれているバケットと、連続するハイフンが含まれているバケットです。 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_ を新しい有効なキーの先頭に追加します。 このキーは、元のメタデータの無効なキーを保存するために使用されます。 メタデータ キーは BLOB ストレージ サービスに値として保持されるため、このキーを使用して、Azure 側でメタデータを試して復元することができます。

次のステップ

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

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