はじめに
ストレージアカウントの地理冗長の方法としてGRS, RA-GRS, GZRS, RA-GZRSなどがあり、ペアリージョン(Japan EastならJapan West)にデータをレプリケーションすることができるが、ペアリージョンではない例えば海外のリージョンなどのストレージにデータを同期したい場合はこれらのオプションでは実現できない。そのためなんらかの別の方法でデータをコピーする必要がある。
AzCopy V10 にはsyncモードがあり、これを利用して片方向のデータ同期が可能だ。これを定期的に実行するのが良さそうなので今回はこの手法を検討したい。ほかの方法としては例えば Data Factory が考えられる。Data Factoryによる 増分コピーの手法 を使用してデータをコピーすることができるが、こちらの場合はソース側のストレージでのデータ削除には対応できないため、削除が無いような処理の場合には有効である。
このAzCopyだが、便利なコマンドなので定期実行を自動化させたいところだが、このために仮想マシンをわざわざ新しくで作成したくないし、オンプレミス環境での実行もシステムがばらけてなんとなく嫌なので、なにかPaaSを利用して実現したい。オペレーションの自動化のPaaSといえばAzure Automationが挙げられるが、azcopyを実行することができない。App ServiceのWebJobであれば、exeファイルを実行することができるため、これを利用して自動化の仕組みを作れそうだという事で、試したメモを残す。
AzCopyでコンテナー間の同期を実行する
AzCopyのsyncコマンドはファイル名と最後に変更されたタイムスタンプが比較されてファイルが同期される。--delete-destination
をtrue
にするとプロンプト無しに存在しなくなったファイルが削除される。何も聞かれずに削除されるようになるので安全をとって 論理的な削除 を有効にしておくのもあり。
こちらのドキュメント の通りにコマンドを実行すればOK。
azcopy sync 'https://<source-storage-account-name>.blob.core.windows.net/<container-name>' 'https://<destination-storage-account-name>.blob.core.windows.net/<container-name>' --recursive --delete-destination=true
今回は SASトークン を使用してアクセスを承認する方法をとる。SASトークンの場合は以下のようになる。
azcopy sync 'https://<source-storage-account-name>.blob.core.windows.net/<container-name><SAS-token>' 'https://<destination-storage-account-name>.blob.core.windows.net/<container-name><SAS-token>' --recursive --delete-destination=true
実際に実行すると以下のような出力が得られる。ここでは1ファイル同期されている。
INFO: Any empty folders will not be processed, because source and/or destination doesn't have full folder support
Job dbd88421-6a26-094d-6397-35632c65572d has started
Log file is located at: /home/hideo/.azcopy/dbd88421-6a26-094d-6397-35632c65572d.log
INFO: azcopy: A newer version 10.6.0 is available to download
100.0 %, 0 Done, 0 Failed, 1 Pending, 1 Total, 2-sec Throughput (Mb/s): 0
Job dbd88421-6a26-094d-6397-35632c65572d Summary
Files Scanned at Source: 3
Files Scanned at Destination: 2
Elapsed Time (Minutes): 0.1001
Number of Copy Transfers for Files: 1
Number of Copy Transfers for Folder Properties: 0
Total Number Of Copy Transfers: 1
Number of Copy Transfers Completed: 1
Number of Copy Transfers Failed: 0
Number of Deletions at Destination: 0
Total Number of Bytes Transferred: 27683
Total Number of Bytes Enumerated: 27683
Final Job Status: Completed
AzCopy syncコマンドをWebJobで定期実行する
WebJobsプラットフォームの準備
WebJobはWeb App, API App, Mobile Appと同様に同じApp Serviceのプラットフォーム上でプログラムやスクリプトを実行する機能になるため、WebJobの利用にApp Serviceに加えた追加コストは発生しない。
Azure App Service で Web ジョブを使用してバックグラウンド タスクを実行する に従ってApp Serviceの環境を準備する。現在のところWebJobsはApp Service on Linuxではサポートされていないため、Windowsでデプロイすること。
バッチファイルの準備
run.cmdというファイル名でAzCopyのsyncコマンドを記述する。
注意事項としては、SASトークンに "%" がしばしば含まれているが、これらは変数解釈されてしまうため、"%%"としてエスケープしておく必要がある。また、ストレージのPATHを囲うのはシングルクォートではなくダブルクォートを使用すること。
azcopy.exe sync "https://<source-storage-account-name>.blob.core.windows.net/<container-name><SAS-token>" "https://<destination-storage-account-name>.blob.core.windows.net/<container-name><SAS-token>" --recursive --delete-destination=true
AzCopyのダウンロード
こちら からAzCopy V10 (Windows 64 ビット)のzipをダウンロードし、Zipを解凍してazcopy.exeファイルを抽出しておく。
WebJobファイルの準備
先に作成したrun.cmd
とダウンロードしたazcopy.exe
をZip圧縮してWebJobにアップロードするファイルの準備をしておく。
WebJobへのアップロードと設定
App Serviceの管理画面からWebJobsを選択してWebJobの管理画面に遷移する。
+Add
をクリックしてWebJobを追加する。File Upload
のところで先ほど作成したZipファイルを指定する。Triggers
にはScheduledを選択し、実行時間のNCRONTAB式で記述する。下図の例は30分おきに実行する指定。
NCRONTAB式については こちらのドキュメントを参照。
WebJobの実行と確認
ジョブ名をクリックしてRun
を実行すると強制的にトリガーが起動される。うまくいけばStatus欄Completedのようになる。