💪
Bicepで可用性ゾーンを利用したWeb(IaaS)-DB(PaaS)環境をサクッと作る
これはなに...?
- 可用性を意識してWeb(IaaS)-DB(PaaS)環境サクッと立てるためのBicepを作ったのでその共有
- 構成と書き方のポイントを紹介
- GitHubにあるソースコードの補足説明的なもの
該当リポジトリ
デプロイされる環境
以下のような環境をデプロイします。
アーキテクチャ上のポイント
Web用サブネット
WebサーバーとしてはIaaS VMを採用しています。可用性ゾーンを分けて冗長構成としています。デプロイするタイミングでcloud-init.yml
を渡すことで、Apacheのインストールとサービスの起動を行い、Webサーバ化しています。
DB用サブネット
データベースとしてはAzure Database for PostgreSQLを採用し、ゾーン冗長HA構成としています。SLAは99.99%となります。
Azure Database for PostgreSQL - フレキシブル サーバーは、自動フェールオーバー機能による高可用性構成を提供します。 高可用性ソリューションは、コミットされたデータが障害によって失われないこと、データベースがアーキテクチャでの単一障害点にならないことを保証するように設計されています。 高可用性が構成されている場合、フレキシブル サーバーによってスタンバイが自動的にプロビジョニングされて管理されます。(https://learn.microsoft.com/ja-jp/azure/postgresql/flexible-server/concepts-high-availability)
Bicep上のポイント
ディレクトリ構成としては以下のようなイメージです。
- main.bicep
- main.bicepparam
- modules/
└ appgw.bicep
└ bastion.bicep
└ postgreSql.bicep
└ vm.bicep
└ vnet.bicep
└ cloud-init.yml
Application Gateway
ドキュメントを見ればわかるのですが、Application Gatewayの定義がかなり膨大で苦労しました。
また、Application Gateway作成時、バックエンドプールに追加するVMのプライベートIPが複数になるのでどう渡そうか迷ったのですが以下のように実装しました。
-
main.bicep
側で、ループを利用してVMを作成 -
vm.bicep
ではVMのプライベートIPをoutput
に載せる -
appgw.bicep
のパラメータとして各VM作成ループの出力から得られるVMのプライベートIPをarray
として渡す -
appgw.bicep
内では、その配列をループで回してバックエンドプールの複数要素として利用する
そんな感じで試行錯誤したのが以下です。
main.bicep
module createAppGw './modules/appgw.bicep' = {
name: 'createAppGw'
params: {
location: location
appGwSubnetId: createVnet.outputs.appGwSubnetId
backendVmPrivateIps: [for i in range(0, webVmCount): createWebVms[i].outputs.vmPrivateIp]
}
dependsOn: [
createVnet
]
}
appgw.bicep
backendAddressPools: [
{
name: 'http-backend'
properties: {
backendAddresses: [
for ip in backendVmPrivateIps: {
ipAddress: ip
}
]
}
}
]
おわりに
- GitHubの方は適宜リファクタリングしていく予定です。
- Webサーバ上のアプリは何も載せていないので、Databaseとの接続は検証できていませんが、一応Private IPに名前解決できることだけは確認しております。
GitHubで編集を提案
Discussion