クラウドエンジニアブログ

Azure Blueprint を試してみた

青木 雅宏

青木 雅宏

こんにちは。青木です。
Azure のリソース作成の自動化といえば Azure Resource Manager Template (ARM Template) や Terraform があるかと思いますが、今回は Azure Blueprints を使用した Azure のリソース作成の方法を紹介します。


注意:当記事に記載している Azure Portal の画面名や画面項目名は 2021 年 9 月時点の情報です。


Azure Blueprints とはなにか?

Azure Blueprints は ARM Template を使用した Azure リソースの作成を自動化できます。
ARM Template 自体は 1 つのリソースグループに対してリソース作成を行いますが、Azure Blueprints では、「リソースグループの作成、ARM Template でのリソース作成」のセットを複数定義できるため、複数のリソースグループを使用する Azure アーキテクチャーの Azure リソースの構築を自動化できます。

Azure Blueprints を使用した環境構築の利点として、システム開発時に環境構築にかかる時間が、手作業による Azure リソース作成や、ARM Template のみを使用した Azure リソース作成に比べて短くなります。
特に複数の環境構築時は、Azure Blueprintsのパラメーターを変更してデプロイする作業のみで環境が構築できるため、効率的に環境構築が行えます。

注意:Azure Blueprints は 2021 年 9 月時点ではプレビュー版として提供されています。

Azure Blueprints での操作は次のような流れになります。

  • ブループリント定義の作成
    リソースグループの作成、リソース作成等の定義を行います。
  • ブループリントの発行
    作成したブループリント定義を発行することでブループリント定義を使用してデプロイできるようになります。
  • ブループリントの割り当て
    ブループリント定義を使用してデプロイを行います。

ブループリント定義には以下の「成果物」を定義することができます。
(公式ドキュメントには「アーティファクト」と記載されていますが、Azure Portal では「成果物」と表記されているため当記事では「成果物」と記載しています)

  • ソース グループの作成
    サブスクリプションに対してリソースグループを作成します。
  • Azure Resource Manager Template を利用したリソースの作成
    サブスクリプション、リソースグループに対してリソースを作成します。
  • ロールの割り当て
    サブスクリプション、リソースグループに対してロールの割り当てを行います。
  • ポリシーの割り当て
    サブスクリプション、リソースグループに対してポリシー、イニシアティブの割り当てを行います。

Azure Blueprints では以下の機能をサポートしています。
(代表的な機能を記載しています)

  • ブループリント定義のパラメーター
  • ブループリント定義のバージョン
  • ブループリントの割り当て時のリソースロック

ブループリント定義のパラメーター

成果物(ARM Template 等)でパラメーターが定義されている場合、ブループリント定義から成果物に対してパラメーターとしてリソース作成に必要な情報を渡すことができます。

次の2種類のパラメーターがあります。

  • 静的パラメーター
    ブループリント定義で固定値として指定するパラメーターです。
    同じブループリント定義を使用して複数環境構築した場合、静的パラメーターで指定した値はどの環境でも同じ値となります。
  • 動的パラメーター
    ブループリントの割り当て時に指定するパラメーターです。
    同じブループリント定義を使用して複数環境構築した場合、環境毎に異なる値を指定できます。

ブループリント定義のバージョン

ブループリントの発行時、ブループリントのバージョンを指定します。
ブループリントの割り当て時に発行済みのバージョンを指定して割り当てを行います。

ブループリントの割り当て時のリソースロック

ブループリントを使用して作成したリソースグループ、リソースにロックを適用できます。

ロックの種類
  • ロックしない
    リソースが変更、削除が可能な状態となります。
  • 削除しない
    リソースが削除不可能な状態となります。
  • 読み取り専用
    リソースが変更、削除不可能な状態となります。



Azure Blueprints を使って Azure のリソースを作成してみた

実際に Azure Blueprints を使用してAzure のリソースを作成してみます。
次の図のような構成のリソースを作成します。

