🌈

【Azure】VNetピアリングを試してみる

2024/02/26に公開

概要

AZ-104でよく問われるVNetピアリングですが、実際に使ったことがなく実感がない状態でした。そこで、簡単に触ってみたというのが今回の概要です。

仮想マシンは料金面で不安があったので、ACI(Azure Container Instance)を使って試してみました。

構成図

大前提:通常は異なるVNetに属するリソース同士は通信できない

Azureの仮想ネットワーク(VNet)は、その中でデプロイされたリソース同士が通信できるようになっています。

しかし、デフォルトの設定では異なるVNet間でリソース同士が通信することはできません。

そこで、異なるVNet間での接続を実現する方法が必要になってきます。その1つが今回のテーマになるVNetピアリングです。

VNetピアリングとは

Azure内のVNet同士を接続する方法。

プライベートIPアドレスを使用して、ピアリングしたVNet間で直接通信します。インターネット経由の通信は行われず、Azure内部のネットワークインフラを使用するため、高速&セキュアに通信が可能です。

VNetピアリングは、異なるリージョンにあるVNetにも適用できます。異なるリージョンのVNetを対象にしたVNetピアリングは、「グローバル仮想ネットワーク ピアリング」と呼ばれます。

https://learn.microsoft.com/ja-jp/azure/virtual-network/virtual-network-peering-overview

インターネット経由でオンプレネットワークと接続する場合には使用できません(その場合はVPNゲートウェイを使用します)。

仮想ネットワークを作成する

構成図の通り、Azure Portalから下記3つの仮想ネットワークを作成します。

VNetA
仮想ネットワーク名 VNetA
地域 Japan East
IPアドレス 10.1.0.0/16
サブネットのIPアドレス 10.1.0.0/24
VNetB
仮想ネットワーク名 VNetB
地域 Japan East
IPアドレス 10.2.0.0/16
サブネットのIPアドレス 10.2.0.0/24
VNetC
仮想ネットワーク名 VNetC
地域 Japan East
IPアドレス 10.3.0.0/16
サブネットのIPアドレス 10.3.0.0/24

ACIを作成する

VNetAに紐づくコンテナAを作成します。

Portalのコンテナインスタンスのページから作成していきます。

通信のテストを行うだけなので、イメージはクイックスタートで選択できるmcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux)を使用します。

コンテナA
コンテナ名 testcontainera
地域 Japan East
イメージのソース クイックスタート イメージ
イメージ mcr.microsoft.com/oss/nginx/nginx:1.9.15-alpine(Linux)
サイズ 1vcpu,1.5Gibメモリ,0gpu
ネットワークの種類 プライベート
仮想ネットワーク VNetA 先ほど作成した仮想ネットワークAを指定
サブネット SubnetA-1(10.1.0.0/24)
ポート 80 / TCP

作成ボタンを押し、しばらくするとデプロイが完了し、実行中のコンテナが出来上がります。

先ほど紐付けたサブネット10.1.0.0/24の範囲でプライベートIPアドレスが割り当てられます。

同様の手順で、コンテナBとコンテナCも作成します。

コンテナB
コンテナ名 testcontainerb
仮想ネットワーク VNetB 先ほど作成した仮想ネットワークBを指定
サブネット SubnetB-1(10.2.0.0/24)
コンテナC
コンテナ名 testcontainerc
仮想ネットワーク VNetC 先ほど作成した仮想ネットワークCを指定
サブネット SubnetB-1(10.3.0.0/24)

VNETピアリングを設定する

この段階では、別VNetに属するコンテナ同士は通信できません。

そこで、VNetAとVNetBのピアリングを設定していきます。

VNetAのピアリングを選択し、ピアリングを追加します。

ピアリングの追加
この仮想ネットワーク > ピアリングリンク名 VNetAToB
リモート仮想ネットワーク > ピアリングリンク名 VNetBToA この項目を指定すると、VNetB → VNetAのピアリングも作成される
仮想ネットワークのデプロイ モデル Resource Manager
仮想ネットワーク VNetB ピアリング対象のVNetを選択

追加ボタンを押します。

VNetAToBというピアリングが作成されました。

また、VNetB側も確認してみると、VNetBToAというピアリングが追加されたことが確認できます。

これで、コンテナA⇄コンテナB間の通信が可能となりました。

通信のテストを行う

さて、実際にコンテナ間の通信を試してみます。

VNetAのコンテナからVNetBのコンテナにアクセスできることを確認する

まず、コンテナAからコンテナBへHTTPリクエストを行います。

コンテナBのプライベートIPアドレスを確認すると、10.2.0.4が割り当てされていることが分かります。このIPへのHTTPリクエストをコンテナAから実施します。

az login
# VNetAのコンテナAに入る
az container exec --resource-group AZ104-test-rg --name testcontainera --exec-command "/bin/sh"
# ピアリングしたVNetBのコンテナB("10.2.0.4")に対して、httpリクエストを実施
wget -qO- http://10.2.0.4
<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
# ...以下略

期待通り、nginxのデフォルトのWelcomeページが返却されました。

これによって、VNetAとVNetB間のピアリングが上手く行ったことが確認できました。

VNetCのコンテナにはアクセスできないことを確認する

当然ですが、ピアリングを設定していないので、コンテナA⇄コンテナC間の通信は上手くいかないはずです。

この点も確認しておきます。

# VNetAのコンテナAに入る
az container exec --resource-group AZ104-test-rg --name testcontainera --exec-command "/bin/sh"
# ピアリングしていないVNetCのコンテナC("10.3.0.4")に対して、httpリクエストを実施
wget -qO- http://10.3.0.4
wget: can't connect to remote host (10.3.0.4): Operation timed out

こちらは期待通り結果は返却されず、タイムアウトとなりました。

Discussion