Azure VPN Gateway のデプロイと ARMテンプレートでの再作成

# はじめに
今回の記事では、シンプルに VPN ゲートウェイ の作成を紹介したかったのですが、それだけだとつまらないので、不要な時には 削除して課金を抑え、 必要になった時に 同一構成の VPN ゲートウェイ を簡単に再作成できる方法までを紹介したいと思います。

**VPN ゲートウェイ のコスト**
VPN ゲートウェイ の費用は、以下の公開情報に記載されています。

https://azure.microsoft.com/ja-jp/pricing/details/vpn-gateway?wt.mc_id=mvp_407731

下図は、上記の記事から抜粋していますが、BGP が利用できるうち 最安値 の SKU (VpnGw1) をデプロイすると、月額 2 万円 も掛かってしまいます。VPN ゲートウェイは、停止することができないため、リソースが存在しているだけで、これだけのコストが請求されてしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cf9f9bf0-d951-6e42-e9fd-aa69c1131bd0.png)

そのため、不要な時には 削除 しておき、必要な時に 同一構成の VPN ゲートウェイ を作成することで、コストを抑えることができるようになります。

# 関連記事：合わせて参照ください
**Azure VPN Gateway について**
SKU（機能、性能、コスト）の違いや、インスタンス、動作モード、可用性ゾーン (AZ)、接続方式 (S2S/V2V/P2S) などについて、詳細に解説しています。

https://qiita.com/carol0226/items/f28f381e3dcf43590d7b

**Azure 仮想ネットワークについてのまとめ**
VPN ゲートウェイのみならず、その他の Azure ネットワーク全般について解説しています。
全体の中で、VPN ゲートウェイは どのような位置づけなのかが判ります。

https://qiita.com/carol0226/items/c43bcb5def13c7e0ebac

# 前提事項
Azure サブスクリプション 上に、リソースグループ と 仮想ネットワーク が作成されている事を前提としています。
その前提となる環境は、以下の記事の設定値をもとに構成しています。

https://qiita.com/carol0226/items/c9975b5b438139481a73

当然、上記とは違う名称や IP アドレスでも構成可能ですが、私の記事の内容と読み替えて参照してください。

# ネットワーク設計
前提で用意した既存の 仮想ネットワークに、以下の **GatewaySubnet** を追加して利用する設計としました。

|変更点|役割|名称|アドレス|
|:-:|:-:|:-:|:-:|
|－|リソースグループ|AVD-Environment|－|
|－|仮想ネットワーク<br>(アドレス空間)|AZ-DefaultVNet|10.10.0.0/16|
|－|サブネット１|Subnet1|10.10.10.0/24|
|－|サブネット２|Subnet2|10.10.20.0/24|
|追加|ゲートウェイサブネット<br>管理用サブネット|GatewaySubnet|10.10.50.0/24|

:::note info
**VPN ゲートウェイ １発 デプロイ ボタン [Deploy to Azure]**
このボタンについては、最終章で解説していますが、上記のネットワーク設計どおりであれば、以下のボタンを押して、リソースグループを選んでデプロイ開始するだけで、あなたの サブスクリプションへ VPN ゲートウェイ を展開できます。
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fnogujapanese.blob.core.windows.net%2Favd-template%2FVPNGW.json "Push Me!")
※このとき、選択する リソースグループは、GatewaySubnet が存在する仮想ネットワークと同じである必要があります。上記の設計では、**AVD-Environment** を選択します。
:::

:::note alert
**注意**
ゲートウェイサブネット を作成せずに VPN ゲートウェイ をデプロイすると、以下のようなエラーが発生します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/28df0d6d-2549-c0a4-a6c7-1d1c3b03ed95.png)
そのため、VPN ゲートウェイ を作成するためには、必ず GatewaySubnet を用意しておく必要があります。
:::

