御成門プログラマーの技術日記

Microsoft AzureやAngularなどの技術情報を発信します

AzureFunctionsでマネージド IDを使い、資格情報を入力せずにAzurePowerShellを動かす方法【Azure Functions, ManagedID】

今回はAzureFuncitons上でManagedIDを使ってユーザーアカウントでログインせずにAzurePowerShellを動かす方法を紹介します。

今回作ったものは「Azure PowerShellを使ってAzureリソースの情報を取得する関数」です。

マネージドID(ManagedIdentity)とは

簡単に言うとAzureリソース自体にID(権限)を持たせてあげることで、
Azureリソースから他のAzureリソースに接続するときにIDとパスワードなどの資格情報で認証する必要がなくなります。

資格情報をコードに埋め込んでしまう恐れやKeyVaultで管理する必要がなくなるので
資格情報を保護することができるのです。

詳しい説明は公式ページを参照ください。

今回使用したAzureリソース

・Azure Functions(ランタイムスタック PowerShell Core(プレビュー))
情報を取得するPowerShellを流す。今回はVMの起動状態を取得するコマンドです。

・Azure VM
情報を取得される側のリソース。

Azure FunctionsにVMの起動ステータスを取得するPowershellコマンドを記述

下記のコードをManaged IDの設定済の状態で使用すると資格情報の入力を行わずにサインインできます。

Connect-AzAccount -Identity

以下VMのステータスを取得するコード全文

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
}

# Az.Accountsモジュールがインストールされていなかったらインストールする
if(Get-Module -ListAvailable Az.Accounts){
    Connect-AzAccount -Identity
}

# サブスクリプションを選択(本来は直打ちしちゃダメ)
Select-AzSubscription -Subscription "<ここにサブスクリプションIDを記述>"

# VMの起動ステータスを取得するPowerShellを実行
$vm = Get-AzVM -name $name -status
if($vm){
    $status = [HttpStatusCode]::OK
    $body = $vm.PowerState
}else{
    $status = [HttpStatusCode]::BadRequest
    $body = "情報が取得できませんでした。"
}

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

ちなみに現時点ではManagedIDの設定を行っていないのでエラーになります。 f:id:tt-suzukiit:20191029184256p:plain
それでは続いてManagedIDの設定を行います。

ManagedIDの設定を行う

  • Azure Functionsの画面を開き、「プラットフォーム機能」タブ→「ID」を選択 f:id:tt-suzukiit:20191029191508p:plain

  • 「システム割り当て済み」タブ→「状態」をオンにして「保存」を選択 f:id:tt-suzukiit:20191029191519p:plain
    保存完了するとオブジェクトIDがFunctionsに割り当てられる f:id:tt-suzukiit:20191029191535p:plain

  • 「サブスクリプション」→今回VMが置いてあるサブスクリプションを選択→「アクセス制御」→「追加」→「ロールの割り当て」 f:id:tt-suzukiit:20191029191551p:plain

  • Functionsアプリをサブスクリプションの閲覧者に追加する f:id:tt-suzukiit:20191029191623p:plain

  • もう一度Functionsを実行するとVMのステータスが取得できるようになりました。 f:id:tt-suzukiit:20191029191700p:plain

最後に

今回使用したManagedIDを用いることでアプリケーション上に資格情報を持たない構成が可能となります。
実装も簡単ですし、ManagedIDに対応しているAzureリソースに関してはManagedIDを使っていきましょう。