MENU

Terraformで見落としがちな細かい疑問、まとめて解消してみた

Terraformで見落としがちな細かい疑問、まとめて解消してみたことを説明する画像

おはようございます、YASUです。

今日はTerraformでVPC構築をしていて「あれ、これって何のための設定だっけ?」と手が止まった箇所を、まとめて整理してみようと思います。書いているコード自体はよくあるサンプルですが、一つ一つの設定値の意味を理解しているかどうかで、応用力がかなり変わってくる部分です。

目次

結論

Terraformの設定値は、なんとなくコピペで書けてしまいますが、それぞれに明確な意味があります。今日は以下の6つのポイントを深掘りします。

  • egressの protocol = "-1" の意味
  • associate_public_ip_address = true は何をしているか
  • パブリックサブネットとパブリックIPは別物という誤解しやすいポイント
  • パブリックIPは動的、固定したいならElastic IP
  • ALBはなぜ動的IPで問題ないのか
  • ルートテーブルとサブネットの本当の関係

egressの protocol = “-1” って何?

egress {
  from_port   = 0
  to_port     = 0
  protocol    = "-1"
  cidr_blocks = ["0.0.0.0/0"]
}

-1 は「全プロトコル許可」を意味するAWSの特殊な値です。これを指定すると from_port / to_port の値は無視され、TCPもUDPもICMPも全部通ってしまいます。数値っぽい見た目をしていますが、実体は文字列としての特殊キーワードなので注意が必要です。

アウトバウンド(egress)は「どこに何を投げに行くか分からない」ことが多いので実務でも全許可にされがちですが、セキュリティを厳しくしたい場合は必要なポートだけに絞るのが望ましいです。

associate_public_ip_address = true は何をしている?

EC2インスタンスにパブリックIPを自動で割り当てる設定です。サブネット側の map_public_ip_on_launch でも同様のことができますが、インスタンス側で明示することで「このインスタンスには絶対つける」という意図をはっきりさせられます。

パブリックサブネット=パブリックIPが付く、ではない

ここ、最初かなり混同しやすいポイントでした。「パブリックサブネット」というのは、単にルートテーブルにインターネットゲートウェイ(IGW)への経路(0.0.0.0/0 → igw-xxx)があるサブネット、というだけの意味です。

パブリックIPが付くかどうかは別設定(associate_public_ip_address または map_public_ip_on_launch)次第で決まります。つまり「経路があること」と「実際にIPが付くこと」は別々の話、というのが正確な理解です。

パブリックIPは動的、固定したいならElastic IP

普通に付与されるパブリックIPは、インスタンスを停止→起動すると変わってしまいます(再起動だけなら変わりません)。固定したい場合はElastic IP(EIP)を別途アタッチする必要があります。

検証・練習目的なら動的のままで十分ですが、本番運用でドメインを紐づけたり、外部のホワイトリストにIPを登録する必要がある場合はEIPが定石です。

ALBはなぜ動的IPで問題ないのか

ALB自体は裏側で複数のノードが動いていて、AWSが管理するパブリックIPが自動で割り当てられています。ただしこのIPはスケーリングやAZ切り替えで変わることがあります。

それでも問題ないのは、アクセスの入り口が「IP」ではなく「DNS名」だからです。独自ドメインを使う場合もRoute 53の Aliasレコードでドメイン名をALBのDNS名に紐づけるので、裏のIPが変わってもDNS解決の結果が自動で追従してくれます。「名前は固定、その先の実体(IP)は動的でも問題ない」という設計思想は、RDSのエンドポイントなど他のマネージドサービスにも共通しています。

ルートテーブルとサブネットの本当の関係

aws_route_table は単体では「0.0.0.0/0はIGW行き」というルールを持った箱でしかなく、まだどこにも作用していません。aws_route_table_association でサブネットに紐づけて初めて、そのルールがそのサブネットに適用されます。

「箱の中の箱」という包含関係ではなく、「別々に存在するリソース同士が参照(id)で線として結びついている」というイメージの方が正確です。1つのルートテーブルを複数サブネットに使い回せるのも、この設計のおかげです。

まとめ

今日扱った内容は、どれも「なんとなくで書けてしまうけど、理由を理解しているかどうかで応用が効くかが変わる」設定ばかりでした。特に「パブリックサブネットとパブリックIPは別物」「ALBはDNS名でアクセスする」あたりは、最初かなり混同しやすいポイントだったので、同じところで詰まっている方の参考になれば嬉しいです。

それでは、また明日!

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

コメント

コメントする

目次