前回の記事では、ある1つの仮想マシンのみを起動させてみましたが、今度は存在するすべての仮想マシンを自動起動させてみました。
今回はロジックアプリ自体の作成やマネージドIDの設定は省略しますので、必要であれば前回の記事を参照ください。
ロジックアプリデザイナーの設定
複数の仮想マシンを起動するためには、1つの仮想マシンを起動する時と異なり、仮想マシンのリソースグループ名と仮想マシン名をそれぞれ取得した上で仮想マシンを起動するためのAPIを実行する必要があります。
そこで今回は、まず仮想マシンの一覧を表示するAPIを利用して「仮想マシンのID情報を取得」、すなわち仮想マシンのリソースグループ名と仮想マシン名を含んだID情報を取得します。
その後、取得したID情報を利用し、繰り返し処理も利用することですべての仮想マシンに対して仮想マシンを起動するAPIをたたき、すべての仮想マシンを起動していきます。
従って今回作成するフローは以下のようになります。
➀[繰り返し]アクションの設定
前回同様、日本時間の午前10:00に毎日実行されるように設定します。
➁[変数]アクションの設定
[変数] アクションの中から「変数を初期化する」を選択して設定します。
今回は「サブスクリプションID」のみ設定しておきます。
③[HTTP] アクションの設定(仮想マシンのID情報を取得)
[HTTP] アクションを利用して、仮想マシンのID情報を取得します。
[種類] は「GET」を選択し、[URI] は以下のURLをコピーした上で {} の部分を➁で定義した変数として設定します。
https://management.azure.com/subscriptions/{subscription_id}/providers/Microsoft.Compute/virtualMachines?api-version=2022-03-01
また、[認証] も適切な値を利用してください。
私は今回もマネージドIDを利用しています。
④[JSONの解析] アクションの設定
③で取得した仮想マシンのID情報を変数として利用するために、「JSONの解析」というアクションを利用します。
[コンテンツ] には「本文」というHTTPの変数を設定し、
[スキーマ] には以下の内容を張り付けてください。
{
"properties": {
"value": {
"items": {
"properties": {
"id": {
"type": "string"
},
"location": {
"type": "string"
},
"name": {
"type": "string"
},
"plan": {
"properties": {
"name": {
"type": "string"
},
"product": {
"type": "string"
},
"publisher": {
"type": "string"
}
},
"type": "object"
},
"properties": {
"properties": {
"diagnosticsProfile": {
"properties": {
"bootDiagnostics": {
"properties": {
"enabled": {
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object"
},
"hardwareProfile": {
"properties": {
"vmSize": {
"type": "string"
}
},
"type": "object"
},
"networkProfile": {
"properties": {
"networkInterfaces": {
"items": {
"properties": {
"id": {
"type": "string"
},
"properties": {
"properties": {
"deleteOption": {
"type": "string"
}
},
"type": "object"
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
},
"osProfile": {
"properties": {
"adminUsername": {
"type": "string"
},
"allowExtensionOperations": {
"type": "boolean"
},
"computerName": {
"type": "string"
},
"requireGuestProvisionSignal": {
"type": "boolean"
},
"secrets": {
"type": "array"
},
"windowsConfiguration": {
"properties": {
"enableAutomaticUpdates": {
"type": "boolean"
},
"enableVMAgentPlatformUpdates": {
"type": "boolean"
},
"patchSettings": {
"properties": {
"assessmentMode": {
"type": "string"
},
"enableHotpatching": {
"type": "boolean"
},
"patchMode": {
"type": "string"
}
},
"type": "object"
},
"provisionVMAgent": {
"type": "boolean"
}
},
"type": "object"
}
},
"type": "object"
},
"provisioningState": {
"type": "string"
},
"storageProfile": {
"properties": {
"dataDisks": {
"type": "array"
},
"imageReference": {
"properties": {
"exactVersion": {
"type": "string"
},
"offer": {
"type": "string"
},
"publisher": {
"type": "string"
},
"sku": {
"type": "string"
},
"version": {
"type": "string"
}
},
"type": "object"
},
"osDisk": {
"properties": {
"caching": {
"type": "string"
},
"createOption": {
"type": "string"
},
"deleteOption": {
"type": "string"
},
"managedDisk": {
"properties": {
"id": {
"type": "string"
}
},
"type": "object"
},
"name": {
"type": "string"
},
"osType": {
"type": "string"
}
},
"type": "object"
}
},
"type": "object"
},
"timeCreated": {
"type": "string"
},
"vmId": {
"type": "string"
}
},
"type": "object"
},
"resources": {
"items": {
"properties": {
"id": {
"type": "string"
}
},
"required": [
"id"
],
"type": "object"
},
"type": "array"
},
"tags": {
"properties": {},
"type": "object"
},
"type": {
"type": "string"
}
},
"required": [
"name",
"id",
"type",
"location",
"properties"
],
"type": "object"
},
"type": "array"
}
},
"type": "object"
}
ちなみにスキーマは、③で実施した仮想マシンのID情報を取得するためのHTTPアクションの出力値を、「サンプルのペイロードを使用してスキーマを生成する」というボタンをクリックして出てくるポップアップに読み込ませることでも生成することができます。
しかし、【仮想マシンのID情報を取得するためのHTTPアクションの出力値を、「サンプルのペイロードを使用してスキーマを生成する」というボタンをクリックして出てくるポップアップに読み込ませること】でスキーマを生成した場合、JSONの解析でエラーが発生する場合があります。
私もエラーに遭遇して、その時にトラブルシューティングした内容は以下にまとめてありますので、必要であれば参考にしてください。
⑤[For each] アクションの設定
最後に「制御」のアクションの中にある [For each] アクションを設定します。
「以前の手順から出力を選択」には [JSONの解析] の中の [value] という値を選択します。
※このパラメータで [HTTP] の [本文] などを設定してしまうとエラーになります。
「本文」などのパラメータはオブジェクト型なので繰り返し処理に対応していないからです。
その後「アクションの追加」で「HTTP」を追加して再度 [HTTP] アクションの設定を行います。
[種類] は「POST」を選択して、
[URI] は以下のURLをコピーした上で {} の部分を「id」という変数を設定します。
※/(スラッシュ)の有無に注意してください。
https://management.azure.com{}/start?api-version=2021-11-01
[id] は複数あるので、[location] の上にあるものを選択してください。
また、[認証] も適切な値を利用してください。
これで設定は完了です。
ロジックアプリを実行する
作成したロジックアプリを実行すると、
今回作成したロジックアプリですべての仮想マシンを起動できることを確認できます。
●ロジックアプリ実行前の仮想マシンの状態
●ロジックアプリ実行後の仮想マシンの状態
また、ロジックアプリも正常に完了します。
画像では表現しきれませんでしたが、ロジックアプリの完了前に仮想マシンは起動し始めました。
さいごに
さらっと書いていますが実はスキーマの生成のエラー処理にかなり時間がかかりました。。
エラー処理をしていて「スキーマの定義って難しいんだな」としみじみ感じました。
また、今回は試しきれませんでしたが、[for each] アクションの中に if などを利用して条件を付けることで、自動起動させたくない仮想マシンを選択することもできそうでしたので、また試してみたいと思います。