こんにちは、アーキテクトのやまぱんです。
補足コメントや質問、いいね、拡散、是非お願いします🥺!
間違ってたら優しく教えてください!
モチベ
何度もハマるから自分ようのメモ、きっと他にもハマるひとはいるはず。
忘れたときに Bicep の配列にハマる
結論から言えば問題は、bicep の配列って記載した通りに入らない。
具体例
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
}
}
]
}
}
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 利用。
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' = {
parent: vnet
name: firewallSubnetName
properties: {
addressPrefix: firewallSubnetAddressPrefix
}
}
subnet: {
id: firewallSubnet.id
}
Existing を使う
これが一番スマートな気がします。
VNet 作成後に作成されたやつを Existing を使って呼びだす
resource firewallSubnet 'Microsoft.Network/virtualNetworks/subnets@2022-05-01' existing = {
parent: vnet
name: firewallSubnetName
}
subnet: {
id: firewallSubnet.id
}
指定の仕方を工夫する < resourceID 関数を使う >
subnet: {
id: resourceId('Microsoft.Network/virtualNetworks/subnets', vnetName, firewallSubnetName)
}
あとがき
もっとスマートな対処を思いついたらまたアップデート予定