この構成で Azure のリソースを作成するための Azure Blueprints 定義は以下になります。

ブループリントの作成

ブループリントを作成していきます。
Azure Portal の「ブループリント」画面の「ブループリントの定義」より「ブループリントの作成」をクリックします。

ブループリントの作成画面が表示されるので、「空白のブループリントで始める」をクリックします。

ブループリントの作成画面の基本タブが表示されるので各項目を入力し、「次へ:成果物」をクリックします。

定義の場所では、「…」をクリックし表示される定義の場所画面より、リソース作成先のサブスクリプションを選択し、「選択」ボタンをクリックします。

ブループリントの作成画面の「成果物」タブでは、ブループリントで作成するリソースの定義を行います。

まず、リソースグループを作成する定義を追加します。
「成果物の追加」をクリックし、表示された画面の「成果物の種類」より「リソースグループ」を選択し、「追加」をクリックします。
この画面でリソースグループ名、場所を指定することも可能ですが、ブループリントの割り当て時にこれらの項目を入力する定義とします。(動的パラメーターとして定義します)

次に、リソースグループに ARM Template でストレージアカウントを作成する定義を追加します。

リソースグループの下の「成果物の追加」をクリックし、成果物の追加画面で各項目を入力し、「追加」をクリックします。
「Parameter」は、リソースグループ同様動的なパラメーターとするため、ここではデフォルトのままとします。

Template には、ストレージアカウントを作成するための ARM Template の JSON を入力します。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "storageAccountName": {
            "type": "string"
        },
        "storageAccountType": {
            "type": "string",
            "defaultValue": "Standard_LRS",
            "allowedValues": [
                "Standard_LRS",
                "Standard_GRS",
                "Standard_ZRS",
                "Premium_LRS"
            ],
            "metadata": {
                "description": "Storage Account type"
            }
        },
        "location": {
            "type": "string",
            "defaultValue": "[resourceGroup().location]",
            "metadata": {
                "description": "Location for all resources."
            }
        }
    },
    "variables": {
    },
    "resources": [{
        "type": "Microsoft.Storage/storageAccounts",
        "name": "[parameters('storageAccountName')]",
        "location": "[parameters('location')]",
        "apiVersion": "2018-07-01",
        "sku": {
            "name": "[parameters('storageAccountType')]"
        },
        "kind": "StorageV2",
        "properties": {}
    }],
    "outputs": {
        "storageAccountName": {
            "type": "string",
            "value": "[parameters('storageAccountName')]"
        }
    }
}

次に、リソースグループへのロールの割り当ての定義を追加します。
ここでは、共同作成者権限を割り当てる定義を追加しています。

ここまでの作業で、リソースグループの作成、リソースグループへのロールの割り当て、リソースグループにストレージアカウントを作成する定義ができました。

続いて、別のリソースグループの作成と、作成したリソースグループに Web Apps を作成する定義を行います。
操作の流れは先ほど作成したストレージアカウントの作成と同じです。

リソースグループを作成する定義を追加します。

リソースグループに ARM Template で Web Appsを作成する定義を追加します。

Template には、Web Apps を作成するための ARM Template の JSON を入力します。

