【Azure】Logic Appsで全ての仮想マシンを自動起動させてみた

Azure VirtualMachine

前回の記事では、ある1つの仮想マシンのみを起動させてみましたが、今度は存在するすべての仮想マシンを自動起動させてみました。

今回はロジックアプリ自体の作成やマネージドIDの設定は省略しますので、必要であれば前回の記事を参照ください。

【Azure】Logic Appsで仮想マシンを特定の時間に自動起動させてみた
仮想マシンはAzureポータル上で自動シャットダウンの設定は簡単に設定することができますが、自動起動することは簡単にはできません。そこで今回はロジックアプリとRestAPIを組み合わせて仮想マシンを特定の時間に起動させる方法を試してみました。
広告

ロジックアプリデザイナーの設定

1つの仮想マシンを起動する時と異なり、すべての仮想マシンを起動するためには、仮想マシンのリソースグループ名と仮想マシン名をそれぞれ取得した上で仮想マシンを起動するためのAPIをたたく必要があります。

そこで今回は、まず仮想マシンの一覧を表示するAPIを利用して「仮想マシンのID情報を取得」、すなわち仮想マシンのリソースグループ名と仮想マシン名を含んだID情報を取得します。

その後、取得したID情報を利用し、繰り返し処理も利用することですべての仮想マシンに対して仮想マシンを起動するAPIをたたき、すべての仮想マシンを起動していきます。

従って今回作成するフローは以下のようになります。

フローの全体像

➀[繰り返し]アクションの設定

前回同様、日本時間の午前10:00に毎日実行されるように設定します。

[繰り返し]アクションの設定

➁[変数]アクションの設定

[変数] アクションの中から「変数を初期化する」を選択して設定します。
今回は「サブスクリプションID」のみ設定しておきます。

サブスクリプション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を利用しています。

仮想マシンのID情報を取得するHTTPフロー

④[JSONの解析] アクションの設定

③で取得した仮想マシンのID情報を変数として利用するために、「JSONの解析」というアクションを利用します。

[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の解析でエラーが発生する場合があります。

私もエラーに遭遇して、その時にトラブルシューティングした内容は以下にまとめてありますので、必要であれば参考にしてください。

「ValidationFailed. スキーマの検証に失敗しました。」の対処方法(JSONの解析)
ロジックアプリを利用していて、このエラーにかなり苦戦したのでその解決方法をまとめてみました。今回私が遭遇したエラーの原因は、複数あるエラーの中の1つだと思いますので、原因が異なる場合にはトラブルシューティングする際に確認すべきポイントとして参考にしていただければと思います。

⑤[For each] アクションの設定

最後に「制御」のアクションの中にある [For each] アクションを設定します。

「以前の手順から出力を選択」には [JSONの解析] の中の [value] という値を選択します。

 ※このパラメータで [HTTP] の [本文] などを設定してしまうとエラーになります。
  「本文」などのパラメータはオブジェクト型なので繰り返し処理に対応していないからです。

[For each] アクションの設定

その後「アクションの追加」で「HTTP」を追加して再度 [HTTP] アクションの設定を行います。

[For each] アクション内のHTTP設定

[種類] は「POST」を選択して、
[URI] は以下のURLをコピーした上で {} の部分を「id」という変数を設定します。
 ※/(スラッシュ)の有無に注意してください。

https://management.azure.com{}/start?api-version=2021-11-01

[id] は複数あるので、[location] の上にあるものを選択してください。

[location]の上の[id]を選択

また、[認証] も適切な値を利用してください。

これで設定は完了です。

広告

ロジックアプリを実行する

作成したロジックアプリを実行すると、
今回作成したロジックアプリですべての仮想マシンを起動できることを確認できます。

●ロジックアプリ実行前の仮想マシンの状態

ロジックアプリ実行前の仮想マシンの状態

●ロジックアプリ実行後の仮想マシンの状態

ロジックアプリ実行後の仮想マシンの状態

また、ロジックアプリも正常に完了します。

画像では表現しきれませんでしたが、ロジックアプリの完了前に仮想マシンは起動し始めました。

正常に完了したロジックアップ
広告

さいごに

さらっと書いていますが実はスキーマの生成のエラー処理にかなり時間がかかりました。。
エラー処理をしていて「スキーマの定義って難しいんだな」としみじみ感じました。

また、今回は試しきれませんでしたが、[for each] アクションの中に if などを利用して条件を付けることで、自動起動させたくない仮想マシンを選択することもできそうでしたので、また試してみたいと思います。

コメント

タイトルとURLをコピーしました