# ゲートウェイ サブネット の作成手順
1. 用意した仮想ネットワークを開き、左ペインの **設定** から **サブネット** を開きます。<br>続いて、**＋ゲートウェイサブネット** のボタンを押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/4dfc0231-0a6c-8dbd-1375-1cc3798e1ccf.png)
　<br>
1. 以下の画面では、**開始アドレス** を 意図した値に編集して **追加** を押します。<br>なお、サブネットの目的 は、初めから **Vitrual Network Gateway** になっており、これが ゲートウェイサブネット のことを意味しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/83f8053d-da01-26bc-7dd3-7d0edb4f83a2.png)
　<br>
1. 以下の通知が表示されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/f26d0024-6baa-94aa-a93e-2c3da9bc072c.png)
　<br>
1. 下図の通り、**GatewaySubnet** が追加されれば OK です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6700fb16-a54a-969c-755f-ea0ec5d55134.png)

# VPN ゲートウェイ の デプロイ 手順
VPN ゲートウェイ を GUI を使ってデプロイを行う手順です。

1. Azure Portal の検索窓で **仮想ネットワーク ゲートウェイ**（①～②）を検索して選択します。<br>続いて **＋作成**（③）をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cfa06785-550b-6b62-076d-d185e29abdbc.png)

:::note warn
**注意**  2025/2/16 追記
"仮想ネットワーク ゲートウェイ" で検索しても見つからなくなっていました。
リソース名が、和名ではなく 英語名 になっていました。
**"Virtual network gateways"** を探してみてください。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/49bc5067-82dd-46e4-81b4-50904c2818ba.png)
※Azure あるあるネタなので、気を付けましょう。
:::
 
2．**基本** タブでは、以下の表を参考に 値を 選択・入力 して **確認および作成** を押します。

| # |説明|値|
|:-:|:-:|:-:|
|名前|任意の名称|VPNGW-JPEAST|
|地域|用意した 仮想ネットワーク<br>が存在する場所を選択|Japan East|
|ゲートウェイの種類|固定|VPN|
|SKU|任意のサイズ<br>あとで変更に制約アリ **※１**|VpnGw1|
|世代|あとで変更<br>できないので注意|Generation1|
|仮想ネットワーク|事前に用意したものを選択|AZ-DefaultVNet|
|サブネット|この欄に GatewaySubnet<br>が表示されている事を確認|GatewaySubnet<br>(x.x.x.x/x)|
|パブリック IP アドレス名|任意の名称<br>例：ゲートウェイ名に **-pip** を付与|VPNGW-JPEAST-pip|
|アクティブ / アクティブ モードの有効化|動作モードのこと<br>あとで変更可<br>ひとまず 無効 を推奨|無効|
|BGP の構成|推奨|有効|
|自律システム番号 (ASN)|既定値|65521|

:::note info
SKU や、世代、動作モード については、以下の記事で詳しく解説しているので、参照ください。
SKU の変更可能なサイズ **※１** についても、説明しています。

**VPN Gateway について**
https://qiita.com/carol0226/items/f28f381e3dcf43590d7b
:::

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9321e5f1-a02a-ecd1-f594-53816aaa1e9f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/d8fb9c42-0899-ce3f-df24-4c59a2ec173b.png)

:::note info
**BGP の ASN を利用できる範囲について**
ASN の範囲は、以下の公開情報のとおり、64512 ～ 65514 および 65521 ～ 65534 が利用可能と明記されています。
https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-vpn-faq?wt.mc_id=mvp_407731#what-private-asns-can-i-use

なお、既定値では 65515 が使われるようになっており、これも利用できますが、特殊用途となるため、この ASN は避けておきます。
:::

3．**確認および作成** タブでは、設定した内容を確認できます。
ここで、緑枠 の **Automation のテンプレートをダウンロードする** を押すことで ARM テンプレートを保存できます。
ARM テンプレートを保存したら、**作成** を押して デプロイを開始します。

<details><summary>ARM テンプレート の ダウンロード手順は、ココをクリック して参照できます</summary>