{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "webSiteName": {
            "type": "string"
        },
        "hostingPlanName": {
            "type": "string",
            "minLength": 1
        },
        "skuName": {
            "type": "string",
            "defaultValue": "F1",
            "allowedValues": [
                "F1",
                "D1",
                "B1",
                "B2",
                "B3",
                "S1",
                "S2",
                "S3",
                "P1",
                "P2",
                "P3",
                "P4"
            ],
            "metadata": {
                "description": "Describes plan's pricing tier and capacity. Check details at https://azure.microsoft.com/en-us/pricing/details/app-service/"
            }
        },
        "skuCapacity": {
            "type": "int",
            "defaultValue": 1,
            "minValue": 1,
            "metadata": {
                "description": "Describes plan's instance count"
            }
        },
        "SampleAppSettingValue": {
            "type": "string"
        }
    },
    "variables": {
    },
    "resources": [
        {
            "apiVersion": "2015-08-01",
            "name": "[parameters('hostingPlanName')]",
            "type": "Microsoft.Web/serverfarms",
            "location": "[resourceGroup().location]",
            "tags": {
                "displayName": "HostingPlan"
            },
            "sku": {
                "name": "[parameters('skuName')]",
                "capacity": "[parameters('skuCapacity')]"
            },
            "properties": {
                "name": "[parameters('hostingPlanName')]"
            }
        },
        {
            "apiVersion": "2015-08-01",
            "name": "[parameters('webSiteName')]",
            "type": "Microsoft.Web/sites",
            "location": "[resourceGroup().location]",
            "tags": {
                "[concat('hidden-related:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource",
                "displayName": "Website"
            },
            "dependsOn": [
                "[resourceId('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
            ],
            "properties": {
                "name": "[parameters('webSiteName')]",
                "serverFarmId": "[resourceId('Microsoft.Web/serverfarms', parameters('hostingPlanName'))]",
                "siteConfig": {
                    "appSettings": [
                        {
                            "name": "SampleKey1",
                            "value": "[parameters('SampleAppSettingValue')]"
                        }
                    ]
                }
            }
        },
        {
            "apiVersion": "2014-04-01",
            "name": "[concat(parameters('hostingPlanName'), '-', resourceGroup().name)]",
            "type": "Microsoft.Insights/autoscalesettings",
            "location": "[resourceGroup().location]",
            "tags": {
                "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]": "Resource",
                "displayName": "AutoScaleSettings"
            },
            "dependsOn": [
                "[resourceId('Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
            ],
            "properties": {
                "profiles": [
                    {
                        "name": "Default",
                        "capacity": {
                            "minimum": 1,
                            "maximum": 2,
                            "default": 1
                        },
                        "rules": [
                            {
                                "metricTrigger": {
                                    "metricName": "CpuPercentage",
                                    "metricResourceUri": "[concat(resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                                    "timeGrain": "PT1M",
                                    "statistic": "Average",
                                    "timeWindow": "PT10M",
                                    "timeAggregation": "Average",
                                    "operator": "GreaterThan",
                                    "threshold": 80.0
                                },
                                "scaleAction": {
                                    "direction": "Increase",
                                    "type": "ChangeCount",
                                    "value": 1,
                                    "cooldown": "PT10M"
                                }
                            },
                            {
                                "metricTrigger": {
                                    "metricName": "CpuPercentage",
                                    "metricResourceUri": "[concat(resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]",
                                    "timeGrain": "PT1M",
                                    "statistic": "Average",
                                    "timeWindow": "PT1H",
                                    "timeAggregation": "Average",
                                    "operator": "LessThan",
                                    "threshold": 60.0
                                },
                                "scaleAction": {
                                    "direction": "Decrease",
                                    "type": "ChangeCount",
                                    "value": 1,
                                    "cooldown": "PT1H"
                                }
                            }
                        ]
                    }
                ],
                "enabled": false,
                "name": "[concat(parameters('hostingPlanName'), '-', resourceGroup().name)]",
                "targetResourceUri": "[concat(resourceGroup().id, '/providers/Microsoft.Web/serverfarms/', parameters('hostingPlanName'))]"
            }
        },
        {
            "apiVersion": "2014-04-01",
            "name": "[parameters('webSiteName')]",
            "type": "Microsoft.Insights/components",
            "location": "East US",
            "dependsOn": [
                "[resourceId('Microsoft.Web/sites/', parameters('webSiteName'))]"
            ],
            "tags": {
                "[concat('hidden-link:', resourceGroup().id, '/providers/Microsoft.Web/sites/', parameters('webSiteName'))]": "Resource",
                "displayName": "AppInsightsComponent"
            },
            "properties": {
                "applicationId": "[parameters('webSiteName')]"
            }
        }
    ]
}

