Azure Storage

Azure Blob StorageへのアクセスをPowerShellのInvoke-RestMethodコマンドレットで実行してみた

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の作成が完了していること。

Azure Blob Storageを作成しファイルを格納してみたAzure Blob Storageを利用すると、Azure上にBlobデータ(テキストファイルや画像、アーカイブファイル等)を格納する...

SASトークンの発行

Azure Blob Storageへ外部からアクセスする際に、SASトークンが必要になるが、その発行は、Azure Portal上で行える。その手順は、以下の通り。

1) Azure Portalにログインし、操作対象となるAzure Blob Storageにアクセスする。
SASトークンの発行_1

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

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

4) 以下のように、SASトークンが表示される。
SASトークンの発行_4

なお、上記で表示された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のファイル削除が完了しました"



サラリーマン型フリーランスSEという働き方でお金の不安を解消しよう先日、「サラリーマン型フリーランスSE」という働き方を紹介するYouTube動画を視聴しましたので、その内容をご紹介します。 「サ...

サンプルプログラム実行の前提条件

サンプルプログラム実行にあたっての前提条件は、以下の通りとする。

1)「C:\work\blob\in」 フォルダ内には、以下のように、文字コードが「UTF-8」で改行コードが「LF」である「user_data.csv」が存在し、これをAzure Blob Storageにアップロードするものとする。
サンプルプログラム実行の前提条件_1_1

サンプルプログラム実行の前提条件_1_2

2)「C:\work\blob\out」 フォルダ内には、何も存在しないものとする。
サンプルプログラム実行の前提条件_2

3) Azure Blob Storageに操作対象となるContainerには、何もファイルが存在しないものとする。
サンプルプログラム実行の前提条件_3

サンプルプログラムの実行結果

サンプルプログラムの実行結果は以下の通りで、Invoke-RestMethodコマンドレットで、Azure Blob Storageへのファイル操作が問題なく行えることが確認できる。

1) Windowsのスタートメニューから、PowerShellを起動する。
サンプルプログラムの実行結果_1

2)「$PSVersionTable」コマンドを実行し、PowerShellのバージョンを確認する。
サンプルプログラムの実行結果_2

3) PowerShellスクリプトのある「C:\work\blob」ディレクトリに移動し、各ファイル・フォルダの存在を確認する。
サンプルプログラムの実行結果_3

4) ファイルアップロードのスクリプト「upload_blob.ps1」を実行する。
サンプルプログラムの実行結果_4

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

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

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

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

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

10) ファイル削除のスクリプト「delete_blob.ps1」を実行する。
サンプルプログラムの実行結果_10

11) ファイル削除のスクリプト実行後に、Azure Blob Storageのファイルが削除されることが確認できる。
サンプルプログラムの実行結果_11

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



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

1) 以下のように、Azure Blob Storageに、15.34MiBのファイルの追加Blobを配置する。
サンプルプログラムの実行結果(add)_1

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」を実行する。
サンプルプログラムの実行結果(add)_3

上記より、15.34MiBのファイルの追加Blobをダウンロードした場合の処理時間が、12秒弱であることが確認できる。

4) 実際にダウンロードされたファイルを確認すると、以下のように、ファイルダウンロード処理が問題なく実施できていることが確認できる。
サンプルプログラムの実行結果(add)_4_1

<ダウンロードしたCSVファイルの内容>
サンプルプログラムの実行結果(add)_4_2

サンプルプログラムの実行結果(add)_4_3

要点まとめ

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