はじめに
本番リリース時、
- 一般利用者からのアクセスを停止したい
- リリース担当者のみアクセスしたい
- メンテナンス画面を表示したい
といった要件はよくあります。
アプリケーション改修で実現する方法もありますが、AWS WAF を利用するとアプリケーションを変更することなく実現できます。
本記事では以下について紹介します。
- WAF閉塞の仕組み
- CloudFront閉塞との比較
- AWS WAFを利用した実装手順
- 実運用での注意点
アプリ閉塞とは
アプリ閉塞とは、一時的に利用者アクセスを制御する運用です。
代表的な利用シーンは以下です。
- 本番リリース
- 緊急メンテナンス
- 障害対応
- データメンテナンス
AWS WAFで実現する閉塞方式
AWS WAFではIPアドレスを条件にアクセス制御を行うことができます。
例えば、
- リリース担当者のIPは許可
- 一般利用者のIPは遮断
という制御が可能です。
利用者
↓
CloudFront
↓
AWS WAF
↓
ALB
↓
Application
運用モード
全開局
通常運用状態です。
すべてのアクセスを許可します。
Internet
↓
Application
制限開局
リリース担当者など必要な通信のみ許可します。
会社IP
↓
Allow
その他
↓
Block
全閉局
すべてのアクセスを遮断します。
すべてのアクセス
↓
Block
CloudFront閉塞との比較
アプリ閉塞は大きく以下の2方式があります。
AWS WAF方式
メリット
- IP単位で柔軟な制御が可能
- 一部利用者のみ許可できる
- 設定変更だけで迅速な切り替え可能
デメリット
- シンプルなHTML/JSONのメンテ画面しかサポートしない
CloudFront方式
CloudFront FunctionやLambda@Edgeを利用してメンテナンスページを返却します。
メリット
- リッチなメンテナンスページを作りやすい
- 完全に静的ページ化できる
デメリット
- 特定利用者のみ許可が難しい
- リリース担当者だけアクセスさせる設計が複雑
- 閉塞が反映まで時間かかる
どちらを選ぶべきか
| 用途 | おすすめ |
|---|---|
| リリース担当者のみ利用したい | AWS WAF |
| 素早くアクセス制限の切り替えを実現したい | AWS WAF |
| リッチなメンテナンスページ表示 | CloudFront |
構成イメージ
Internet
↓
CloudFront
↓
AWS WAF
↓
ALB
↓
Application
ハンズオン
Step1. IPSet作成
AWS WAF
↓
IP Sets
↓
Create IP Set
例
| 項目 | 設定値 |
|---|---|
| Name | maintenance-allow-ipset |
| Addresses | xxx.xxx.xxx.xxx/32 |
リリース担当者のグローバルIPを登録します。
Step2. カスタムレスポンス作成
Web ACL
↓
Custom response bodies
↓
Create
Name
maintenance-page
Content Type
HTML
Response Body
<!DOCTYPE html>
<html>
<head>
<title>Maintenance</title>
</head>
<body>
<h1>メンテナンス中</h1>
<p>現在システムメンテナンスを実施しています。</p>
</body>
</html>
Step3. 閉塞ルール作成
条件
NOT
↓
IPSet Match
対象IPSet
maintenance-allow-ipset
Action
Block
Custom Response
HTTP Status : 403
Response Body :
maintenance-page
Step4. 動作確認
許可IP
アクセス可能
許可以外
403 Forbidden
↓
メンテナンス画面表示
になれば成功です。
なぜ403を使うのか
閉塞中は
- システムは存在する
- ただしアクセスは許可しない
状態です。
そのため、
403 Forbidden
が最も適切です。
404(Not Found)ではありません。
まとめ
AWS WAFを利用することで、
- 全開局
- 制限開局
- 全閉局
を簡単に実現できます。
特に本番リリースでは、
- リリース担当者だけアクセス
- 利用者にはメンテナンス画面表示
- アプリ改修不要
という構成を容易に実現できます。
CloudFrontを利用したメンテナンス画面配信も有効ですが、
「特定IPのみ許可したい」場合はAWS WAFによる閉塞がシンプルで運用しやすい構成です。