【Bicep入門 #12】NICへのPublic IPアドレスを紐づける

この記事の内容

  • Azure BicepでPublic IPアドレスリソースを作成した後、NIC(ネットワークインターフェイス)に紐づける方法を解説します
  • NICのIP構成(ipConfigurations)にPublic IPを関連付けるBicepの正しい書き方を確認します
  • Azureポータルで実際の構成を確認し、JSONの構造からBicepの正しい記法を逆引きする手法を紹介します
  • VS Codeの補完と実際の挙動が異なるケースへの対処法を紹介します

はじめに

前回までの手順で、Public IPアドレスリソースの作成とNICの作成はBicepで記述できるようになりました。しかし、この時点ではNICにはサブネットの指定のみが行われており、Public IPアドレスとの紐づけができていない状態です。

結果として、デプロイしたVMはPrivate IPしか持たない構成になっています。今回はこの状態を解消し、NICのIP構成にPublic IPを正しく紐づける方法を確認していきます。


現状の確認:Public IPが紐づいていない状態

Bicepのデプロイ自体は成功しているものの、ポータルでNICを確認すると「Public IPなし」という状態になっています。NICのIP構成(ipconfig1)を見ると、サブネットは指定されていますがPublic IPアドレスの欄が空になっています。

ポータル上でPublic IPを手動で関連付ける操作を行う場合は、以下の流れになります。

  1. NICの「IP構成」を開く
  2. ipconfig1 を選択する
  3. 「Public IPアドレス」欄で作成済みのPublic IPリソースを選択する
  4. 保存する

この操作をBicepで表現するには、NICリソースの ipConfigurations プロパティ内に publicIPAddress の指定を追加する必要があります。


Bicepでの記述:最初の試み

まず、ipConfigurations の中に publicIPAddress プロパティを追加し、Public IPリソースの id を直接渡す方法を試みます。

resource nic 'Microsoft.Network/networkInterfaces@2023-04-01' = {
  name: nicName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnet.id
          }
          publicIPAddress: publicIpAddress.id  // ← この書き方は誤り
        }
      }
    ]
  }
}

しかし、このままデプロイするとエラーが発生します。エラーメッセージは以下のような内容です。

Valueforreferencedsidismissing

publicIPAddress プロパティが期待する型は id の文字列ではなく、PublicIPAddress オブジェクト全体であることがわかります。VS Codeの補完では id を渡す記述が通っているように見えても、実際のデプロイでは失敗するケースがあります。これはエディタの補完と実際の挙動が一致しないパターンの一例です。


ポータルのJSONで正しい構造を確認する

正しい記法を確認するために、Azureポータルで手動設定後のNICリソースのJSONを確認します。ポータル上でPublic IPを関連付けた後、リソースのJSONビューを開くと、以下のような構造になっています。

"ipConfigurations": [
  {
    "name": "ipconfig1",
    "properties": {
      "subnet": {
        "id": "/subscriptions/.../subnets/..."
      },
      "publicIPAddress": {
        "id": "/subscriptions/.../publicIPAddresses/..."
      }
    }
  }
]

publicIPAddressid プロパティを持つオブジェクトとして渡す必要があることが確認できます。


Bicepの正しい書き方

ポータルのJSON構造に合わせて、Bicepを以下のように修正します。

resource nic 'Microsoft.Network/networkInterfaces@2023-04-01' = {
  name: nicName
  location: location
  properties: {
    ipConfigurations: [
      {
        name: 'ipconfig1'
        properties: {
          subnet: {
            id: subnet.id
          }
          publicIPAddress: {
            id: publicIpAddress.id  // ← オブジェクトとして渡す
          }
        }
      }
    ]
  }
}

publicIPAddress に対してオブジェクト { id: ... } として id を渡す形が正解です。この書き方であれば、VS Code上でもエラーが消え、デプロイ時の挙動とも一致します。


デプロイの確認

修正後のBicepをコミット・デプロイすると、リソースグループの展開が正常に完了します。NICのIP構成を確認すると、ipconfig1 にPublic IPアドレスが正しく紐づいていることが確認できます。


まとめ

  • NICのIP構成にPublic IPを紐づけるには、ipConfigurations 内の publicIPAddress プロパティに { id: リソースID } の形でオブジェクトを渡す必要があります
  • id の文字列を直接渡す記法は、VS Codeの補完では通っても実際のデプロイでエラーになる場合があります
  • Bicepの正しい書き方に迷ったときは、Azureポータルで手動設定後のJSONビューを参照することで、期待するデータ構造を逆引きできます
  • ポータル上での手動操作は台数が少ない場合は問題ありませんが、多数のリソースを扱う場合はBicepによる自動化が重要になります