Azure Functionsを使ってみる:[2] PowerShellコマンドの利用

はじめに

ほとんど触ったことがないAzure Functionsを、あえてMicrosoft LearnやDocsで予習せず、PowerShellスクリプトの基本的な知識だけで使えるのか、という観点で使ってみています。

前回、サンプルを動かすところまでは実現できました。

blog.jbs.co.jp

今回は、一般的なPowerShellのコマンドレット、変数、繰り返し、条件分岐などを利用できるかを試してみたいと思います。

コードの作成

今回は、POSTされたデータを使ってAzure Functionとじゃんけんを出来るようにしてみたいと思います。*1

サンプルから残す部分を選ぶ

元のサンプルから、残す部分を考えました。

基本的にほとんど残すことになりました。残った部分のソースはこうなりました。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

# Interact with query parameters or the body of the request.
$name = $Request.Query.Name
if (-not $name) {
    $name = $Request.Body.Name
}

# このあたりでbodyとして返すメッセージを生成

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

入力されるデータの想定

まず、今回は、利用者からhandsignという名前で"Rock", "Paper", "Scissors"のいずれかの値を受け取る、という想定で作成します。それ以外の値だった場合の処理などはいったん今回は省略します。

POSTするデータはこうなります。

{
"handsign":"Rock"
}

パラメーターを受け取る

ほぼサンプル通りなのですが、handsignという名前になるので、そこだけ変えます。

if (-not $HandSign){
    $HandSign = $Request.Body.HandSign
}

Azure Functionsが出す手を決める

変数とGet-Randomコマンドレットを使って、 Azure Functionsが出す手を決めます。

$RockPaperScissors = "Rock", "Paper", "Scissors"
$Rand = Get-Random -Minimum 0 -Maximum 3
$FunctionsHandSign = $RockPaperScissors[$Rand]

勝敗メッセージの定義

勝敗メッセージ(勝ち、負け、あいこ)を複数の場所で指定するので、一括で変更できるように変数で定義しておきます。

$win = "あなたの勝ちです。"
$draw = "引き分けです。"
$lose = "私の勝ちです。"

勝敗の判定

まず、ユーザーがRockだった場合を考えます。ifとswitchを使って、じゃんけんの結果通りに条件分岐させ、勝敗に応じて勝敗メッセージを$resultに格納します。

if($HandSign -eq "Rock"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $draw}
        "Paper"     {$Result = $lose}
        "Scissors"  {$Result = $win} 
    }
}

同様に、Paper、Scissorsの時の勝敗も判定できるようにします。

elseif($HandSign -eq "Paper"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $win}
        "Paper"     {$Result = $draw}
        "Scissors"  {$Result = $lose} 
    }
}
elseif($HandSign -eq "Scissors"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $lose}
        "Paper"     {$Result = $win}
        "Scissors"  {$Result = $draw} 
    }
}
else{
}

勝敗メッセージの生成

最後に、出力用の勝敗メッセージを生成します。

$body = "あなたは"+ $HandSign + "で、わたしは" + $FunctionHandSign + "でした。" + $Result

あとは、元のサンプルと同じです。

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

スクリプト全体像の確認

こうなりました。

using namespace System.Net

# Input bindings are passed in via param block.
param($Request, $TriggerMetadata)

# Write to the Azure Functions log stream.
Write-Host "PowerShell HTTP trigger function processed a request."

### 関数とじゃんけんをするサンプル

# パラメーターを受け取る
if (-not $HandSign){
    $HandSign = $Request.Body.HandSign
}

# Azure Functionsが出す手を決める
$RockPaperScissors = "Rock", "Paper", "Scissors"
$Rand = Get-Random -Minimum 0 -Maximum 3
$FunctionHandSign = $RockPaperScissors[$Rand]

# 勝敗メッセージの定義
$win = "あなたの勝ちです。"
$draw = "引き分けです。"
$lose = "私の勝ちです。"

# 勝敗の判定
if($HandSign -eq "Rock"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $draw}
        "Paper"     {$Result = $lose}
        "Scissors"  {$Result = $win} 
    }
}
elseif($HandSign -eq "Paper"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $win}
        "Paper"     {$Result = $draw}
        "Scissors"  {$Result = $lose} 
    }
}
elseif($HandSign -eq "Scissors"){
    switch ($FunctionsHandSign){
        "rock"      {$Result = $lose}
        "Paper"     {$Result = $win}
        "Scissors"  {$Result = $draw} 
    }
}
else{
}

# 勝敗メッセージの生成
$body = "あなたは"+ $HandSign + "で、わたしは" + $FunctionHandSign + "でした。" + $Result

# Associate values to output bindings by calling 'Push-OutputBinding'.
Push-OutputBinding -Name Response -Value ([HttpResponseContext]@{
    StatusCode = [HttpStatusCode]::OK
    Body = $body
})

動作確認

保存してテストをしてみます。

ちゃんと結果が表示されます。今回は負けてしまったようです。*2

今度はパーを出してみます。

{
"handsign":"Paper"
}

今度は勝ちました。*3

おわりに

パラメーターの受け取りや受け取ったパラメーターの変数への格納、結果の出力などはAzure Functionならではという感じですが、内部の処理についてはPowerShellの基本的な知識があれば普通に作成できました。

とはいえ、テスト実行するだけだとあまり意味がないので、次回は、何か別のところからこのアプリにPOSTして受け取った結果を利用するような形を取ってみたいと思います。

*1:余談ですが英語で「じゃんけん」は「Rock-Paper-Scissors」などと言うんですね。

*2:Azure Function側から見た結果なので、「私」はAzure Functionの方ですね

*3:書きながら実際に動かしていたので、勝敗は時の運でした。ちゃんと勝敗が分かれてくれてよかったです

投稿者プロフィール
舟越 匠

舟越 匠

人材戦略部に所属。社内向けの技術研修をメインにしつつ、JBS Tech BlogやMS認定資格取得の推進役もやっています。資格としてはAzure Solutions Architect Expertを所持。Power AutomateやLogic Appsで楽をするのが好きです。

執筆記事一覧