1
0

[Azure] Bicep の配列にハマる(n回目)

Last updated at Posted at 2024-05-26

こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、いいね、拡散、是非お願いします🥺!
間違ってたら優しく教えてください!

モチベ

何度もハマるから自分ようのメモ、きっと他にもハマるひとはいるはず。

忘れたときに Bicep の配列にハマる

結論から言えば問題は、bicep の配列って記載した通りに入らない。

具体例

VnetとSubnet 作る部分
param firewallSubnetName string = 'AzureFirewallSubnet'
resource vnet 'Microsoft.Network/virtualNetworks@2022-05-01' = {
  name: vnetName
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [vnetAddressPrefix]
    }
    subnets: [
      {
        name: mainsubnetName
        properties: {
          addressPrefix: subnetAddressPrefix
        }
      }
      {
        name: bastionSubnetName
        properties: {
          addressPrefix: bastionSubnetAddressPrefix
        }
      }
      {
        name: firewallSubnetName
        properties: {
          addressPrefix: firewallSubnetAddressPrefix
        }
      }
    ]
  }
}

Azure Firewall 作る部分
resource firewall 'Microsoft.Network/azureFirewalls@2022-05-01' = {
  name: firewallName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'AzureFirewallIpConfig'
        properties: {
          publicIPAddress: {
            id: firewallPublicIP.id
          }
          subnet: {
            id: vnet.properties.subnets[2].id
          }
        }
      }
    ]
  }
}

下記部分の配列指定が今回問題。

      subnet: {
        id: vnet.properties.subnets[2].id
      }

”id: vnet.properties.subnets[2].id” にはどの Subnet が入るかわからない!!
AzureFWのサブネットが入るとは限らない。
bicep に書いた通り配列に入るわけではない!

Azure Firewall には ”AzureFirewallSubnet” という専用の名前のサブネットが必要なので、正しく指定する必要がある。

ちなみに今回の場合だと下記のような Error Message が出現する

(Subscription ID)/resourceGroups/(Resource Group)/providers/Microsoft.Network/virtualNetworks/myVnet/subnets/myFirewallSubnet is invalid for Azure Firewall. Azure Firewall can only be created in subnet with name 'AzureFirewallSubnet'. (コード: SubnetNameMustBeAzureFirewallSubnet)

対処

他にも方法はある気がする。
結論、配列を使わない指定方法ができればよい。

Azure Firewall Subnet を別だしで作る

あんまりかっこよくない気もするが、できる。 シンプルかも。
VNet を作成後に、Azure FirewallSubnet を単独で作る。
依存(親子)関係があるので parent 利用。

Azure Firewall Subnet 作成部分
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
  parent: vnet
  name: firewallSubnetName
  properties: {
    addressPrefix: firewallSubnetAddressPrefix
  }
}
Azure Firewall での指定部分(抜粋)
          subnet: {
           id: firewallSubnet.id
          }

Existing を使う

これが一番スマートな気がします。
VNet 作成後に作成されたやつを Existing を使って呼びだす

Azure Firewall Subnet の Existing 呼び出し部分
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' existing = {
  parent: vnet
  name: firewallSubnetName
}
Azure Firewall での指定部分(抜粋)
          subnet: {
           id: firewallSubnet.id
          }

指定の仕方を工夫する < resourceID 関数を使う >

Azure Firewall での指定部分(抜粋)
          subnet: {
            id: resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, firewallSubnetName)
          }

あとがき

もっとスマートな対処を思いついたらまたアップデート予定

1
0
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0