CloudFront配下のWEBページをAWS WAFを使ってメンテナンスページを表示する

2017.10.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

こんにちは、いわもんです。
すっかり秋です、あっという間に10月です。

さて、早速ですが、

やりたい事

WEBサイトのメンテナンスを行う際に、メンテナンス時間はメンテナンスページの表示を行う場合があると思います。
その際、CloudFront配下のWEBサイトでは、CloudFrontでOriginの入れ替えや、
オリジン側でメンテナンスページへ差し替えなどの作業が発生しますが、割と手間な作業です。
また、メンテナンス中でも動作検証などのため特定IPからの接続は許可するなどの設定も必要な場合があります。

そこで、より簡単にメンテナンスページの表示し、メンテナンス中はの特定IPからのみの接続を許可する設定方法です。

概要

まず構成です。

cf-alb-waf

構成の概要

  • 前段にCloudFront
  • メインコンテンツ(behaviorのDefault)のオリジンにはALB配下のEC2を用いる
  • メンテナンスページを表示するためS3バケットもオリジンとして利用
  • AWS WAFをALBに適用する

やってみる

S3

  • Sorry用のコンテンツを設置するバケットを作成
  • バケットに/sorry/mainte.htmlを設置

CloudFront

Origins

  • Sorryサーバー用のS3バケットをオリジンとして追加

Behaviors

  • sorry/* を追加し、オリジンを(Sorry用の)S3バケットに指定

Error Pages

  • Create Custom Error Responseにて 403 指定
  • Customize Error ResponseYes
  • Response Page Path/sorry/mainte.htmlに指定
  • HTTP Response Code200 に指定

AWS WAF

  • Create web ACLにてALCを作成

Name web ACL

  • AWS resource to associateにてCloudFrontのオリジンに指定しているALBを選択

Create conditions

  • String match conditionsにてCreate conditionを選択する
  • Part of the request to filter onにてHeaderを選択
  • HeaderにはX-Forwarded-Forを直接入力する。
  • Match typeにてConteinsを選択
  • TransformationNoneを選択
  • Value to matchにて許可したいIPアドレスを記載します。

Create rules

  • Rule typeにてRegulerRuleを選択します。
  • Add conditionsを選択
    • When a requestdoesmatch at least one of the filters in the string match conditionを選択し 作成済みconditionを選択する
  • Rules
    • 作成したRuleを選択
    • ActionはAllowを選択
    • Default actionBlock all requests that don't match any rulesとします。
  • Confirm and createにてルールが作成されます。

メンテナンスの解除

  • Web ACLs より対象のルールを選択
  • RulesタブからAWS resources using this web ACLにある割当ELBを削除することで解除できます。

解説

CloudFrontとS3

  • CloudFrontのCustomize Error Responseを用いたSorryページの表示と同じ仕組みでメンテナンスページを表示させます。
  • 参考:CloudFrontのCustom Error Responseを利用して、S3上にあるSorryページを表示する
  • その際、ELBでは403エラーが出力されますが、あくまでもメンテナンス画面のため クライアント側へ返すレスポンスコードはCustomize Error Responseの設定にて200に差し替えます。

AWS WAF

  • AWS WAFにて特定のIPを許可します。
  • CloudFront配下となるため、ELBへの接続もとのIPは全てCloudFrontのエッジサーバーとなります。
  • HeaderのX-Forwarded-Forの値を見ることで、各クライアントのIPアドレスが判別で、AWS WAFにて特定のIPに対し接続許可を行うことができます。

今日のわさび様

わさびさん、秋になってでかくなった? 21827764_1842915159297215_6930833504884228096_n