【Azure】【Iac】Resource Manager(リソースマネージャ)を使ってリソースをコード化してみた

IT話題

今回はAzureポータルの画面から
リソースグループに所属するリソースをコード化していつでも展開できる
【Resource Manager】(リソースマネージャ)について記事にしていきます。

リソース化する元の環境は、以下の記事で作成しています。

  • 本記事のターゲット
  • Azure Resource Managerとは
  • 実際に使ってみる
  • トラブルシュート(主にVM周り)
  • 最後に

【Azure】【Iac】Resource Manager(リソースマネージャ)を使ってリソースをコード化してみた

本記事のターゲット

  • Azureで検証を行った環境を維持する費用が高いと感じている方
  • 社内の開発環境を使っているけど、コストが高いから削除しなさいなどの指導を受けている方
  • Azureの構築リソースをプロダクトとして標準化していきたい(毎回同じものを作りたい)方

ご参考に、冒頭で紹介している記事の維持コストを記載します。

RHEL VM2台(B1ls)

IPSecVPNの構築用と疎通確認用の2台分です。
激安プランとはいえ2台で月4000~5000円程度かかります。

パブリックIPアドレス(2個)

VM用とBastion用の2個です。

Bastion(スタンダード)

これ、便利なのですがもう少し割安になりませんかね(涙)

合計金額

月額252ドル、約30000円ぐらいになってます。
コストの大半がBastionだったりします。。。

ポイント:Bastionは利用するときだけ起動しましょう!

Azure Resource Managerとは

以下はAzure公式の説明です。

Azure Resource Manager の概要

Azure Resource Manager (ARM) は、
Azure のリソースを簡単かつ効率的に管理するためのツールです。
ARM を使うとクラウド運用がスムーズになります。

リソース グループで管理

関連するリソースをまとめて管理でき、一括で操作可能です。

テンプレートで自動化

JSON 形式のテンプレートを使って、
リソースの構築や設定を自動化できます。

一貫した管理

Azure Portal、CLI、PowerShell など、
複数の方法で同じ操作ができます。

セキュリティとアクセス制御

ロールベースのアクセス制御 (RBAC) を使い、
誰が何を操作できるかを細かく設定可能です。

コストとポリシー管理

タグやポリシーを使い、リソースを効率的に整理し、監視できます。

実際に使ってみる

比較的簡単かつ直感的に利用できます。
利用したことない人もぜひ気軽に試してみてください。

まずはARMテンプレートの取得(エクスポート)

リソースグループを開いて、[オートメーション]-[テンプレートのエクスポート]
の画面を開きます。
するとテンプレートの生成が始まります。(1分ぐらい待たされます)

このように、リソースが表示されるようになるまで待ちます。

表示されたら[ダウンロード]をクリックしましょう。
ダウンロードされたZIPファイルを解凍して、中身のJSONコードを開いてみます。

こんな風に、JSONコードが出力されていたら成功です。次へ進みます。

テンプレートの加工

ARMテンプレートからデプロイしたことある方ならきっと経験があると思いますが、
割と一発でうまく行かないことが多いです。今回も以下のポイントで躓きましたので、
先に修正しておきます。
どんなエラーが出るのかの詳細は[トラブルシュート(主にVM周り)]にて後述します。

  • [osDisk.managedDisk.id] → OSディスクは新規作成前提でデプロイしたかったので事前作成しておらず怒られる
  • [requireGuestProvisionSignal] → 必須にしようとしているがその機能は利用可能じゃないよ、と怒られる
  • [adminPassword] → 初期ユーザのパスワードを設定してください、と怒られる
     ※テンプレートには普通に含まれてないので手で追加必要

赤枠:コメントアウト
青枠:osProfile直下へ追加 “adminPassword”: “パスワード”
 ※VM2台分忘れず加工しましょう。
  コメントアウトする箇所の前行に ,(カンマ)が入っている場合は
  JSON構文的に矛盾しないかチェックして、不要なら削除しましょう。

リソースグループを削除

リソースグループの[概要]に戻り、試しにリソースグループごと削除してみましょう。
※削除したリソースグループを復元していきます

[リソースグループの削除]をクリックします。

すると、削除の確認画面が表示されます。

削除を確認するためリソースグループ名の入力を行い、[削除]を押下します。

すると、確認のポップアップが表示されるので[削除]を押下します。
※本番業務環境では検証しないでください。本当にすっからかんになりますので。

削除後に画面をリロードすると、こんな風にすべて消滅しています。

リソースグループを再作成

同じ名前のリソースグループを作成します。

テンプレートのインポート

[リソースの作成]から[開発者ツール]の
[テンプレートのデプロイ]下にある[作成]を押下します。