**テンプレート を ダウンロード**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e93719c0-935e-1565-a260-7eec0713dd86.png)

ダウンロードボタンをおすと、**template.zip** というファイルが保存されます。
ZIP ファイルを展開すると、以下の２つのファイルが存在しています。
・ template.json
・ parameters.json

それぞれのファイルは、以下の内容になっています。

**template.json**
~~~
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string"
        },
        "location": {
            "type": "string"
        },
        "gatewayType": {
            "type": "string",
            "defaultValue": "Vpn",
            "allowedValues": [
                "Vpn",
                "ExpressRoute"
            ]
        },
        "sku": {
            "type": "string"
        },
        "vpnGatewayGeneration": {
            "type": "string"
        },
        "vpnType": {
            "type": "string",
            "defaultValue": "RouteBased",
            "allowedValues": [
                "RouteBased",
                "PolicyBased"
            ]
        },
        "subnetId": {
            "type": "string"
        },
        "newPublicIpAddressName": {
            "type": "string"
        },
        "enableBgp": {
            "type": "bool"
        },
        "asn": {
            "type": "int"
        },
        "customBgpIpAddress": {
            "type": "Array"
        }
    },
    "resources": [
        {
            "apiVersion": "2023-02-01",
            "name": "[parameters('name')]",
            "type": "Microsoft.Network/virtualNetworkGateways",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/publicIPAddresses/', parameters('newPublicIpAddressName'))]"
            ],
            "tags": {},
            "properties": {
                "gatewayType": "[parameters('gatewayType')]",
                "ipConfigurations": [
                    {
                        "name": "default",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[parameters('subnetId')]"
                            },
                            "publicIpAddress": {
                                "id": "[resourceId('AVD-Environment', 'Microsoft.Network/publicIPAddresses', parameters('newPublicIpAddressName'))]"
                            }
                        }
                    }
                ],
                "enableBgp": "[parameters('enableBgp')]",
                "bgpSettings": {
                    "asn": "[parameters('asn')]",
                    "bgpPeeringAddresses": [
                        {
                            "ipconfigurationId": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/AVD-Environment/providers/Microsoft.Network/virtualNetworkGateways/VPNGW-JPEAST/ipConfigurations/default",
                            "customBgpIpAddresses": "[parameters('customBgpIpAddress')]"
                        }
                    ]
                },
                "vpnType": "[parameters('vpnType')]",
                "vpnGatewayGeneration": "[parameters('vpnGatewayGeneration')]",
                "sku": {
                    "name": "[parameters('sku')]",
                    "tier": "[parameters('sku')]"
                }
            }
        },
        {
            "apiVersion": "2020-08-01",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('newPublicIpAddressName')]",
            "location": "[parameters('location')]",
            "properties": {
                "publicIPAllocationMethod": "Static"
            },
            "sku": {
                "name": "Standard",
                "tier": "Regional"
            },
            "zones": []
        }
    ]
}
~~~

**parameters.json**
~~~
{
    "$schema": "https://schema.management.azure.com/schemas/2015-01-01/deploymentParameters.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "location": {
            "value": "japaneast"
        },
        "name": {
            "value": "VPNGW-JPEAST"
        },
        "gatewayType": {
            "value": "Vpn"
        },
        "sku": {
            "value": "VpnGw1"
        },
        "vpnType": {
            "value": "RouteBased"
        },
        "vpnGatewayGeneration": {
            "value": "Generation1"
        },
        "subnetId": {
            "value": "/subscriptions/xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx/resourceGroups/AVD-Environment/providers/Microsoft.Network/virtualNetworks/AZ-DefaultVNet/subnets/GatewaySubnet"
        },
        "newPublicIpAddressName": {
            "value": "VPNGW-JPEAST-pip"
        },
        "enableBgp": {
            "value": true
        },
        "asn": {
            "value": 65521
        },
        "customBgpIpAddress": {
            "value": []
        }
    }
