しばやん雑記

Azure とメイドさんが大好きなフリーランスのプログラマーのブログ

Azure Resource Manager テンプレートを使って複雑なリソースをデプロイしてみる

前回で Azure Resource Manager テンプレートの基本的な部分は理解できた感じなので、今回は複数のリソースを含む少し複雑なテンプレートを作成してみます。

ARM テンプレートについては前回書いた部分を参照してください。

最近は MySQL を Site Extension にして、Web Apps で無理やり動かして遊んでいる関係もあるので、MySQL / phpMyAdmin / WordPress を一気にデプロイするテンプレートを作ってみました。

と言っても Site Extension をインストールして、MSDeploy で WordPress をインストールするだけです。

リソース間の依存関係

今回実現しようとしているテンプレートは、実行順序が重要となってくることに作っていて気が付きました。以下のようにリソース間でコンフリクトする挙動が存在するので、上手く対応する必要があります。

  • MSDeploy はデプロイ前に wwwroot 以下を削除しようとする
  • MySQL Site Extension は wwwroot\App_Data を作成する
    • mysqld を WebJob としてインストールするため

したがって、必ず MySQL Site Extension のインストール前に MSDeploy は実行しておく必要がありますが、ARM テンプレートを単純に書くと並列実行されてしまって、MSDeploy が失敗します。

ちゃんとこういう場合にも対応できるように ARM テンプレートは作られているので安心です。具体的にはテンプレートに dependsOn を追加して、MySQL のインストールの実行順を MSDeploy の後に設定します。

{
  "apiVersion": "2015-08-01",
  "name": "MSDeploy",
  "type": "extensions",
  "dependsOn": [
    "[resourceId('Microsoft.Web/Sites', parameters('siteName'))]",
    "[concat('Microsoft.Web/Sites/', parameters('siteName'), '/config/web')]"
  ],
  "properties": {
    "packageUri": "https://auxmktplceprod.blob.core.windows.net/packages/wordpress-4.3.1-IIS.zip",
    "dbType": "None",
    "setParameters": {
      "AppPath": "[parameters('siteName')]",
      "DbServer": "127.0.0.1",
      "DbName": "[parameters('databaseName')]",
      "DbUsername": "[parameters('databaseUsername')]",
      "DbPassword": "[parameters('databasePassword')]",
      "DbAdminUsername": "[parameters('databaseUsername')]",
      "DbAdminPassword": "[parameters('databasePassword')]"
    }
  }
},
{
  "apiVersion": "2015-08-01",
  "name": "mysql",
  "type": "siteextensions",
  "dependsOn": [
    "[resourceId('Microsoft.Web/Sites', parameters('siteName'))]",
    "[concat('Microsoft.Web/Sites/', parameters('siteName'), '/extensions/MSDeploy')]"
  ],
  "properties": { }
}

dependsOn にはリソースの ID を指定する必要がありますが、とりあえず concat で連結して作ります。ARM テンプレートのテスト時にこの辺りは検証してくれるので、早めに気が付くことが出来て便利でした。

完成した ARM テンプレートを Gist に上げておきました。

WordPress ARM Template · GitHub

このテンプレートでは WordPress の実行に必要な PHP バージョンの設定や、MySQL / phpMyAdmin のインストールまで行うようにしています。

デプロイして確認する

作成した azuredeploy.json を PowerShell コマンドレットを使ってデプロイしてみます。まずはテストを行ってからデプロイを実行するようにすると、単純な記法ミスなどに引っかかることがないので安心です。

f:id:shiba-yan:20151210124947p:plain

MySQL のインストールで時間が少しかかりますが、問題なくデプロイが完了したことが分かります。

Web Apps の設定として PHP 5.6 を使う設定と、Always On の有効化を行っていたので、ポータルからアプリケーション設定を確認しておくと、ちゃんと有効になっていました。

f:id:shiba-yan:20151210124957p:plain

アプリケーション設定では MySQL への接続文字列と、WEBSITE_DISABLE_SCM_SEPARATION の設定を行うように ARM テンプレートを作っておきました。

それ以外のキーは Site Extension との連携用なので気にしなくてもいいです。

f:id:shiba-yan:20151210124953p:plain

そして Site Extension は MySQL と phpMyAdmin がちゃんとインストールされていました。同時に mysqld を WebJob として作成するコードも入れておいたので、この時点で mysqld が動作しています。

f:id:shiba-yan:20151210125005p:plain

メインとなる WordPress のインストールと設定は MSDeploy が行っているので、デプロイが完了したタイミングで WordPress のセットアップを行えるようになっています。

セットアップ URL を叩くと、ちゃんとアプリケーションが起動しました。

f:id:shiba-yan:20151210124940p:plain

必要な情報を入力し、セットアップが完了すると WordPress デフォルトのページが表示されました。ARM テンプレートを使ってデプロイするだけで、一通りの設定を自動的に行うことが簡単に出来ました。

簡単にインストールが行えましたが、良い子は真似してはいけない系のテンプレートです。

f:id:shiba-yan:20151210125022p:plain

ちなみに Azure Portal から ARM テンプレートを使ってデプロイすると、前回のように GUI で設定を行えるのでちょっと楽です。出来るだけドロップダウンとかで選択できるように作りたくなります。

f:id:shiba-yan:20151210125012p:plain

最後に作成した ARM テンプレートを使ってポータルでデプロイ可能なボタンを置いておきます。

https://portal.azure.com/#create/Microsoft.Template/uri/https%3a%2f%2fgist%2egithubusercontent%2ecom%2fshibayan%2f5be8f1de4ca509aef563%2fraw%2ffe2392514daa7de370d52287d4323d6f8142900d%2fazuredeploy%2ejson

あくまでもちょっと実験してみたいという人向けです。利用は自己責任で。