業務で VPC Peering する機会があったので記録として残す。
https://docs.aws.amazon.com/ja_jp/vpc/latest/userguide/vpc-peering.html
VPC Peering おさらい
2つのVPCをつないでお互いに保有するリソースをあたかも同じネットワークに存在しているかのようにする機能。
アカウント、リージョンを跨ぎのピアリングも可能。
制限事項(抜粋)
CIDRブロックが重複してちゃダメ
CIDRブロックが一致・重複していると VPC Peering を作成できない。
ピアリング先のVPCを経由した通信ができない
例えば、 vpc-a
と vpc-b
がピアリングしているのに加え、
vpc-a
と vpc−c
がピアリングしているとする。
この場合に、 vpc-b
と vpc-c
の相互通信をすることはできない。
Terraform で VPC Peering をやる
resource "aws_vpc" "vpc-a" {
cidr_block = "10.0.0.0/16"
tags {
Name = "vpc-a"
}
}
resource "aws_vpc" "vpc-b" {
cidr_block = "10.1.0.0/16"
tags {
Name = "vpc-b"
}
}
resource "aws_vpc_peering_connection" "op-connection" {
peer_vpc_id = "${aws_vpc.vpc-a.id}"
vpc_id = "${aws_vpc.vpc-b.id}"
auto_accept = true
tags {
Name = "op-connection"
}
}
resource "aws_route_table" "vpc-a-route-table" {
vpc_id = "${aws_vpc.vpc-a.id}"
route {
cidr_block = "${aws_vpc.vpc-b.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.op-connection.id}"
}
tags {
Name = "vpc-a-route-table"
}
}
resource "aws_route_table" "vpc-b-route-table" {
vpc_id = "${aws_vpc.vpc-b.id}"
route {
cidr_block = "${aws_vpc.vpc-a.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.op-connection.id}"
}
tags {
Name = "vpc-b-route-table"
}
}
下記より詳細に見ていく。
aws_vpc
これは単に VPC を2つ立ててるだけ。
resource "aws_vpc" "vpc-a" {
cidr_block = "10.0.0.0/16"
tags {
Name = "vpc-a"
}
}
resource "aws_vpc" "vpc-b" {
cidr_block = "10.1.0.0/16"
tags {
Name = "vpc-b"
}
}
aws_vpc_peering_connection
peer_vpc_id
には accepter となる VPC の id を、
vpc_id
には requester となる VPC の id を指定する。
マネジメントコンソールから VPC Peering しようとすると accepter が、
ピアリングを受け入れるかどうか許可する手順が必要だが、 auto_accept
を true
にしておくことでオート承認できるようにしている。
これは、VPCが同じAWSアカウントに所属している場合のみ有効。
resource "aws_vpc_peering_connection" "op-connection" {
peer_vpc_id = "${aws_vpc.vpc-a.id}"
vpc_id = "${aws_vpc.vpc-b.id}"
auto_accept = true
tags {
Name = "op-connection"
}
}
aws_route_table
それぞれの VPC にルートテーブルを定義して相互通信できるようしている。
片方だけ定義すれば一方通行な通信になる。
resource "aws_route_table" "vpc-a-route-table" {
vpc_id = "${aws_vpc.vpc-a.id}"
route {
cidr_block = "${aws_vpc.vpc-b.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.op-connection.id}"
}
tags {
Name = "vpc-a-route-table"
}
}
resource "aws_route_table" "vpc-b-route-table" {
vpc_id = "${aws_vpc.vpc-b.id}"
route {
cidr_block = "${aws_vpc.vpc-a.cidr_block}"
vpc_peering_connection_id = "${aws_vpc_peering_connection.op-connection.id}"
}
tags {
Name = "vpc-b-route-table"
}
}
セキュリティーグループ
必要に応じて適切な通信プロトコルを許可するために定義する。
今回は省略している。
その他の制限事項
下記、ご参照いただきたい。