PowerShellで、RESTful Web サービスに HTTP または HTTPS 要求を送信する処理として、Invoke-RestMethodコマンドレットがあり、このコマンドレットを用いると、Azure Blob Storageへのファイル操作をいろいろ行える。
今回は、Invoke-RestMethodコマンドレットを用いて、Azure Blob Storageへのファイルアップロード・ファイルダウンロード・ファイル削除を行ってみたので、そのサンプルプログラムのを共有する。
なお、Invoke-RestMethodコマンドレットについては、以下のサイトを参照のこと。
Microsoft PowerShell 7.4 Invoke-RestMethod説明
前提条件
下記記事のBlob Storageの作成が完了していること。
SASトークンの発行
Azure Blob Storageへ外部からアクセスする際に、SASトークンが必要になるが、その発行は、Azure Portal上で行える。その手順は、以下の通り。
1) Azure Portalにログインし、操作対象となるAzure Blob Storageにアクセスする。

2) SASトークンを発行するため、「Shared Access Signature」メニューを選択する。

3)「使用できるリソースの種類」を選択し、その他の各項目を編集後、「SAS と接続文字列を生成する」ボタンを押下する。

なお、上記で表示されたSASトークンや接続文字列は、この画面を再表示すると消えてしまうので、あらかじめ忘れないようメモしておくものとする。
サンプルプログラムの作成
作成したサンプルプログラムの構成は以下の通りで、「C:\work\blob」フォルダ下に配置されているものとする。

common.ps1の内容は以下の通りで、各処理で必要な変数等を指定している。
# Blobのアップロード・ダウンロード・削除共通で呼び出す処理
# Azure Blob StorageにアクセスするためのURIを生成
$blob_endpoint = "https://azureblobpurinit.blob.core.windows.net"
$container_name = "blobcontainer"
$blob_name = "user_data.csv"
$sas_token = "?sv=2022-11-02&ss=bfqt&srt=(SASトークンの文字列の続きを定義)"
$uri = "${blob_endpoint}/${container_name}/${blob_name}${sas_token}"
# 生成したURIの値を表示
Write-Host $uri
# Headerを定義
$headers = @{
'x-ms-blob-type' = 'BlockBlob'
}また、upload_blob.ps1の内容は以下の通りで、Azure Blob Storageにファイルアップロードする処理を定義している。
# 共通処理の呼出
. .\common.ps1
# アップロードするファイルパス
$upload_file_path = "C:\work\blob\in\${blob_name}"
# Azure Blob Storageへのファイルアップロードを実行
Invoke-RestMethod -Uri $uri -Method Put -Headers $headers -InFile $upload_file_path
# 完了メッセージを表示
Write-Host "Azure Blob Storageへのファイルアップロード処理が完了しました"さらに、download_blob.ps1の内容は以下の通りで、Azure Blob Storageからファイルダウンロードする処理を定義している。
# 共通処理の呼出
. .\common.ps1
# ダウンロードするファイルパス
$download_file_path = "C:\work\blob\out\${blob_name}"
# Azure Blob Storageからのファイルダウンロードを実行
Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -Out $download_file_path
# 完了メッセージを表示
Write-Host "Azure Blob Storageからのファイルダウンロード処理が完了しました"また、delete_blob.ps1の内容は以下の通りで、Azure Blob Storageにファイルがある場合に削除する処理を定義している。
# 共通処理の呼出
. .\common.ps1
# Azure Blob Storageに、削除対象のファイルが無い場合は、処理を終了する
try{
$response=Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -ErrorAction Stop
}catch{
Write-Host "発生したエラーコード:" $_.Exception.Response.StatusCode.value__
Write-Host "発生したエラーメッセージ:" $_.Exception.Response.StatusDescription
if($_.Exception.Response.StatusCode.value__ -eq '404'){
Write-Host "Azure Blob Storageにファイル${delete_file_name}が存在しませんでした。"
}else{
Write-Host "Azure Blob Storageのファイル存在チェックで何らかのエラーが発生しました。"
}
exit
}
# Azure Blob Storageのファイルを削除する
Invoke-RestMethod -Uri $uri -Method Delete -Headers $headers -ErrorAction Stop
# 完了メッセージを表示
Write-Host "Azure Blob Storageのファイル削除が完了しました"
サンプルプログラム実行の前提条件
サンプルプログラム実行にあたっての前提条件は、以下の通りとする。
1)「C:\work\blob\in」 フォルダ内には、以下のように、文字コードが「UTF-8」で改行コードが「LF」である「user_data.csv」が存在し、これをAzure Blob Storageにアップロードするものとする。


