検証環境・本番環境など、環境毎に同様の構成でリソースグループを作成する必要があり、Azureポータルの「Automationスクリプト」メニューで得られるResource Managerテンプレート(以下、「テンプレート」と記載)を使って別環境を構築してみました。
本稿では、やってみて判ったハマりどころを踏まえ、上記要件に対するより良いアプローチを考察します。
前提
ARMの概念・用語をきちんと理解しないとテンプレート利用の理解が難しくなるため、正確に理解したい場合はまず公式サイトの説明を一読しましょう。
ちなみに、Azureポータル上では「Automationスクリプト」というメニューから選択中のリソースグループの構成をテンプレートとして出力できますが、テンプレートはAzure Automationの機能でなく、Resource Managerの機能です。「Azure Automation」でネット検索してもテンプレートの情報はヒットしないので、注意しましょう。
実施概要
- Azureポータルの環境Aの「Automationスクリプト」メニューから、環境Aの構成を表すテンプレートおよびパラメータファイルを取得
- Visual Studioで、取得したテンプレート・パラメータファイルを環境Bのものとしてアレンジ
→ リソース名や環境毎に異なる接続先URLなど - Visual Studioで、環境Bのリソースグループを作成後、環境Bに変更したテンプレートをデプロイ
- エラーが色々出るので、修正して再デプロイ
何度か再デプロイを繰返すことで、環境のコピーは完了しました。
ハマりどころ
- 「Automationスクリプト」の出力には、リソースの構成すべては出力されない
- 例えば、App Serviceの「アプリ設定」は出力されない
- 試しに、Azure Resource ExplorerでARMのREST APIがどのようなJSONを出力しているか確認したところ、それらしい項目として、properties.siteProperties.appSettings=nullがあった。しかしリファレンスを見ると、「アプリ設定」に対応する要素はproperties.siteConfig.appSettingsと記載されていて、properties.siteProperties.appSettingsという項目は定義が無い・・
- properties.siteConfig.appSettingsを追記してデプロイすれば、期待通り「アプリ設定」は設定された
- 例えば、App Serviceの「アプリ設定」は出力されない
- 「Automationスクリプト」の出力時に「◯◯のリソースを取得できませんでした。この種類のリソースはエクスポートされません。」というエラーメッセージが出るが、実際には出力されているものも多数。しかし、それを残してデプロイするとInternal Server Errorが発生したり、デプロイのレスポンスが長時間返ってこなかったりしたので、手作業で削除する必要がある
- 元の環境で発行された値で、残したままデプロイすると、デプロイ時の指定が許可された値ではないとしてエラーになるものがある
- SQLデータベースの「databaseId」や「creationId」など
- 環境毎に値を変更すると考えられる設定値はパラメータファイルに切り出されて出力されているはずだが、アプリケーションゲートウェイの振り分け先URLなどパラメータに切り出されていない
- 出力されたテンプレートファイルのうち、どの値を変更すべきか、すべて目視でチェックする必要がある
- デフォルトで設定された項目もすべてテンプレートに記載されるため、チェックの労力はかなり大きい
- 出力されたテンプレートファイルのうち、どの値を変更すべきか、すべて目視でチェックする必要がある
考察
「Automationスクリプト」メニューの出力は、一言で言うと「一部欠落があるリソースグループのスナップショット」です。環境コピーに使うのは結構つらい作業でした。ある程度ミスが許される状況においては選択肢となりますが、正確さが求められる実運用では使えないとの所感です。
後で気付きましたが、公式ドキュメントの既存のリソースから Azure Resource Manager テンプレートをエクスポートするでも、色々課題がある旨、記載がありますね。Azureポータルの「Automationスクリプト」メニューでは「Azure Resource Manager テンプレートを使用して、1 つにまとめられた操作でリソースのデプロイを自動化します」などと表示されますが、色々できそうだと夢を膨らませてはいけないようです・・
当初、本稿の最初に記載した要件への対応として、以下の運用をできないだろうかと考えました。
- AzureポータルからリソースグループAの構成を設定
- リソースグループAの構成をエクスポート
- エクスポートしたファイルをリソースグループBの構成に変更
- リソースグループBをインポート
やってみた結果、上記運用はかなわないことがわかったので、地道に以下の運用をするしかないかな、というのが現時点の考えです。
- 環境毎に差異がある項目をパラメータに切り出したテンプレートを作成
→ かなり大変なはず。開発時は、まずはAzureポータルで構成してみる場合が多いと思うが、同じ構成を表すテンプレートを、リファレンスやAutomationスクリプトの出力を参考にしつつ、手作業でおこす必要がある - リソースグループA向けのパラメータファイルを作成してデプロイすることで、リソースグループAを作成する
- リソースグループBを作成したい時は、リソースグループB向けのパラメータファイルを作成してデプロイして対応する
もっと良い方法などありましたら、コメントでご教示いただけると助かります (^_^