Produced by FOURIER

AWS WAFやALBでメンテナンスページを表示する

IchikawaIchikawa calender 2022.3.18

こんにちは。株式会社フーリエ・メンテナンスマニアの市川です。

ひと昔前には、「.htaccessでメンテナンス切り替えすればいいよね」だった雰囲気が、いまはWAFなど上位層で捌きましょうといったリソースエコな流れを感じている今日この頃。

今回は、アプリケーション到達前のAWS WAFALBで分岐してエコなメンテナンス表示の実現について紹介します。

方法1. AWS WAFを利用する

まずは、WAFから! WAFは「Amazon CloudFront」「Application Load Balancer (ALB)」 「Amazon API Gateway」に適用できるサービスです。今回は、S3に静的コンテンツを配置してCloudFront経由で配信されてる想定で、WAFを使ったメンテナンス切り替え手順を紹介します。
AWSマネージメントコンソールの「 WAF & Shield 」で操作していきます。

1)許可するIPを設定

開発者などの動作検証用に特定のIPは許可するよう設定します。(グローバルリージョンで!)
WAF & Shield > IP sets から 「 Create IP set 」を選択します。

設定画面を開いたら各項目を入力していきます。

IP set nameは識別しやすい名付けで自由に設定できます。今回は、メンテナンス時に許可するIPアドレスなので、そのままmaintenanceAllowIPとしました。 許可するIPは、xxx.xxx.xxx.xxx/32のようにCIDR表記で記載します。 複数設定する場合は改行して追加します。 ちなみに自分のグローバルIPアドレスはこちらのサイトなどで確認できます。

アクセス情報【使用中のIPアドレス確認】

あなたのアクセスしているIPアドレス情報などをENVとJavaScriptで取得し表示します。あなたのIPアドレスからポート疎通・ping疎通・DNS索引・WHOIS情報も取得できます。

https://www.cman.jp/network/support/go_access.cgi

入力が終わったら、[ Create IP set ]を押してください。

2)Web ACLsを設定

ここからメンテナンスページの表示設定をしていきます。(グローバルリージョンで!)
メンテナンスページを表示させるリソース、許可するIP、レスポンスの内容等を設定します。
WAF & Shield > Web ACLs から 「Create web ACL」を選択します。

設定画面を開いたら各項目を入力していきます。

Nameは識別しやすい名付けで自由に設定できます。今回はmaintenanceとしました。
Resource TypeCloudFrontにメンテナンスページの設定をするので、CloudFront distributionsにチェックを入れてます。

入力を終えたら [Next] を押し、ルールを設定に進みます。

先程、設定したルールを適用します。 IP setmaintenanceAllowIPを選択し、Source IP addressAllowにチェックを入れて[Add rule]を押して次へ進みます。

許可するIP以外はアクセスできないようにするのでDefault actionBlockにします。
Custom responseから、ステータスコードを503に指定し、メンテナンス時に表示するhtmlを設定します。

設定ができたら[Next]を押して進みます、確認画面が表示されますので、内容を確認して[Create Web ACL]を押してください。これで、ACL設定は完了です。

3)メンテナンス実施

いよいよ、メンテナンスページの表示になります。
WAF & Shield > Web ACLs から 設定した「maintenance」を選択します。
次に、先で設定したmaintenanceからAssociated AWS resourcesのタブを選択し、Add AWS resourcesを押してください。

メンテナンスページを表示するCloudFrontを選択しましょう。
[Add]を押すことでメンテナンスページの表示が完了します。

4)メンテナンス解除

WAF & Shield > Web ACLs から 設定した「maintenance」を選択します。

Associated AWS resourcesタブから外したいリソースを選択し、[Disassocite] をクリックしてください。

ポップアップが表示されるので、フォーム内にremoveと入力し [Disassocite] を押すとWAFを外すことができます。



若干手順が多く、面倒ですが一度ACLを作成すれば、メンテナンス時にWAFのACL設定を当てる/外すだけでいいので、用意しておくといいかなと思います。

方法2. ALBのリスナールールを利用する

WAF使わずにALBのリスナールールを利用して実現することもできます。 EC2でアプリケーションを運用する際に、1台構成でもELB/ALBを介している場合が多いと思いますので、今回は、ALB+EC2構成を想定して解説します。 ※ この利点はこちらの記事参照 => 「1台のEC2でもELBを使うメリットについてまとめてみました

1台のEC2でもELBを使うメリットについてまとめてみました | DevelopersIO

ご機嫌いかがでしょうか、豊崎です。 ELB(Elastic Load Balancing)はその名の通りロードバランサーなので、負荷分散のイメージが強いと思いますが、 ここではWEBサーバが1台でも前段にELBを置いた方 …

https://dev.classmethod.jp/articles/benefit_elb_with_one_ec2/

AWSマネージメントコンソールの「 EC2 」で操作していきます。

1)ルールの編集画面へ

EC2 > ロードバランサー > 対象となるALBを選択します。次に、リスナーのタブを選択してルールの編集を押してください。

2)許可するIP設定

許可するIPアドレスをCIDR表記 = xxx.xxx.xxx.xxx/32で記載します。
IPの設定ができたら転送先となるターゲットグループを選択してくだい。

設定が済んだら[保存]を押してください。

2)メンテナンス設定&実施

上記で許可したIPアドレス以外は、メンテナンスページを表示するよう設定していきます。

今回は、「メンテナンス中です」とテキストが返るだけの味気ない設定ですが、htmlとかjson等も設定できます!

[更新] を押して設定完了となります。その時点でメンテナンス状態になります。

3)メンテナンス解除

上記のルールを元に戻すことで、メンテナンス解除になります。

WAFでの設定と比較するとすごく楽ですが、メンテナンス状態から設定を戻すときに、WAFはACLを外すだけでしたが、こちらの方法はルーティング先を間違える可能性があるため作業に注意が必要です。

参考)Laravelでの方法

Laravelはアプリケーションによる対処になりますので本題とは外れますが、サーバに触れられない状況下でメンテナンスする場合もあると思います。 参考までにLaravelでの対処法も紹介します。

Laravelにはメンテナンスモードが標準機能として用意されているのでコマンド一つで設定できます。
メンテナンスモードにすることで503レスポンスを返します。またmiddlewareで許可するIPの設定やbladeファイルを用意することでメンテナンスページのカスタマイズができます。

メンテナンスモード切り替え

以下、artisanコマンドでメンテナンスモードの切り替えができます。

// メンテナンスモード実行
php artisan down

// メンテナンスモード解除
php artisan up

とっても簡単ですね!

middlewareで許可するIPを設定する場合、.env でIPリストを管理するとよいかと思います。
許可するIPを変更したいときに毎回デプロイするのは面倒なので笑

あと、一点注意すべきところは、メンテナンスモードでもcomposer updateの実行中にはライブラリが読み込めなくなり500エラーが発生します。 わずかな時間かと思いますがそれすら許されない場合もあると思いますので気をつけてください。

さいごに

今回は、AWS WAFALBLaravel でメンテナンスページの表示について紹介しました。サイト・システム構成、サーバ構成によって方法は変わってくると思います。要件にあったやり方を選択してください。

それではまた次の記事で!!

新しいメンバーを募集しています

Ichikawa

Ichikawa / Engineer

パン屋から転身してエンジニア3年目。主にPHP/Laravelを使っています。最近ではVue.js/Nuxt.jsと人間に興味あり。