networkingモジュールは、プロジェクトのVPCネットワーク基盤を構築します。本記事では、IPv4/IPv6デュアルスタックのサブネット、外向き通信の経路、S3 Gateway VPCエンドポイント、デフォルトセキュリティグループの構成をTerraformの実装に沿って説明します。読者は、enable_nat_gatewayによるNAT Gatewayの選択条件と、モジュールを呼び出す際に指定する変数および参照できる出力を把握できます。

networkingモジュールの構成図。IPv4とIPv6のデュアルスタックVPCに3層のサブネットと2つのルートテーブルを構成し、IPv6の外向き通信をegress-only Internet Gatewayへ、S3をゲートウェイエンドポイントへ向ける。

外向き通信の構成

外向き通信には、既定でegress-only Internet Gateway経由のIPv6を使います。privateサブネットのIPv6デフォルトルートは、常にegress-only Internet Gatewayへ向けます。

privateサブネットから一般的なIPv4インターネット向け通信が必要な環境では、enable_nat_gateway = trueを指定します。この場合に限り、NAT GatewayとElastic IPを1つずつ作成し、privateサブネットのIPv4デフォルトルートをNAT Gatewayへ向けます。

サブネット構成

VPCではDNSサポートとDNSホスト名を有効にし、アベイラビリティゾーンごとに次のサブネットを作成します。

  • public: IPv4/IPv6デュアルスタック。起動時にパブリックIPとIPv6アドレスを割り当てます。
  • private: IPv4/IPv6デュアルスタック。IPv6アドレスを起動時に割り当てます。
  • API Fargate用のIPv6-only: ipv6_native = trueを指定し、起動時にIPv6アドレスとAAAAレコードを割り当てます。

VPCにはIPv6 CIDRブロックを自動で割り当てます。各サブネットのIPv6 CIDRブロックは、cidrsubnetを使ってpublic、private、API Fargate用のIPv6-onlyの順に割り当てます。

ルートテーブル

ルートテーブルはpublicとprivateの2つを作成します。各ルートテーブルの経路は次のとおりです。

  • public: IPv4の0.0.0.0/0とIPv6の::/0をInternet Gatewayへ向けます。
  • private: IPv6の::/0をegress-only Internet Gatewayへ向けます。enable_nat_gateway = trueの場合は、IPv4の0.0.0.0/0をNAT Gatewayへ向けます。

publicサブネットはpublicルートテーブルに、privateサブネットとAPI Fargate用のIPv6-onlyサブネットはprivateルートテーブルに関連付けます。

NAT Gatewayを作成する場合は、Elastic IPを1つ確保し、最初のpublicサブネットに配置します。NAT Gatewayは、depends_onでInternet Gatewayの作成後に作成します。

S3 Gateway VPCエンドポイント

privateルートテーブルには、S3 Gateway VPCエンドポイントを関連付けます。privateサブネットとAPI Fargate用のIPv6-onlyサブネットからS3へアクセスする経路として、このエンドポイントを使います。

デフォルトセキュリティグループ

VPCのデフォルトセキュリティグループをaws_default_security_groupで管理します。インバウンドルールとアウトバウンドルールは定義せず、通信を許可しません。

入力変数

モジュールは次の変数を受け取ります。

  • environment: デプロイ環境を指定します。
  • project: Nameタグに使うプロジェクト識別子を指定します。
  • vpc_cidr: VPCのIPv4 CIDRブロックを指定します。
  • public_subnet_cidrs: アベイラビリティゾーンごとのpublicサブネットのIPv4 CIDRブロックを指定します。
  • private_subnet_cidrs: アベイラビリティゾーンごとのprivateサブネットのIPv4 CIDRブロックを指定します。
  • availability_zones: サブネットを配置するアベイラビリティゾーンを順番に指定します。
  • enable_nat_gateway: privateサブネットから一般的なIPv4インターネット向け通信が必要な環境で、NAT Gatewayの作成を有効にします。

出力と運用

モジュールは、vpc_id、public_subnet_ids、private_subnet_ids、ecs_task_subnet_idsを出力します。外向き通信には既定でegress-only Internet Gateway経由のIPv6を使い、privateサブネットから一般的なIPv4インターネット向け通信が必要な環境でのみenable_nat_gateway = trueを指定します。