知り合いが、構築をIaCで行っているそうで、関連知識を深めようと思います。
続きで、次に「外との出入り口」を定義します。パブリックサブネット側にはInternet Gatewayをアタッチして、0.0.0.0/0 のデフォルトルートをIGWに向けます。これでパブリックサブネット上のリソースはインターネットと疎通できるようになります。一方プライベートサブネットは、セキュリティ上インターネットから直接到達できないようにしたいので、ルートをIGWへは向けず、アウトバウンドだけを許可する仕組みとしてNAT Gatewayを使うのが一般的です。NAT Gatewayはパブリックサブネット上に配置し、プライベート側のデフォルトルートをNATへ向けます。こうすると、プライベートのEC2やECSタスクは外部へ更新取得などができる一方で、外部から直接入ってくる経路は持ちません。
Terraformで重要になるのが「依存関係」と「状態管理」です。たとえばNAT GatewayはEIPとIGWが絡むため、作成順序の問題が起きやすく、depends_on を適切に入れると安定します。また、VPCはチームで継続運用することがほとんどなので、terraform.tfstate をローカルに置かず、S3 + DynamoDB(ロック)などのリモートバックエンドに移して、複数人が同時にapplyして壊さないようにします。さらに、タグ(Name、Environment、Project、CostCenterなど)をlocalsで共通化して全リソースに付与しておくと、運用や課金整理が段違いに楽になります。