2)「C:\work\blob\out」 フォルダ内には、何も存在しないものとする。

3) Azure Blob Storageに操作対象となるContainerには、何もファイルが存在しないものとする。

サンプルプログラムの実行結果
サンプルプログラムの実行結果は以下の通りで、Invoke-RestMethodコマンドレットで、Azure Blob Storageへのファイル操作が問題なく行えることが確認できる。
1) Windowsのスタートメニューから、PowerShellを起動する。

2)「$PSVersionTable」コマンドを実行し、PowerShellのバージョンを確認する。

3) PowerShellスクリプトのある「C:\work\blob」ディレクトリに移動し、各ファイル・フォルダの存在を確認する。

4) ファイルアップロードのスクリプト「upload_blob.ps1」を実行する。

5) ファイルアップロードのスクリプト実行後に、Azure Blob Storageに、アップロードしたファイルが表示されることが確認できる。

6) アップロードされたファイルは以下の通りで、アップロードしたファイルそのままの内容で、文字コードが「UTF-8」で改行コードが「LF」で変わらないことが確認できる。

7) ファイルダウンロードのスクリプト「download_blob.ps1」を実行する。

8) ファイルダウンロードのスクリプト実行後に、「C:\work\blob\out」 フォルダ内に、ダウンロードしたファイルが表示されることが確認できる。

9) ダウンロードされたファイルは以下の通りで、ダウンロードしたファイルそのままの内容で、文字コードが「UTF-8」で改行コードが「LF」で変わらないことが確認できる。

10) ファイル削除のスクリプト「delete_blob.ps1」を実行する。

11) ファイル削除のスクリプト実行後に、Azure Blob Storageのファイルが削除されることが確認できる。

12) ファイル削除のスクリプト「delete_blob.ps1」を再度実行すると、以下のように、ファイルが存在しない旨が表示されることが確認できる。

<2024/2/10追加>
15.34MiBのファイル(追加Blob)を、Azure Blob StorageからローカルPCにダウンロードした場合の結果と性能は、以下の通り。
1) 以下のように、Azure Blob Storageに、15.34MiBのファイルの追加Blobを配置する。

2) download_blob.ps1を、以下のように修正する。
# Blobのダウンロード処理
# Azure Blob StorageにアクセスするためのURIを生成
$blob_endpoint = "https://azureblobpurinit.blob.core.windows.net"
$container_name = "blobcontainer"
$blob_name = "user_data.csv"
$sas_token = "?sv=2022-11-02&ss=bfqt&srt=(SASトークンの文字列の続きを定義)"
$uri = "${blob_endpoint}/${container_name}/${blob_name}${sas_token}"
# Headerを定義(Blobタイプに追加Blobを指定)
$headers = @{
'x-ms-blob-type' = 'AppendBlob'
}
# ダウンロードするファイルパスを定義
$download_file_path = "C:\work\blob\out\${blob_name}"
# 処理の開始時間を記録
$Dates = @()
$Dates += Get-Date
# Azure Blob Storageからのファイルダウンロードを実行
Invoke-RestMethod -Uri $uri -Method Get -Headers $headers -Out $download_file_path
# 処理の終了時間を記録
$Dates += Get-Date
# 完了メッセージを表示
Write-Host "Azure Blob Storageからのファイルダウンロード処理が完了しました"
Write-Host ("処理時間:" + ($Dates[1] - $Dates[0]).TotalSeconds + "秒")3) ファイルダウンロードのスクリプト「.\download_blob.ps1」を実行する。

上記より、15.34MiBのファイルの追加Blobをダウンロードした場合の処理時間が、12秒弱であることが確認できる。
4) 実際にダウンロードされたファイルを確認すると、以下のように、ファイルダウンロード処理が問題なく実施できていることが確認できる。


要点まとめ
- PowerShellで、RESTful Web サービスに HTTP または HTTPS 要求を送信する処理として、Invoke-RestMethodコマンドレットがあり、このコマンドレットを用いると、Azure Blob Storageへのファイルアップロード・ファイルダウンロード・ファイル削除等を行える。







