はじめに
2019/04/26、AzCopy v10がGAとなりました。
https://azure.microsoft.com/ja-jp/updates/azcopy-v10-is-now-generally-available/
AzCopy v10 の新機能に関してはドキュメントが詳しいですが、主だったところとしては以下のものが挙げられます。
- ローカル – Blob Storage間の同期操作
- Azure Data Lake Storage Gen2 のサポート
- ストレージアカウント間での高速データコピー (Blob Storageのみ)
- Amazon S3からのデータのコピー
今回は、Blob Storageの操作に関する新機能についてAzCopy v10の操作を検証していきます。
インストール
AzCopy v10はAzCopy v8までとは異なり、インストールが不要になりました。
ダウンロードページから使用するOSの実行ファイルをダウンロードし、適当なディレクトリに展開すれば使用することができます。
お好みでパスを通しておくと使いやすくなります。
認証
Azure Storageの操作の認証には以下の2つのオプションが使用できます。
- Azure Active Directory (Azure AD)
- Shared Access Signature (SAS)トークン
これらの認証オプションはサポートされるサービスが異なり、Azure ADはBlob StorageとData Lake Storage Gen2、SASトークンはBlob StorageとAzure Filesをサポートします。
Blob Storageはいずれの認証でも使用でき、今回の検証ではSASトークンによる認証で使用します。
ローカル – Blob Storage間の同期操作
AzCpoy v10から使用可能になった「sync」コマンドで、ローカルからBlobコンテナへの同期操作を試してみます。
まず、Azure Storage Explorerで同期先のBlobコンテナのSAS URLを生成します。
同期操作では、書き込みだけでなく、Blobのリスト操作が発生するため、「Write」、「List」のパーミッション設定が必須となります。また、設定によっては読み込み、削除も発生するため「Read」、「Delete」のパーミッションも適宜設定が必要になります。
今回は、いろいろな操作を試すので全パーミッション許可で作成します。
PowerShellでAzCopy v10のディレクトリを開き、下記コマンドで同期を開始します。サブディレクトリを含めて同期する場合は「–recursive=true」のオプションを設定します。
1 2 |
# 同期操作 .\azcopy.exe sync "{同期元ローカルパス}" "{同期先SAS URL}" --recursive=true |
実行すると同期先コンテナにローカルのファイルがコピーされていることが確認できました。Blob Storageの仕様上、空ディレクトリは作成できないため、ディレクトリ構造を完全にコピーすることはできません。
「New-Item」コマンドレットで同期元の「content」ディレクトリに新しいファイルを追加して、再度同期を実行してみます。
実行ログからBlobコンテナに1ファイルだけ転送されていることがわかり、差分ファイルのみ同期されていることがわかりました。
1 2 3 4 |
# ファイル新規作成 New-Item "{同期元ディレクトリ}\content\test.md" # 同期操作 .\azcopy.exe sync "{同期元ローカルパス}" "{同期先SAS URL}" --recursive=true |
syncコマンドに「–delete-destination」オプションを設定すると同期元でのファイル削除を同期先に反映できます。
上で作成したファイルを削除して、「–delete-destination=prompt」を追加して同期を実行します。
削除が発生する場合は確認操作が入るため、「Y」または「A」で削除を許可します。(「–delete-destination=ture」の場合は確認がありません。)
1 2 3 4 |
# ファイル削除 rm "{同期元ディレクトリ}\content\test.md" # 同期操作 .\azcopy.exe sync "{同期元ディレクトリ}" "{同期先SAS URL}" --recursive=true --delete-destination=prompt |
コンテナを確認すると、同期元と同様にファイルが削除されていました。
ストレージアカウント間でのデータコピー
ストレージアカウント間のデータコピーはv8でも可能でしたが、v10ではコピー操作に「Put Block from URL」APIを使用することで操作の高速化が図られています。
このAPIは、ストレージアカウント間のデータコピーをクラウド上で完結させることで、クライアントのネットワーク帯域に依存せず高速にデータコピーができるようにしたもののようです。
ストレージアカウント間のデータコピーは「copy (cp)」コマンドを使用し、以下のコマンドで実行します。
1 |
.\azcopy cp "{コピー元SAS URL}" "{コピー先SAS URL}" --recursive=true |
合計約300 MBの4つのBlobについてAzCopy v8.1とv10でコピー結果を比較すると、AzCopy v8.1は44秒かかったコピーが、v10ではわずか4秒 (0.0667分)と大幅に高速化されていることがわかりました。
Amazon S3からのデータコピー
Amazon S3からのデータコピーにも「copy (cp)」コマンドを使用します。ただし、実行するにはAWSのアカウントキーとシークレットアカウントキーが必要になります。
まずは、AWSコンソールでAzCopy用のIAMユーザーを作成しておきます。コピー操作なのでとりあえず「AmazonS3ReadOlnlyAccess」をつけて作成します。
作成が完了したら、csvをダウンロードしてアカウントキーとシークレットアカウントキーを保存します。
PowerShellでAzCopyのディレクトリを開き、下記コマンドで環境変数を設定します。「.\azcopy.exe env」コマンドを実行すると設定した環境変数が確認できます。
1 2 3 4 5 |
# 環境変数設定 $env:AWS_ACCESS_KEY_ID = "{AWSアカウントキー}" $env:AWS_SECRET_ACCESS_KEY = "{AWSシークレットアカウントキー}" # 設定確認 .\azcopy.exe env |
コピー先のBlobコンテナのSAS URLを取得します。
Azure Storage Explorerでコピー先コンテナを右クリックして「Get Shared Access Signiture…」を選択します。
S3からの書き込みになるため「Write」のパーミッションを設定してSAS URLを生成します。
S3のバケットにコピーするファイルを配置します。
下記コマンドでS3の内容をBlobコンテナにコピーします。バケットやディレクトリのコピーを実行する場合は「–recursive=true」のオプションを設定しないとエラーが発生します。
1 |
.\azcopy cp "https://s3.amazonaws.com/{S3バケット名}" "{コピー先SAS URL}" --recursive=true |
完了するとS3のファイルがBlobコンテナに反映されていることが確認できます。当然ながら、S3のディレクトリ構造までは反映されません。
まとめ
AzCopy v10は従来のAzCopyから大幅に仕様変更が行われており、syncコマンドなどの新機能により使い勝手もよくなっています。
v8以前を使用している場合にはコマンドの変更に伴う改修が必要になりますが、インストールが不要なことや、コピーの高速化、クライアントの負荷軽減といった機能改善も行われており、アップグレードによるメリットも大きいのではないでしょうか。