zuntan02のはてなブログ

備忘録的なものです。時々職場の技術者ブログにも転記してますが、メインはこちらで。

CloudFront+ALB+EC2でメンテ表示(許可IPからのアクセスを除く)を用意する

【目的】

  • CloudFront+ALB+EC2で、ALBのルールの上げ下げだけでメンテインしたい
  • 特定IPからのみ、メンテ画面をパスできるようにしたい

【やってみた】

1)CloudFrontのエラーページ設定

エラーコード503に対してs3上に用意したmainte.htmlを返すよう設定する(省略)

2)ALBのルールでX-Forwarded-Forを利用して許可IPを設定

[追加:1]特定IPからのアクセスは本来のTGに流す

IF	HTTPヘッダー:X-Forwarded-For
	xxx.xxx.xxx.xxx(接続元IP)
THEN
	転送先:本来のTG


[追加:2]上記以外は503を返す

IF	パスが	*
THEN	固定レスポンスを返す 503

[追加:3]いつもはこれが最上位にあるようにする、メンテアウト用に用意

IF	パスが	*
THEN	転送先:本来のTG

【備考】

  • この構成では(バックエンドのステータスコードに合わせて)CloudFrontがエラーを返すため、ALBの固定レスポンス本文(text/htmlなど)が使えない。
  • メンテ画面を200で返すことでALBの固定レスポンスを返すことは可能だが、200の場合メンテ中の画面を検索エンジンがインデックスしてしまう可能性があるためNG。
  • 503は「Service Unavailable」であるため、CloudFrontで503の場合のみ、システムエラーではないメンテナンス文言を返すようにすればよい。