📑

BicepでCosmos DBのファイアウォールを設定する

2023/08/29に公開

やりたいこと

BicepでCosmos DBをデプロイする際にネットワーク設定の以下の2点をオンに設定したいというケースです。この応用で特定のIPアドレスも許可できます。

  • パブリック Azure データセンター内からの接続を受け入れる(Accept connections from within public Azure datacenters
  • Azure Portal からのアクセスを許可する(Allow access from Azure Portal

ポイント

ポイントが2点あるので順番に見ていきます。

ポイント1: Azure Portalではチェックボックスでもデータ構造的にはフラグではない

Azure Portal上ではチェックボックスUIなので、Bicepでも何かのプロパティにtrueを設定すればいいのかなと思いがちですが、そうではありません。
実際には以下のようにそれぞれに紐づいた特定のIPアドレスを許可することによって実現します。

Azure Portal からのアクセスを許可する

Azure Portal には複数のIPアドレスが割り当てられています。通常、日本からの利用であれば「その他のすべてのリージョン」のIPアドレス群を許可すれば良いケースがほとんどかと思います。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-configure-firewall#allow-requests-from-the-azure-portal

パブリック Azure データセンター内からの接続を受け入れる

Azureリソースからの接続を許可するにはAzure Portalからのアクセス許可と同様に0.0.0.0を許可します。

https://learn.microsoft.com/ja-jp/azure/cosmos-db/how-to-configure-firewall#allow-requests-from-global-azure-datacenters-or-other-sources-within-azure

ポイント2:APIバージョンによって設定するプロパティが違う

ここがこの記事の本題です。上記のドキュメントでは各IPアドレスをipRangeFilterプロパティに設定するように記載があります。
しかし、ipRangeFilterプロパティはARM APIバージョン2020-03-01までしかサポートされていません。
ではどうするのかというと、APIバージョン2020-04-01以降ではipRulesプロパティを使用します。

2020-03-01まで
properties: {
    consistencyPolicy: {
      defaultConsistencyLevel: 'Session'
    }
    databaseAccountOfferType: 'Standard'
    locations: [
      {
        locationName: location
      }]
    ipRangeFilter: '0.0.0.0,104.42.195.92,40.76.54.131,52.176.6.30,52.169.50.45,52.187.184.26'
  }
2020-04-01以降
properties: {
    consistencyPolicy: {
      defaultConsistencyLevel: 'Session'
    }
    databaseAccountOfferType: 'Standard'
    locations: [
      {
        locationName: location
      }]
    publicNetworkAccess: 'Enabled'
    ipRules: [
      {
        ipAddressOrRange: '0.0.0.0'
      }
      {
        ipAddressOrRange: '104.42.195.92'
      }
      {
        ipAddressOrRange: '40.76.54.131'
      }
      {
        ipAddressOrRange: '52.176.6.30'
      }
      {
        ipAddressOrRange: '52.169.50.45'
      }
      {
        ipAddressOrRange: '52.187.184.26'
      }
    ]
  }

デプロイ!

執筆時点で最新バージョンの2023-04-15ipRulesを使用した以下のようなテンプレートをデプロイします。

main.bicep
param location string = resourceGroup().location
param name string = 'cosmosnwtest'

resource cosmosDbAccount 'Microsoft.DocumentDB/databaseAccounts@2023-04-15' = {
  name: name
  location: location
  kind: 'GlobalDocumentDB'
  properties: {
    consistencyPolicy: {
      defaultConsistencyLevel: 'Session'
    }
    databaseAccountOfferType: 'Standard'
    locations: [
      {
        locationName: location
      }]
    publicNetworkAccess: 'Enabled'
    ipRules: [
      {
        ipAddressOrRange: '0.0.0.0'
      }
      {
        ipAddressOrRange: '104.42.195.92'
      }
      {
        ipAddressOrRange: '40.76.54.131'
      }
      {
        ipAddressOrRange: '52.176.6.30'
      }
      {
        ipAddressOrRange: '52.169.50.45'
      }
      {
        ipAddressOrRange: '52.187.184.26'
      }
    ]
  }
}

az deployment group create --resource-group cosmostest --template-file main.bicep

デプロイしたリソースにAzure Portalでアクセスしてみると想定通りの設定が反映されていることがわかります。

Tips

デプロイしたほぼ全てのリソースは「概要」ページから「JSONビュー」にアクセスできます。
JSONビューでは、そのリソースのAPIバージョンごとのデータ構造が表示できます。Bicepの構造と完全に同じとはいかないまでもAPIバージョンごとのプロパティのデータ構造が垣間見えるので、Bicepの書き方で詰まったときはここを見てみると解決の糸口があるかもしれません。

まとめ

今回使用したipRulesプロパティを設定するとAzure Portalのチェックボックスに相当する設定項目だけでなく、例えば自宅のIPアドレスなど特定のIPアドレスを許可することも可能ですし、virtualNetworkRulesプロパティで特定の仮想ネットワークからのACL(Access Control List)を設定することも可能です。

Azureサービス自体のアップデートと共に、それを表すデータ構造は変更されます。
しかし基本的に Portalから設定できるプロパティはBicepでも設定が可能です。
仮にプロパティが更新されて変更されても、その項目をマッピングして読み替えるということが今後も必要になる可能性があります。

Azureサービスごと&APIバージョンごとのデータ構造は以下のドキュメントの「リファレンス」セクションに網羅されています。
https://learn.microsoft.com/ja-jp/azure/templates/

GitHubで編集を提案
Microsoft (有志)

Discussion