Edited at

Terraform で VPC Peering をやる

業務で 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-avpc-b がピアリングしているのに加え、

vpc-avpc−c がピアリングしているとする。

この場合に、 vpc-bvpc-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_accepttrue にしておくことでオート承認できるようにしている。

これは、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"
}
}


セキュリティーグループ

必要に応じて適切な通信プロトコルを許可するために定義する。

今回は省略している。


その他の制限事項

下記、ご参照いただきたい。


Tips

terraform plan, apply の実行は、 hashicorp が出している docker image を利用した。

わたしの fish terminal のエイリアスを参考までに貼っておく。

alias tf-aws 'docker run -e AWS_ACCESS_KEY_ID -e AWS_SECRET_ACCESS_KEY -e AWS_DEFAULT_REGION -it -v $PWD:/app/ -w /app/ hashicorp/terraform:light'

実行したいときは、下記のように使う。


plan

$ tf-aws plan


apply

$ tf-aws apply


おしまい。