~~~
</details>

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/cbf7ffc9-0a4c-224d-b9b9-debe8fd84f1b.png)

4．デプロイは、約 30 分 掛かります。デプロイが完了すると、以下の画面になるため、赤枠の **操作の詳細** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8f68270e-a309-bbac-c1f7-4b3283a86488.png)

5．以下の通り、実際に デプロイに掛かった時間を確認できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/70169fb6-e033-9add-45d9-fa5f5fb3ce17.png)

6．デプロイが完了し、作成された VPN ゲートウェイ の画面に遷移すると、以下のようになっています。
**（概要タブ）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ea408aaa-977c-1f9a-354b-e8ac256535ac.png)
**（構成タブ）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/853e7f89-2990-f81f-7495-3045392b2f91.png)

# 正常性プローブ
デプロイされた VPN ゲートウェイ に対して、以下の URL にアクセスすることで、インスタンスの状態を確認することができます。

https:// [YourVirtualNetworkGatewayIP] :8081/healthprobe
（具体例）
https://48.210.40.187:8081/healthprobe

**手順 7: Azure ゲートウェイの正常性プローブを確認する**
https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-troubleshoot-site-to-site-cannot-connect?wt.mc_id=mvp_407731#step-7-verify-the-azure-gateway-health-probe

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/6c39542a-0963-9db0-cdee-77c9f02efbb8.png)

https://www.syuheiuda.com/?p=4209

# VPN ゲートウェイ の削除
VPN ゲートウェイ をコストを抑えるため または、不要になった場合に **削除** を行う場合は、以下の手順を実行します。

1. VPN ゲートウェイ の概要ページで **削除** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/8b113455-5ce5-a2b4-0f39-1746c4aa5598.png)
　<br>
1. 以下の確認で **はい** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2acc8ea3-0339-0efa-bbd7-5a03f7eeab02.png)
　<br>
1. 以下の通知が表示されます。削除が完了するまで 約 10 分くらい掛かりました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/11717584-117b-841e-cfa1-2ea6b3fa30c4.png)
　<br>
1. VPN ゲートウェイが削除されると、以下のように 仮想ネットワーク と パブリック IP アドレス が残ります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/01671d06-3a79-0665-a0f3-a7919c1fdbb9.png)

:::note info
**ポイント**
コスト抑制のための一時的な削除の場合は、上記のリソースは このまま 残しておきます。

再作成の際に、この 仮想ネットワーク と パブリック IP アドレス を利用することで、同一構成の VPN ゲートウェイを 簡単に 作成可能になります。

完全に削除を行う場合は、パブリック IP アドレス も削除を行ってください。
:::

# ARM テンプレートを使った再作成
この手順を実行することで、前回と 同一構成の VPN ゲートウェイ を再作成できます。

**前提**
・ 前回作成時の 仮想ネットワーク と パブリック IP アドレス が残っている
・ ARM テンプレート を保存済みで、ZIP を解凍済みである（template.json と parameters.json がある）

