【Azure】VNetピアリングを試してみる
概要
AZ-104でよく問われるVNetピアリングですが、実際に使ったことがなく実感がない状態でした。そこで、簡単に触ってみたというのが今回の概要です。
仮想マシンは料金面で不安があったので、ACI(Azure Container Instance)を使って試してみました。
構成図
大前提:通常は異なるVNetに属するリソース同士は通信できない
Azureの仮想ネットワーク(VNet)は、その中でデプロイされたリソース同士が通信できるようになっています。
しかし、デフォルトの設定では異なるVNet間でリソース同士が通信することはできません。
そこで、異なるVNet間での接続を実現する方法が必要になってきます。その1つが今回のテーマになるVNetピアリングです。
VNetピアリングとは
Azure内のVNet同士を接続する方法。
プライベートIPアドレスを使用して、ピアリングしたVNet間で直接通信します。インターネット経由の通信は行われず、Azure内部のネットワークインフラを使用するため、高速&セキュアに通信が可能です。
VNetピアリングは、異なるリージョンにあるVNetにも適用できます。異なるリージョンのVNetを対象にしたVNetピアリングは、「グローバル仮想ネットワーク ピアリング」と呼ばれます。
インターネット経由でオンプレネットワークと接続する場合には使用できません(その場合は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