Terraform で VPC Peering をやる

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 


おしまい。

コメント

このブログの人気の投稿

投稿時間:2021-06-17 05:05:34 RSSフィード2021-06-17 05:00 分まとめ(1274件)

投稿時間:2021-06-20 02:06:12 RSSフィード2021-06-20 02:00 分まとめ(3871件)

投稿時間:2020-12-01 09:41:49 RSSフィード2020-12-01 09:00 分まとめ(69件)