0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Bicepを使って仮想NetworkGateway(VPN Gateway)をデプロイする

Last updated at Posted at 2024-05-21

この記事の目的及び背景
検証用のサブスクリプションを移動しろとお達しがあり、Azure Portalからポチポチと構築をする方法しかとってこなかったが、再度同じ環境を作成するにあたり再現可能な状態としたいと考え、調査をしたので備忘を兼ねてに記載する。

概要

  1. リソースグループをサブスクリプションに作成する
  2. 作成したリソースグループに Vnet を作成する
  3. 作成した Vnet に VPN Gateway 用の SubNet を作成する
  4. 作成したリソースグループに VPN Gateway 用のPublic Ip アドレスを作成する
  5. VPN Gateway を作成する

つまり、以下のチュートリアルをBicep を使用してコマンド一つで作成する

この記事で作成できる成果物

image.png

参考とした記事

  • 以下の記事のほぼ焼き回しとなるが、一つのコマンドで一度に作成可能な点で差別化

  • 公式ドキュメント

スクリプト内容

作成スクリプト

  • main.bicep : すべての大元となるファイル、処理全体を記載
  • vnet-hub.bicep : 仮想ネットワークのResource情報を記載
  • publicIP.bicep : Public Ip アドレスのResource情報を記載
  • nwgw.bicep : VPN GatewayのResource情報を記載

main.bicep

  • リソースグループを定義

  • その他のリソースをモジュールとして呼び出す

main.bicep
targetScope='subscription'
param location string = 'japaneast'
param hubResourceGroupName string = 'rg-hub'
param hubVetNmae string = 'vnet-hub'
param hubPublicIPAddressName string = 'publicip-gw-hub'
param hubNetworkGatewayName string = 'network-gw-hub'
param hubTags object = {
  environment: 'hub'
}
param tenantId string = 'xxxx'


resource hubResourceGroup 'Microsoft.Resources/resourceGroups@2024-03-01' = {
  location: location
  name: hubResourceGroupName
  tags: hubTags
}

module hubVnet 'vnet-hub.bicep'={
  scope: hubResourceGroup
  name: hubVetNmae
  params:{
    name: hubVetNmae
    location: location
    tags: hubTags
  }
}

module hubPublicIPAddress 'publicIp.bicep' =  {
  scope: hubResourceGroup
  name: hubPublicIPAddressName
  params:{
    name: hubPublicIPAddressName
    location: location
    tags: hubTags
  }
}

module hubNetworkGateway 'nwgw.bicep' = {
  scope: hubResourceGroup
  name: hubNetworkGatewayName
  params:{
    name: hubNetworkGatewayName
    location: location
    tags: hubTags
    publicIpAddressId: hubPublicIPAddress.outputs.Id
    subnetId: hubVnet.outputs.gwSubnetId
    tenantId: tenantId
  }
}
  • targetScope='subscription'とすることでデフォルトだとResourceグループを指定しないとデプロイできないbicepファイルをサブスクリプションに対してデプロイすることが可能
  • scope を指定することにより作成したリソースグループに対してリソースをデプロイできる
  • リソースグループに対してデプロイするリソースはサブスクリプションに対してデプロイすることができないのでmodule
  • outputsを使用することで作成したresourceIdを取得

vnet-hub.bicep

  • 仮想ネットワークとサブネットを定義

vnet-hub.bicep
param name string
param location string = resourceGroup().location
param tags object = {}
param subnetGwName string = 'GatewaySubnet'

resource virtualNetwork 'Microsoft.Network/virtualNetworks@2023-11-01' = {
  name: name
  location: location
  properties: {
    addressSpace: {
      addressPrefixes: [
        '10.0.1.0/24'
      ]
    }
    subnets: [
      {
        name: subnetGwName
        properties: {
          addressPrefix: '10.0.1.0/27'
        }
      }
    ]
  }
  tags: tags

  resource subnetGw 'subnets' existing = {
    name: subnetGwName
  }
}

output gwSubnetId string = virtualNetwork::subnetGw.id
  • outputに作成したサブネットのResourceIdを出力

publicIP.bicep

  • public IP アドレスを定義

publicIP.bicep
param name string
param location string = resourceGroup().location
param tags object = {}

resource publicIPAddresses 'Microsoft.Network/publicIPAddresses@2023-11-01' = {
  name: name
  location: location
  sku: {
    name: 'Standard'
    tier: 'Regional'
  }
  properties: {
    publicIPAddressVersion: 'IPv4'
    publicIPAllocationMethod: 'Static'
    idleTimeoutInMinutes: 4
    ipTags: []
  }
  tags: tags
}

output Id string = publicIPAddresses.id
  • outputに作成したpublicIPのResourceIdを出力

nwgw.bicep

  • VPN Gatewayを定義

nwgw.bicep
param name string
param location string = resourceGroup().location
param tags object = {}
param publicIpAddressId string
param subnetId string
param tenantId string
param vpngwSKU string = 'VpnGw1'
param activeactive bool = false

resource networkGateway 'Microsoft.Network/virtualNetworkGateways@2023-11-01'={
  name: name
  location: location
  tags: tags
  properties: {
    ipConfigurations: [
      {
        id: 'string'
        name: 'string'
        properties: {
          privateIPAllocationMethod: 'Dynamic'
          publicIPAddress: {
            id: publicIpAddressId
          }
          subnet: {
            id: subnetId
          }
        }
      }
    ]
    sku: {
      name: vpngwSKU
      tier: vpngwSKU
    }
    gatewayType: 'Vpn'
    vpnType: 'RouteBased'
    activeActive: activeactive
    vpnClientConfiguration: {
      vpnClientAddressPool: {
        addressPrefixes: [
          '192.168.10.0/24'
        ]
      }
      vpnClientProtocols: [
        'OpenVPN'
      ]
      vpnAuthenticationTypes: [
        'AAD'
      ]
      vpnClientRootCertificates: []
      vpnClientRevokedCertificates: []
      vngClientConnectionConfigurations: []
      radiusServers: []
      vpnClientIpsecPolicies: []
      aadTenant: 'https://login.microsoftonline.com/${tenantId}/'
      aadAudience: '41b23e61-6c1e-4545-b367-cd054e0ed4b4'
      aadIssuer: 'https://sts.windows.net/${tenantId}/'
    }
  }
}
  • vpnClientConfigurationaddressPrefixesはローカル環境のIPアドレスをもとに設定
  • vpnClientConfigurationの認証に関しては以下のドキュメントに記載のある内容をaadTenant,aadAudience,aadIssuerに設定

デプロイ

  • 各bicepファイルを一つのディレクトリに保存し、そのディレクトリにて以下のコマンドを実行してデプロイ
az deployment sub create --template-file main.bicep --location JapanEast

デプロイに20分程度かかる

デプロイが完了したら。。。

  • 以下の手順に沿ってVPN clientから設定ファイルをインポートし接続可能であることを確認

image.png

あとがき

  • Azure Portalよりポチポチやればそこまで時間がかからない作業だが、スクリプト化することで再現可能なものにすることができた。周囲への配布などにも活用できそう
0
1
0

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
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?