**手順**
1. Azure Portal の検索窓で **カスタム テンプレートのデプロイ**（①～②）を選択し、**エディターで独自のテンプレートを作成する**（③）をクリックします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/2e8496d8-4572-0050-46a5-f35f934ce11e.png)
　<br>
1. 以下の画面で **ファイルの読み込み** を押し、**template.json** ファイルを選択します。
緑枠の箇所に読み込まれた事を確認して、**保存** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/56c77ad9-1427-2ac2-6e0c-6c4a8bbe77fa.png)
　<br>
1. 以下の画面で 赤枠の **パラメーターの・・・** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/9e088a7b-bb86-42de-e3ee-580d2fa46733.png)
　<br>
1. 以下の画面で **ファイルの読み込み** を押し、**parameters.json** ファイルを選択します。
緑枠の箇所に読み込まれた事を確認して、**保存** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/ae2ca392-8eb0-b6a0-a4eb-94b29bb6df7a.png)
　<br>
1. 以下の画面のように、テンプレートに パラメーターが読み込まれた状態になります。
このまま **確認と作成** を押すと、前回と同一仕様の VPN ゲートウェイ が展開できますが、この画面で 設定値を変更することもできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e78e763f-f412-588f-7f87-abc817b1a366.png)
　<br>
1. **確認と作成** タブで 最終確認を行い、**作成** を押します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/e9c0daa2-87d7-b3b1-c627-914ab6279a72.png)
　<br>
1. 以下は、デプロイが完了した画面です。作成時と 同様の時間が掛かります。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/1f96d5cb-6798-a6cf-60e9-d84551559181.png)
　<br>
1. 以下の通り、前回と 同一仕様の VPN ゲートウェイ が展開されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1619637/10dc5e8c-b08c-f19f-1a7e-156b443db1eb.png)

# Next Step
VPN ゲートウェイ をデプロイ出来たら、続けて **接続** を構成してみましょう。
以下は、各接続の種類ごとのリンクです。
※現在は、公開情報へのリンクになっていますが、順次 私自身で記載した記事へ差し替えていく予定です。

## V2V の 構築手順
以下の記事で、V2V の構成手順のキャプチャ付き に加えて、ARM テンプレートによる 再作成 について紹介しています。

https://qiita.com/carol0226/private/635408e1f343ba8bc649

**公開情報：VNet 間 VPN ゲートウェイ接続の構成**
https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-vnet-vnet-resource-manager-portal?wt.mc_id=mvp_407731

## S2S の 構築手順

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/tutorial-site-to-site-portal?wt.mc_id=mvp_407731

## P2S の 構築手順
P2S は、以下の公開情報に記載されている通り、３つの方法があります。
- Azure 証明書認証
- Microsoft Entra ID 認証
- RADIUS 認証

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-about?wt.mc_id=mvp_407731

**Azure 証明書認証**

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-howto-point-to-site-resource-manager-portal?wt.mc_id=mvp_407731

**Microsoft Entra ID 認証**

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-entra-gateway?wt.mc_id=mvp_407731

**RADIUS 認証**

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/point-to-site-how-to-radius-ps?wt.mc_id=mvp_407731

## VPN Gateway のログを Log Analytics に保存する手順

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/troubleshoot-vpn-with-azure-diagnostics?wt.mc_id=mvp_407731

https://jpaztech.github.io/blog/network/vpngw-how-to-check-maintenance/

# FAQ

## Support Blog の FAQ

https://jpaztech.github.io/blog/network/vpngw-FAQ1/

https://jpaztech.github.io/blog/network/vpngw-support-policy/

## 公開情報 の FAQ

https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-vpn-faq?wt.mc_id=mvp_407731

**IPsec/IKE ポリシーに関する FAQ**
https://learn.microsoft.com/ja-jp/azure/vpn-gateway/vpn-gateway-about-compliance-crypto?wt.mc_id=mvp_407731#ipsecike-policy-faq

# おまけ：１発デプロイ用のテンプレート
以下のテンプレートは、Parameters.json を必要とせず、Template.json のみで １発でデプロイできるように 私がカスタマイズしたものになっています。

通常のテンプレートは、"サブスクリプション ID" が含まれた リソース ID が直書きで指定されている箇所があるため汎用性がありません。それを どのサブスクリプションでも動作するように工夫をしています。Azure Portal からダウンロードしたテンプレートと比較していただくと、違いが判ると思います。

以下の記事で紹介している **[Azure にデプロイボタン]** の方法を使って、このテンプレートを展開することで、ボタン１発で VPN ゲートウェイ を展開できるようになります。
https://qiita.com/carol0226/items/c7af5206ce78492ba879