リソースグループへのロールの割り当ての定義を追加します。

ここまでの作業でブループリント定義が完成しました。下書き保存します。

ブループリントの発行

下書き保存状態のブループリントを発行することで、ブループリントの割り当てができるようになります。
ブループリントの定義画面より、先ほど作成したブループリントをクリックします。

ブループリントの画面で「ブループリントを発行する」をクリックします。

ブループリントを発行する画面で、バージョンを入力後、「公開」をクリックすることでブループリントを発行します。
バージョンには任意のバージョン番号を指定します。

Azure Portal 上で「ブループリント定義が正常に発行されました」が通知されれば発行は完了です。

ブループリントの割り当て

ブループリントの割り当てを行うことで、ブループリント定義より Azure のリソースが作成されます。
先ほど発行したブループリントの画面で「ブループリントの割り当て」をクリックします。

ブループリントの割り当て画面で各項目を入力し「割り当て」をクリックすると割り当て作業が開始されます。
「アーティファクト パラメーター」では、リソースグループ名、リソース名等リソース作成に必要な情報を入力します。これらは割り当て時に指定する動的パラメーターとなります。

パラメーターには次の値を指定しました。(一部のみ抜粋して記載)

リソースグループ1

項目名 設定値
リソースグループ:名前 rg-blueprint-storage1
[ユーザー名またはアプリケーション名]([ユーザー名またはアプリケーション名]:共同作成者名) テスト一郎
storageAccountName (ストレージアカウント) stblueprint1

リソースグループ2

項目名 設定値
リソースグループ:名前 rg-blueprint-web
[ユーザー名またはアプリケーション名]([ユーザー名またはアプリケーション名]:共同作成者名) テスト一郎
webSiteName(Web Apps) app-blueprint1
SampleAppSettingValue(Web Apps)※1 Value1

※1 アプリケーション設定の設定値です(キーは ARM Template で定義)

Azure Portal 上で「ブループリント割り当てが正常に完了しました」が通知されれば割り当て成功です。

通知にも記載されていますが、デプロイ作業が開始されているため、デプロイが完了するまで待ちます。
割り当てられたブループリント画面で、デプロイの状況が確認できます。デプロイが完了すると、プロビジョニング状態が「成功」と表示されます。

デプロイが完了したので、作成されたリソースを確認していきます。

リソースグループ1、ストレージアカウントがブループリント割り当て時のパラメーターの内容で作成されていることがわかります。

リソースグループ2、Web Apps も同様に作成されています。

リソースグループへのロールの割り当ても正常に行えています。

ブループリントの割り当て(2環境目)

先ほど発行したブループリント定義を使用し、別環境として Azure リソースを作成する場合は以下の操作となります。
(ブループリントの割り当ての操作は先ほど実施した操作とほぼ同じです)

  1. 先ほど発行したブループリントの画面で「ブループリントの割り当て」をクリックします。
  2. ブループリントの割り当て画面で各項目を入力します。

    割り当て名は重複できないので先ほど異なる値を入力します。
    別環境として Azure リソースを作成するので、パラメーター値も先ほどと異なる値を入力します。

  3. 全項目の入力が完了したら、「割り当て」ボタンをクリックします。
  4. デプロイが完了するまで待ちます。

操作は以上です。



おわりに

Azure Blueprints を使用した Azure のリソース作成を試してみました。
Azure を使用したシステム開発時に環境構築の一連の作業を Azure Blueprints に定義できるため、環境構築にかかる時間が大幅に軽減されることを実感できました。

今回紹介した内容は Azure Portal からの操作となりますが、Azure PowerShell や REST API での Azure Blueprints の操作や、ブループリント定義のコード化等面白そうな機能がそろっていますので、今後はよりディープに Azure Blueprints を学んでいこうと思います。

【総合】お問い合わせ

製品・サービスに関するお問い合わせはお気軽にご相談ください

ピックアップ

セミナー情報
クラウドエンジニアブログ
clouXion
メールマガジン登録