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の内容は以下の通りで、各処理で必要な変数等を指定している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | # 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にファイルアップロードする処理を定義している。
1 2 3 4 5 6 7 8 9 10 11 | # 共通処理の呼出 . .\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からファイルダウンロードする処理を定義している。
1 2 3 4 5 6 7 8 9 10 11 | # 共通処理の呼出 . .\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にファイルがある場合に削除する処理を定義している。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | # 共通処理の呼出 . .\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を、以下のように修正する。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | # 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へのファイルアップロード・ファイルダウンロード・ファイル削除等を行える。