おはようございます、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名でアクセスする」あたりは、最初かなり混同しやすいポイントだったので、同じところで詰まっている方の参考になれば嬉しいです。
それでは、また明日!

コメント