カスタムデプロイの画面が開くので、
[エディターで独自のテンプレートを作成する]
を押下します。

こんな風に画面が切り替わるので、先ほど取得したARMテンプレートのテキストを貼付けます。(上書きでOKです)

貼付けしたら保存します。

先ほど作成したリソースグループをセットして、
[次へ]を押下します。

この画面ではエラーが表示されないことを確認しましょう。

どんどん作成されていきます。正常終了するまで待ちます。

正常にデプロイできました。

リソースグループの中身を見に行きます。
うまく作成できているようですね。

サクッとうまく行っていますが、実際には3回程度ズッコケました。。。
続いて、トラブルシュートの詳細を掲載します。

デプロイ対象のリソースにもよりますが
なんだかんだ、1回で成功することのほうが珍しい印象です。
特にVM周りは大変だと思います。

トラブルシュート(主にVM周り)

VM2台でエラーが発生しました。
パラメーター ‘osDisk.managedDisk.id’ は使用できません。

最初からディスクを用意しておくなど、工夫する必要があるようです。
バックアップからのディスク復元などを行うときは
リソースマネージャーの動作の中でディスク作成してもいいかもしれませんね。

エラーの内容から、「もともとディスクが用意されている前提」
で動作させたのが失敗の原因のようです。
VMのディスクは新規作成するとまた再設定必要になるので
できればバックアップから復元利用したいのですが、今回はそこまでやらずに
単純に新規VMとしてデプロイしていきます。

まず原因のコードを特定します。

       {
            "type": "Microsoft.Compute/virtualMachines",
            "apiVersion": "2024-07-01",
            "name": "[parameters('virtualMachines_Azure_SOTSU_name')]",
            "location": "japaneast",
            "dependsOn": [
                "[resourceId('Microsoft.Network/networkInterfaces', parameters('networkInterfaces_Addache_Private_name'))]"
            ],
            "properties": {
                "hardwareProfile": {
                    "vmSize": "Standard_B1ls"
                },
                "additionalCapabilities": {
                    "hibernationEnabled": false
                },
                "storageProfile": {
                    "imageReference": {
                        "publisher": "RedHat",
                        "offer": "RHEL",
                        "sku": "94_gen2",
                        "version": "latest"
                    },
                    "osDisk": {
                        "osType": "Linux",
                        "name": "[concat(parameters('virtualMachines_Azure_SOTSU_name'), '_OsDisk_1_9e8afa26134f402980b249242b6efc01')]",
                        "createOption": "FromImage",
                        "caching": "ReadWrite",
                        "managedDisk": {
                            "id": "[resourceId('Microsoft.Compute/disks', concat(parameters('virtualMachines_Azure_SOTSU_name'), '_OsDisk_1_9e8afa26134f402980b249242b6efc01'))]"
                        },
                        "deleteOption": "Delete"
                    },
                    "dataDisks": [],
                    "diskControllerType": "SCSI"

見つけました。idの部分をコメントアウトしてリトライします。

またエラー・・・
プロパティ ‘osProfile.requireGuestProvisionSignal’ は無効です。このサブスクリプションに対して ‘Microsoft.Compute/Agentless’ 機能が有効ではないためです。

上記無効化してリトライします。

またエラー・・・
必須パラメーター 'osProfile.adminPassword' がありません (null)。
(コード: InvalidParameter、ターゲット: osProfile.adminPassword)

仕方ないので追加しましょう。

ちなみに、以下はパブリックIPアドレスのデプロイエラーですが、
「作成および削除することに対して猶予時間のあるリソース」に対して
素早くデプロイを再検証しようとするとこんな風にビジー状態のエラーが返ってくるようです。
心を落ち着け深呼吸してから再度デプロイに臨みましょう。

ちなみに各リソースには以下のようにAPIを指定する構文が含まれています。

"apiVersion": "2024-07-01",

これは結構曲者で、Azureサブスクリプションの生成時期により使用できるAPIが異なったりします。
よくあるのが
「開発環境で検証したARMテンプレートを新規本番環境用に利用したらAPIエラーになった」
です。
幸い、失敗したときどのバージョンなら使えるのか(指定の仕方)を教えてくれるので、
その指摘に倣って黙々と修正をかけていけばいつかはデプロイ成功するようになります。

またリソースごとに呼び出せるAPIバージョンが異なるので、
統一したくて一括変更(変数で一元管理)などするとエラーの嵐につながることもあります。

最後に

いかがでしたでしょうか。
シンプルで扱いやすいけど、前述のとおりなかなか癖が強いARMテンプレートですが、
いざ利用してみると大変便利な作りになっています。

まだ触ったことがない方も、この記事などを参考にしてIacにトライしてみてください!

コメント

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