概要

  • 今回は、terraformを使ってVPCを構築した時の失敗談をご紹介します。
  • 今回の案件では、以前使用したことのある別案件のコードを参考に、VPCを構築するためのterraformのコードを作成しました。しかし、コードは構文的に問題なかったものの、実際はVPC Peeringの作成がスムーズに動きませんでした。

VPC Peeringでハマったこと

  • AWSアカウントは2個、各アカウントにVPCを1個、サブネットを複数個、Internet Gateway、NAT Gateway、その他にVPC Peering、VPC Endpoint、ルートテーブルなどのリソースを作成します。
  • 以前、同一アカウントにVPCを2個作成した環境のコードを参考に、VPC間を接続するためのVPC Peering を設定しました。実は今回の相違点として、前回にはないクロスアカウントであったことを考慮できておりませんでした。(-.-;)

terraformのエラー

  • terraform plan は通りますが(terraformは同一アカウントとして振る舞うので)、terraform apply するとエラーとなりました。冷静に考えれば、承認が必要なオペレーションが自動化できたら変なので、コードの見直しが必要でした。
  • 以下、terraform apply 実行中に発生したエラーです。
Error: Error applying plan:

1 error(s) occurred:

* aws_vpc_peering_connection.peer: 1 error(s) occurred:

* aws_vpc_peering_connection.peer: Error waiting for VPC Peering Connection to become available: Error waiting for VPC Peering Connection (pcx-0111111111111272f) to become available: Failed due to incorrect VPC-ID, Account ID, or overlapping CIDR range

Terraform does not automatically rollback in the face of errors.
Instead, your Terraform state file has been partially updated with
any resources that successfully completed. Please address the error
above and apply again to incrementally change your infrastructure.

コンソールのエラー

  • コンソールで確認した場合、PeeringのステータスはFailed となり、Peering connection status は下記になっております。また、明らかにリクエスタとアクセプタが同じアカウントとして作成を試みたことも確認できます。
  • Failed due to incorrect VPC-ID, Account ID, or overlapping CIDR range

対応策

  • 今回は一度、PeeringがFailedになってしまったため、手動でPeering作成を行いました。かつ、terraform.tfstateの”aws_vpc_peering_connection.peer”の”id”がFailedのPeering idで残ってしまったため、”id”を手動で作成したPeeringの方のidに置き換え、terraform applyを再実行して、残りのルートテーブル作成を行っています。
  • 以下、変更前のコードとなります。

変更前

resource "aws_vpc_peering_connection" "foo" {
  peer_vpc_id   = "${aws_vpc.bar.id}"
  vpc_id        = "${aws_vpc.foo.id}"
  auto_accept   = true

  accepter {
    allow_remote_vpc_dns_resolution = true
  }

  requester {
    allow_remote_vpc_dns_resolution = true
  }
}

変更後

  • 次回は、下記の様にterraformのコードを修正して、このPeeringの作成を乗り切ろうと思います。
  • peer_vpc_id、vpc_id は必須オプションです。それぞれ、ピアリング接続先のVPCのID、リクエスターVPCのIDです。
  • 変更前に指定していたauto_acceptのオプションは、両方のVPCが同じAWSアカウントに存在する必要があり、今回の構成では適切ではありませんでした。
  • 変更後に指定したpeer_owner_idはピアVPCを所有者するAWSアカウントIDであり、省略した場合は現在接続しているアカウントID が使用されます。
  • Peeringの作成は自動で承認されないため、terraform apply後はピアVPC側で承認が必要となります。
resource "aws_vpc_peering_connection" "foo" {
  peer_owner_id = "${var.peer_owner_id}"
  peer_vpc_id   = "${aws_vpc.bar.id}"
  vpc_id        = "${aws_vpc.foo.id}"

  accepter {
    allow_remote_vpc_dns_resolution = true
  }

  requester {
    allow_remote_vpc_dns_resolution = true
  }
}

参考資料

Provides a resource to manage a VPC peering connection.

元記事はこちら

terraformを使ったクロスアカウントのVPC Peering作成失敗談