VPCピアリングを作りながら学んでみた

2018.06.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

おはようございます、加藤です。WWDC 2018でiPhone SE2が来るかと期待していましたが、見事に夢破れました。

VPCピアリングを使用する機会があったので、構築しながら勉強してみました。

概要

できること

異なるVPCを接続

当然ですね、VPCピアリングによって異なるVPCを接続することができます。VPC間で直接接続する為、インスタンスにパブリックIPアドレスが割り当てらている必要はありません。

また、IPv6アドレスでも利用することが可能です。

異なるAWSアカウントのVPCを接続

VPCピアリングはAWSアカウントに依存しません。異なるアカウント間でVPCピアリングを利用することができます。

異なるリージョンのVPCを接続

VPCピアリングはリージョンに依存しません。異なるリージョン間でVPCピアリングを利用することができます。

ただし、IPv6アドレスは非対応です。

複数のVPCとピアリング

VPCピアリングは1:Nの接続をサポートしています。デフォルトの制限値は50で上限緩和リクエストによって最大125まで緩和できます。

ただし、ネットワークパフォーマンスに影響がでる場合があります。また、合わせてルートテーブルの上限緩和が必要になる可能性があります。大規模なピアリングを行う場合は、しっかりと計画しましょう。

できないこと

CIDRブロックが一致・重複するVPC間のピアリング

CIDRブロックが一致または重複する VPC 間で VPC ピアリング接続を作成することはできません。

重複していないCIDR ブロック間の通信にのみが必要であったとしても、いずれかのCIDR ブロックが重複している場合は、VPC ピアリング接続を作成することはできません。

ピアリング先のVPCを経由する通信

オンプレチックな考え方だとできそうと思ってしまいますが、NGです。具体的な例を上げていきます。

ピアリング先のVPCがピアリングしているVPCに直接通信することはできません。

ピアリング先のVPCが接続しているVPN/DXを経由してオンプレミスと直接通信することはできません。

ピアリング先のVPCのインターネットゲートウェイ/NATデバイスを経由してインターネットに直接通信することはできません。

ピアリング先のVPCエンドポイントを経由してAWSリソースに直接通信することはできません。

やってみた

以下の条件でVPCピアリングを試してみました。

  • 同一アカウント
  • 異なるリージョン
    • ap-northeast-1, ap-southeast-1
  • EC2(VPC A) →SSH→ EC2(VPC 2)

VPC,EC2

本筋では無いのでTerraformで構築しました。コードはGithubで公開しています。

雑い & 英語が変かもしれませんが生暖かい目で御覧ください\(^o^)/

Terraformについてはこちらのブログをどうぞ

AWSでTerraformに入門

VPCピアリング

AWSマネジメントコンソールでピアリング接続の画面を開き、「ピアリング接続の作成」をクリックします。

フォームに値を入力します。

項目 説明
ピアリング接続ネームタグ リソースを識別する為のNameタグ 任意の文字列を入力する
VPC(リクエスタ) 接続元のVPCのIDを入力する
アカウント 接続先VPCをAWSアカウントに応じて選択する
リージョン 接続先VPCをリージョンに応じて選択する
VPC(アクセプタ) 接続先のVPCのIDを入力する

これで接続先にVPCピアリングのリクエストが飛びます。

リージョンをシンガポールに切り替えて承認を行います。

ルートテーブル

VPC間は接続されましたが、ルートテーブルを定義しないと通信ができません。

それぞれのVPCのルートテーブルにルートを追加します。

VPC A

送信先 ターゲット
10.1.0.0/16 VPC Aのピアリング接続(pcx-aaaabbbb)

VPC B

送信先 ターゲット
10.0.0.0/16 VPC Aのピアリング接続(pcx-bbbbaaaa)

セキュリティグループ

VPC AのEC2からVPC BのEC2に対してSSHを許可します。

VPCピアリングが接続されていますが、送信元/送信先にセキュリティグループを指定することが可能です。

ただし、別リージョンの場合はできません。つまり、今回はCIDRブロックで指定する必要があります。

VPC B側のセキュリティグループに受信設定を追加します。

タイプ
プロトコル
ポート範囲
ソース
SSH (22)
TCP (6)
22
10.0.0.0/16

動作確認

EC2 AにSSH接続

ssh -l ec2-user [EC2 A Public IPAddr]
curl -s https://checkip.amazonaws.com
[EC2 A Public IPAddr]

EC2 A経由でEC2 BにSSH接続

SSH Configを作成

~/.ssh/config

Host EC2A
Hostname [EC2 A Public IPAddr]
User ec2-user
IdentityFile ~/.ssh/id_rsa

Host EC2B
Hostname [EC2 B Private IPAddr]
User ec2-user
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -W %h:%p EC2A
ssh EC2B
curl -s https://checkip.amazonaws.com
[EC2 B Public IPAddr]

EC2それぞれのパブリックIPアドレスが表示されれば成功です❗

 あとがき

できないことについても作って検証したかったですが、そこそこの長さになってしまったので一旦切り上げました。今後、Terraformをアップデートして引き続き勉強&ブログにしようと思います。

VPCピアリングしている際にVPCをまたいで、セキュリティグループの送信元にセキュリティグループを指定できるという知識はあったのですがリージョンをまたぐとできないという事が抜けていました。構築している際に、少しハマってしまいました...

引用元

VPC ピア機能とは - Amazon Virtual Private Cloud