**VPN ゲートウェイ １発 デプロイ ボタン（押せます）**
[![Deploy to Azure](https://aka.ms/deploytoazurebutton)](https://portal.azure.com/#create/Microsoft.Template/uri/https%3A%2F%2Fnogujapanese.blob.core.windows.net%2Favd-template%2FVPNGW.json "Push Me!")

**１発デプロイ用のテンプレート**

~~~
{
    "$schema": "http://schema.management.azure.com/schemas/2015-01-01/deploymentTemplate.json#",
    "contentVersion": "1.0.0.0",
    "parameters": {
        "name": {
            "type": "string",
            "defaultValue": "VPNGW-JPEAST"
        },
        "location": {
            "type": "string",
            "defaultValue": "japaneast"
        },
        "gatewayType": {
            "type": "string",
            "defaultValue": "Vpn"
        },
        "sku": {
            "type": "string",
            "defaultValue": "VpnGw1"
        },
        "vpnGatewayGeneration": {
            "type": "string",
            "defaultValue": "Generation1"
        },
        "vpnType": {
            "type": "string",
            "defaultValue": "RouteBased",
            "allowedValues": [
                "RouteBased",
                "PolicyBased"
            ]
        },
        "VnetResourceGroup": {
            "type": "string",
            "defaultValue": "AVD-Environment"
        },
        "VirtualNetwork": {
            "type": "string",
            "defaultValue": "AZ-DefaultVNet"
        },
        "newPublicIpAddressName": {
            "type": "string",
            "defaultValue": "VPNGW-JPEAST-pip"
        },
        "enableBgp": {
            "type": "bool",
            "defaultValue": true
        },
        "asn": {
            "type": "int",
            "defaultValue": 65521
        },
        "customBgpIpAddress": {
            "type": "Array",
            "defaultValue": []
        }
    },
    "resources": [
        {
            "apiVersion": "2023-02-01",
            "name": "[parameters('name')]",
            "type": "Microsoft.Network/virtualNetworkGateways",
            "location": "[parameters('location')]",
            "dependsOn": [
                "[concat('Microsoft.Network/publicIPAddresses/', parameters('newPublicIpAddressName'))]"
            ],
            "tags": {},
            "properties": {
                "gatewayType": "[parameters('gatewayType')]",
                "ipConfigurations": [
                    {
                        "name": "default",
                        "properties": {
                            "privateIPAllocationMethod": "Dynamic",
                            "subnet": {
                                "id": "[resourceId(parameters('VnetResourceGroup'),'Microsoft.Network/virtualNetworks/subnets',parameters('VirtualNetwork'),'GatewaySubnet')]"
                            },
                            "publicIpAddress": {
                                "id": "[resourceId(parameters('VnetResourceGroup'), 'Microsoft.Network/publicIPAddresses', parameters('newPublicIpAddressName'))]"
                            }
                        }
                    }
                ],
                "enableBgp": "[parameters('enableBgp')]",
                "bgpSettings": {
                    "asn": "[parameters('asn')]",
                    "bgpPeeringAddresses": [
                        {
                            "ipconfigurationId": "[resourceId(parameters('VnetResourceGroup'),'Microsoft.Network/virtualNetworkGateways/ipConfigurations',parameters('name'),'default')]",
                            "customBgpIpAddresses": "[parameters('customBgpIpAddress')]"
                        }
                    ]
                },
                "vpnType": "[parameters('vpnType')]",
                "vpnGatewayGeneration": "[parameters('vpnGatewayGeneration')]",
                "sku": {
                    "name": "[parameters('sku')]",
                    "tier": "[parameters('sku')]"
                }
            }
        },
        {
            "apiVersion": "2020-08-01",
            "type": "Microsoft.Network/publicIPAddresses",
            "name": "[parameters('newPublicIpAddressName')]",
            "location": "[parameters('location')]",
            "properties": {
                "publicIPAllocationMethod": "Static"
            },
            "sku": {
                "name": "Standard",
                "tier": "Regional"
            },
            "zones": []
        }
    ]
}
~~~