必ずCloudFront経由でALBへアクセスさせる方法
ALBをプライベートサブネットに配置してCloudFrontを置く形態がベストプラクティスだと言われている。
resource "aws_cloudfront_distribution" "devhost" { origin { vpc_origin_config { vpc_origin_id = xxx } }}しかしプライベートに置けない事情がある場合もあって、例えばマンガメディアチームのdevhostはMirageのダッシュボードへアクセスするためにCognitoを通しているが、この場合はプライベートサブネットに配置できないらしい。この場合はカスタムオリジンの設定で秘密のHTTPヘッダーを付けて、それが付与されていないリクエストを弾く方法が次点となる。
Terraformで書くと、まずはCloudFront側からトークンをヘッダでオリジンへ送る。
resource "aws_cloudfront_distribution" "devhost" { origin { custom_header { name = "X-Auth-CanonicalToken" value = "xxx" } }}ALB側では以下のようにしてリスナールールの条件にヘッダを含める。
resource "aws_lb_listener_rule" "ecs_task" { action { type = "forward" }
condition { http_header { http_header_name = "X-Auth-CanonicalToken" values = ["xxx"] } }}