azcopy V10でオンプレLinuxのデータバックアップをする

Azure

手順ややこしくて忘れちゃうのよ…

自宅鯖は冗長化してあるものの、その2台共が焼失する可能性が無いとは言えないのでデータのバックアップをAzureに置きたい。

で。以前はrsyncを使っていたもののLinux VMが必要になるので料金が高めだし、そもそもバックアップのためだけにVMを立てるのはどうよ?というのがあったので、ストレージアカウントを作成してazcopy V10でバックアップするようにした。なお繰り返し言及しているけれど、拙宅はauひかりホーム10Gで宅内も10Gbps化しているので、自宅鯖からAzure東日本のストレージアカウントへのazcopyを使ったバックアップは6Gbpsを超える速度が出る。超快適。

さて、azcopy V10をデータバックアップに使えるようにする手順がなかなか複雑な上、ググるとazcopy V7の手順だったり継続的に何度も実行出来ることをチェックしていなかったりするので、2021年11月時点でRHEL8 + azcopy V10でこうやったら出来るよ、というのを備忘録としておく。

azcopyのインストール(というかコピー)

まずazcopy V10が無いと話が始まらないので、AzCopyを使ってみるからLinux用のtar玉をダウンロードする(RPMになってないんで、後でSPEC書いてPRしておこう…)。展開するとazcopyとNOTICE.txtが入ってるので、azcopyを/usr/sbin/あたりにコピーして、パーミッションをチェックしておく。

$ curl -L -o azcopy.tgz https://aka.ms/downloadazcopy-v10-linux
$ tar zxvf azcopy.tgz
$ sudo cp azcopy_linux*/azcopy /usr/sbin/
$ sudo chmod 755 /usr/sbin/azcopy
$ sudo chcon system_u:object_r:bin_t:s0 /usr/sbin/azcopy

ストレージアカウントの作成

Azureポータルからリソースを作成。

“storage account”とタイプすると表示されるのでクリック。

そのまま[Create]をクリック。

リソースグループは任意で。もちろん新規作成がオススメだけど。[Storage account name]はFQDNの一部になるので適当に。[Region]は近いところを選べばOK。

[Data protection]タブに[Enable versioning for blobs]とか便利なのがあるんで、そこはよしなに。

レビューして作成。

デプロイ終わったら[Go to resource]をクリック。

コンテナの作成

左のブレードの[Data storage][Containers]をクリックして、[+Container]をクリック。

コンテナの名前を適当に入れて[Create]

作成したコンテナの名称をクリック

URLがEndpointなので、あとでazcopyコマンドの引数として使います。

アプリケーションを登録

ホームに戻ってAADをクリック。

左のブレードから[App registrations]をクリックして、[+New regsitration]をクリック

アプリケーションの名称を識別しやすいように付ける。後でSubscriptionのIAMで検索語にするので、忘れないように。

作成したアプリケーションの左のブレードから[Certificates & secrets]をクリックして、[+New client secret]をクリック。

Client secretの名称を入力して失効期限を選択。バックアップ用なのでもっと長くても良いかも知れないけれど、とりま12ヶ月。

作成完了すると”Value”と”Secret ID”が表示される。ここで大事なのは左にある“Value”の方。これはazcopyを実行する時に、環境変数・AZCOPY_SPA_CLIENT_SECRETとして用いる。エディタとかあるいはパスワードマネージャに記録しておくことをオススメしとく。

左のブレードから”Overview”に戻ると、[Application (client) ID]と[Directory (tenant) ID]が表示されているので、これもエディタとかパスワードマネージャに。

IAMの設定

ホームに戻ってサブスクリプションから、

azcopyで使うサブスクリプションを選んで、

左のブレードの[Access control (IAM)]をクリックし、[+Add]をクリックすると表示される[Add role assignment]をポイント。

“storage blob data”を入力すると表示される項目中から、[Storage Blob Data Owner]をクリックして、[Next]

[Assign access to]は”User, group, or service principal”のままにして[+Select members]をクリック。

アプリケーションの登録で設定した名称をタイプするとアプリケーションが表示されるので、これをポイントして[Select]をクリック。

azcopyを実行

さて、azcopyをバックアップに使う準備が出来たので、以下のようなスクリプトを用意する。コンテナ作成後にURLをメモっておいたと思うので、それをazcopyの引数として渡します。変わるのは"blob.core.windows.net"の前、今回の例だと"mybackupforlinux"と、コンテナ名・"linux"

#!/bin/bash

# Cron実行時に既に実行されてたら実行しないよ
ps=`ps -def | grep azcopy | grep -v grep | wc -l`
if [ $ps -ne 0 ]; then
    exit
fi

# ログすげえ溜まるよ。安定したらコメントアウト外すのが良いよ
#rm -rf /var/log/azcopy/*.log

export PATH=$PATH:/usr/sbin/

# この辺は--help見ても書いてないよ。
# azcopy envを実行するとバチくそあるよ。
export AZCOPY_DISABLE_SYSLOG=true
export AZCOPY_LOG_LOCATION=/var/log/azcopy

# セキュアにやるなら、appsecretはここに書いちゃダメ
# 何かしらのVaultに格納して実行時に読み出すようにしてね。
appsecret="client secretを作成後に表示されたValue(Secret IDじゃない方)"
appid="アプリケーション登録の概要で表示された[Application (client) ID]"
tenantid="アプリケーション登録の概要で表示された[Directory (tenant) ID]"

# バックアップしたいディレクトリを適宜追加・削除
filter="^etc\|^home\|^opt\|^root\|^var"

export AZCOPY_SPA_CLIENT_SECRET=${appsecret}

# ログイン
azcopy login --service-principal --application-id ${appid} --tenant-id ${tenantid}

echo "Backuping to Azure..."

# ディレクトリ毎に実行
for directory in `ls / | grep ${filter}`;do
    echo "backuping /${directory} ..."
    azcopy sync "/${directory}/" "https://mybackupforlinux.blob.core.windows.net/linux/${directory}/" --recursive=true
done

echo "Elapsed time: ${SECONDS} seconds"

とりま/etc/だけやってみると、数秒で終わるはず。終わった後にコンテナをAzureポータルで表示すると、はい、バックアップ出来てますね、と。

では良いバックアップライフを。