YAGNI
何かを作るとき、YAGNIには常に気を払わないといけない…。のはわかりきっていた。
当然同じようなことがインフラにも言えるのだけれど、こちらは本当にやりがち。今回は試しに作ったものを見るだけの環境を作ればよかったので、EC2の上に適当に手で構築すればよかった。
でも、気づいたらgithubにコミットしたらCodePipeline/BuildでECRにイメージをpushし、ECSを更新する作りにしてしまっていた。
ECSも、スポットインスタンスのEC2で起動するので、Fargateに比べるとコストが安くはあるのだが、それにしても工数を使いすぎている。
しかも、要件的にはIPアドレスによる制限が必要だったのでこの判断がさらに厄介なことになった。
AWSのセキュリティグループは、純粋にアクセスしてきたIPアドレスに対して制限をかけるもの。つまり、ALB経由でアクセスされるECSに対してはどうやったところでグローバルIPによるIPアドレスの制限は不可能なのだ。
そんなわけでnginxでIPアドレスの制限をわざわざすることになった。コンテナが一個増えたわけだ。
map $http_x_forwarded_for $allowed_ip { default 0; "xxx.xxx.xxx.xxx" 1; } server { listen 80; location / { if ($allowed_ip = 0) { return 403; } proxy_pass http://${NGINX_PROXY_NAME}; } location /api/health { proxy_pass http://${NGINX_PROXY_NAME}; } }
ALBが裏に流すX-Forwarded-ForヘッダにはグローバルIPが含まれるので、それをNginxで参照して処理すれば良い。
…とはいえ色々設定も作りも過剰ではあるので、シンプルでいいときはシンプルにやるべきだ。