8
4

Terraform で VPC Peering をやる

Last updated at Posted at 2018-12-21

業務で 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"
  }
}

セキュリティーグループ

必要に応じて適切な通信プロトコルを許可するために定義する。
今回は省略している。

その他の制限事項

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

おしまい。

8
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
8
4