今回はAzureFuncitons上でManagedIDを使ってユーザーアカウントでログインせずにAzurePowerShellを動かす方法を紹介します。
今回作ったものは「Azure PowerShellを使ってAzureリソースの情報を取得する関数」です。
- マネージドID(ManagedIdentity)とは
- 今回使用したAzureリソース
- Azure FunctionsにVMの起動ステータスを取得するPowershellコマンドを記述
- ManagedIDの設定を行う
- 最後に
マネージド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の設定を行っていないのでエラーになります。
それでは続いてManagedIDの設定を行います。
ManagedIDの設定を行う
Azure Functionsの画面を開き、「プラットフォーム機能」タブ→「ID」を選択
「システム割り当て済み」タブ→「状態」をオンにして「保存」を選択
保存完了するとオブジェクトIDがFunctionsに割り当てられる「サブスクリプション」→今回VMが置いてあるサブスクリプションを選択→「アクセス制御」→「追加」→「ロールの割り当て」
Functionsアプリをサブスクリプションの閲覧者に追加する
もう一度Functionsを実行するとVMのステータスが取得できるようになりました。
最後に
今回使用したManagedIDを用いることでアプリケーション上に資格情報を持たない構成が可能となります。
実装も簡単ですし、ManagedIDに対応しているAzureリソースに関してはManagedIDを使っていきましょう。