normalian blog

Let's talk about Microsoft Azure, ASP.NET and Java!

Microsoft Azure のリソースグループからテンプレートをエクスポートして環境をコピーする

Microsoft Azure がリソースグループと呼ばれる管理単位を利用し、仮想マシンや WebApps といったリソースをひとまとまりで管理することが可能になる。これにより、リソースの区切り単位が明確になった他、リソースグループ単位で一括で削除ができるために削除忘れが減る等の利点が存在した。
そんなリソースグループだが、昨今は「作成した既存環境のリソースグループをテンプレートとしてエクスポートする」という機能が追加された。これにより、お気軽に既存環境のコピーが可能となった。主に以下の用途で使えるのではないかという推察だ。

  • 開発チームが増員した際、増員者分の環境をコピーする
  • カスタマイズありの SaaS 系サービスの提供ベンダが、各顧客向けに用意する環境としてコピーする

早速使ってみる

最近 Application Insights の検証に利用していたリソースが残っているので、以下のリソースをコピーすることを考えてみる。
f:id:waritohutsu:20160314161435p:plain

設定 - テンプレートのエクスポート を選択すると、以下の画面が表示される。
f:id:waritohutsu:20160314161644p:plain

上記から ファイルに保存 を選択し、ExportedTemplate-"リソースグループ名".zip ファイルをダウンロードすると以下の中身になる。

  • deploy.ps1 … テンプレートデプロイ用のスクリプト
  • template.json … リソースグループのテンプレート、原則修正不要のはずだがちょくちょく修正が必要
  • parameters.json … テンプレートのパラメータ、こちらで値を設定する

上記のうち parameters.json を新規に作るリソース向けに仮想マシン名、ユーザ名、パスワード等々を修正して deploy.ps1 を実行すると以下のようになる。

PS C:\tmp\ExportedTemplate-arm-appinsights-linux-group> .\deploy.ps1
コマンド パイプライン位置 1 のコマンドレット deploy.ps1
次のパラメーターに値を指定してください:
subscriptionId: "サブスクリプションID"
resourceGroupName: "作成済みのリソースグループ、存在しないとエラーになる"
deploymentName: "任意名"
Logging in...

"中略"

Using existing resource group "作成済みのリソースグループ"

DeploymentName     : template
CorrelationId      : xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
ResourceGroupName  : "作成済みのリソースグループ"
ProvisioningState  : Succeeded
Timestamp          : 2016/03/14 6:28:29
Mode               : Incremental

"中略"

上記に実行するだけで容易に既存リソースのコピーが可能だ。まだ発展途上ではあるが、改善後は様々な用途が考えられる面白い機能といえる。

既知の注意点

まだプレビュー機能であるため、以下に注意が必要だ。

  • パブリック IP アドレス の重複に注意

仮想マシンにパブリック IP アドレスを付与済みであり、DNS 名を登録している場合、template.json の以下の個所を修正する必要がある。

        {
            "comments": "Generalized from resource: 'もろもろID'",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('publicIPAddresses_AppInsightsVM2_name')]",
            "apiVersion": "2015-06-15",
            "location": "japaneast",
            "properties": {
                "publicIPAllocationMethod": "Dynamic",
                "idleTimeoutInMinutes": 4,
                "dnsSettings": {
                    "domainNameLabel": "'ここはそのままコピーすると重複してエラー'"
                }
            }
        },

何も修正しないと以下のようなエラーになる。

New-AzureRmResourceGroupDeployment : 13:19:16 - Resource Microsoft.Network/publicIPAddresses 'AppInsightsVMPubIP' failed with message 'DNS record '自身で設定済のdns名'.japaneast.cloudapp.azure.com is already used by another public IP.'
発生場所 C:\tmp\ExportedTemplate-arm-appinsights-linux-group\deploy.ps1:99 文字:5
+     New-AzureRmResourceGroupDeployment -ResourceGroupName $resourceGr ...
+     ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : NotSpecified: (:) [New-AzureRmResourceGroupDeployment], Exception
    + FullyQualifiedErrorId : Microsoft.Azure.Commands.Resources.NewAzureResourceGroupDeploymentCommand

管理画面から閲覧可能だが、以下のようにサポートされていないリソースがあるので、テンプレートのエクスポート時に注意が必要だ。
f:id:waritohutsu:20160314161755p:plain