オンプレ系インフラエンジニアがAzureを勉強する

いつか誰かの何かの役に立つと嬉しいな

ローカルフォルダ配下のファイルをBLOBに一括アップロードするbatファイルを作る

はじめに

BLOBストレージにファイルを一括アップロードできるbatファイルが必要になったので、作りました。

 

今回作るもの

特定のローカルフォルダ配下にある複数のファイルを、一括でBLOBストレージにアップロードするPowerShellスクリプトを作ります。
また、それを起動させるbatファイルまで作ります。

 

用意するもの

アップロード先のBLOBストレージ
Azure CLIが使用できるWindows環境

 

参照サイト様

Windows での Azure CLI のインストール | Microsoft Docs

az storage blob | Microsoft Docs

高度な関数

PowerShell のエラーコード処理 | netplanetes log

 

作成

ログインスクリプト

Azureにアクセスするためのログインスクリプトを作ります。
PowerShellからのログイン自体は下記コマンドでできます。

az login -u ユーザー名 -p パスワード

 

このコマンドを.ps1ファイルに記載します。
また、ユーザ名とパスワードは入力形式にしたいので変数化します。
パスワードは入力しているときに平文を表示したくないので、[-AsSecureString]のオプションを付けます。

$username = Read-Host "Azureアカウント"
$password = Read-Host "パスワード" -AsSecureString

az login -u $username -p $password

 

これにより、スクリプト実行時には下記のような表示になります。

f:id:mitsunooon:20200628121727j:plain


以上でログイン用のスクリプトはできました。
最終的なスクリプトの形は下記のGitHubを参照ください。

blob_upload_bat/login.ps1 at master · kgnk-hkr/blob_upload_bat · GitHub

 

アップロードのためのスクリプト

次に指定したファイルを指定したBLOBストレージにアップロードするスクリプトを作ります。

BLOBへのアップロード自体は下記コマンドでできます。

az storage blob upload-batch --account-name ストレージアカウント名 -d アップロード先のコンテナ名 --destination-path アップロード先のパス -s アップロード元のローカルフォルダパス

 

[アップロード元のローカルフォルダパス]を指定すると、そのフォルダ配下のファイルすべてがアップロードされます。

ログインスクリプト同様、アップロードに必要な情報は変数化します。
今回は、デフォルト値も利用したいため、デフォルト値のオプションも利用します。
Read-Hostを付けることで、対話的になるためよりユーザーに分かりやすくできます。

$defaultaccountname = 'defaultaccountname' ←これがデフォルト値
$accountname = Read-Host "ストレージアカウント名[デフォルト値:$($defaultaccountname)]"
$accountname = ($defaultaccountname,$accountname)[[bool]$accountname]

$defaultcontainername = '$web' ←これがデフォルト値
$containername = Read-Host "コンテナ名[デフォルト値:$($defaultcontainername)]"
$containername = ($defaultcontainername,$containername)[[bool]$containername]

$defaultdestinationpath = '/images/' ←これがデフォルト値
$destinationpath = Read-Host "アップロード先のパス[デフォルト値:$($defaultdestinationpath)]"
$destinationpath = ($defaultdestinationpath,$destinationpath)[[bool]$destinationpath]

$sourcepath = Read-Host "アップロード元のフォルダーパス"

az storage blob upload-batch --account-name $accountname -d $containername --destination-path $destinationpath -s $sourcepath

 

このスクリプトを実行すると下記のようになります。

f:id:mitsunooon:20200628121909j:plain

 

アップロードに最低限必要なのは以上ですが、
きちんとアップロードされたかを実行の前後で確認できるようにアップロード先のファイル一覧を取得するコマンドも追加します。

$date = (Get-Date -F G).Replace('/','').Replace(' ','_').Replace(':','');
$destbefore = $date + "_before_upload_list.txt"
$destafter = $date + "_after_upload_list.txt"

az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destbefore

az storage blob list --account-name $accountname --container-name $containername --output table --prefix $destinationpath > $destafter

 
以上でファイルアップロード用のスクリプトはできました。
最終的なスクリプトの形は下記のGitHubを参照ください。

blob_upload_bat/FileUpload.ps1 at master · kgnk-hkr/blob_upload_bat · GitHub

 

2つのスクリプトを実行するためのbatファイル

上記2つのPowerShellスクリプトを実行するためのbatファイルを作ります。
2つのPowerShellスクリプトはbatファイルと同じ階層のフォルダに格納されていることとします。
スクリプトが失敗したときにはエラーメッセージを返すようにします。
少し長くなるので、コード自体はGitHubにて参照ください。

blob_upload_bat/Upload.bat at master · kgnk-hkr/blob_upload_bat · GitHub


このbatファイルを実行し、すべてのスクリプトが成功すると下記のようになります。

f:id:mitsunooon:20200628122103j:plain


ちなみに、スクリプトが失敗すると下記のようになります。

Azureへのログインが失敗した場合

f:id:mitsunooon:20200628122134j:plain


アップロード情報が間違っていてアップロードに失敗した場合

f:id:mitsunooon:20200628122337j:plain

 

詰まったところ

スクリプトのエラー検出

上記で説明したようなコマンドをそのままスクリプトにした状態では、アップロードスクリプトが失敗していても、エラーとして検出されずに終えられてしまいました。
下記記事を参考にして、1処理ごとにデータが返されているかを確認するようにしました。

Using Azure CLI with PowerShell: error handling explained


フォルダ名に記号が入っている場合

コマンドでアップロードする場合に、アップロード先のコンテナ名に記号($など)が入っていると、ダブルクォーテーションで囲うとコマンドが通らない事象がありました。
下記の記事を参考に、シングルクォーテーションで囲ったらうまくいきました。

storage blob upload-batch fails with InvalidQueryParameterValue on Ubuntu · Issue #10131 · Azure/azure-cli · GitHub

 

f:id:mitsunooon:20200628123324j:plain

 

f:id:mitsunooon:20200628123341j:plain

 

おわりに

エラー処理の部分などは結構苦労したのですが、細かなところは端折ってしまったので、完成形のものをご覧いただければと思います。

気力があればちゃんと書き起こします。

作成したスクリプトとbatファイルはGitHubにまとめてアップしています。

github.com