いままではデフォルトVPCでよしなに作っていたが、ちゃんとアドレス設計してVPCを作ろうと思ったら知らんことたくさん出てきてハマりなおしたのでメモしておく。
巷のチュートリアルを参照してVPC、サブネット(今回はパブリックのみの構成にした)、インターネットゲートウェイとルートテーブル、あとAutoScalingグループとロードバランサーを設定した。
AutoScalingでdesire=1にしたらAutoScalingでインスタンスが立ち上がらず、以下のエラーが出る。
Launching a new EC2 instance. Status Reason: The parameter groupName cannot be used with the parameter subnet. Launching EC2 instance failed.
原因はVPC用の設定でないから。
修正はこう。
resource "aws_launch_template" "tmpl" { # security_group_names = [aws_security_group.sg.name] ## こっちではなく vpc_security_group_ids = [aws_security_group.sg.id] ## VPCつかうならこっち }
上記を反映すると、今度はインスタンスが立ち上がるが、セッションマネージャーがつながらないし、CodeDeployが進行中から一切進まなくなるのでそもそもロードバランサーの対象に入らない。
これChatGPTさんに聞いてみると、パブリックサブネットに居るインスタンスはパブリックIPがないと外から接続できないらしい。というわけで従って修正。
resource "aws_subnet" "apne-1a-public1" { map_public_ip_on_launch = true } resource "aws_launch_template" "tmpl" { security_group_names = [aws_security_group.sg.name] network_interfaces { associate_public_ip_address = true } }
上記を反映するとまた別のエラーが出た。
Launching a new EC2 instance. Status Reason: Invalid launch template: When a network interface is provided, the security groups must be a part of it.
これは「起動テンプレートのセキュリティグループ」と起動された後に作られるENIの設定が競合してルーティングできないっぽい。初めてNetwork Managerのreachability analyzerを使ってみたがENIから外に出れていないような診断結果が出た。
これを解決するにはENIに対してセキュリティグループを付けて起動テンプレートから外す必要がある。下記のように直す。
resource "aws_launch_template" "tmpl" { // security_group_namesを消す! network_interfaces { associate_public_ip_address = true security_groups = [aws_security_group.sg.id] } }
これでやっとロードバランサーから見れるようになった。
メモ
- 上記みたいに設定を間違えるとAutoScalingが一切動かなくなる時があって、そういう時は一回ロードバランサーを削除すると直る。
- ChatGPTさん正しく入力すれば割と正しい答えは返ってくるっぽい。
- デフォルトVPCに潜む暗黙知を明示化するとこんな感じになる。使ってみないとわかんないよこれ。
- これに限らず暗黙知が多いので、やっぱり色々とさわってエラー含めて色々とみておかないとダメ。