🚀

ALBでメンテナンスモードを行う

2022/08/05に公開

ALBでメンテナンスモードを試しにやってみました。

AWS構成図

踏み台とか余計なものまで作成しましたが、本記事で取り扱うのはオレンジ枠の部分のみです。

terraformソースコード

https://github.com/katsuya-n/alb_maintenance_infra

やってみる

まずはALBのDNS名をブラウザで開いて、Apacheのページが表示されることを確認しておきます(TestPageなのは気にせず、、)。

次にAWSコンソールから
ALB>リスナー>ルールの表示/編集
を選択します。

上部にある+ボタンを押すとルールが追加されます。
パスに * ですべてのパスにルールを適用し、固定レスポンスのapplication/jsonで以下のメッセージを返すように設定し、保存ボタンを押します。

{
    "message": "メンテナンス中です。"
}

数秒待ってALBのDNS名をブラウザで開いてみると、先程設定したメッセージが表示されます。

curlに -iオプション をつけて実行してみるとステータスコードが503になっていることが分かります。

$ curl -i [ALBのDNS名]
HTTP/1.1 503 Service Temporarily Unavailable
Server: awselb/2.0
Date: Fri, 05 Aug 2022 00:20:25 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 51
Connection: keep-alive

{
    "message": "メンテナンス中です。"
}

特定IPの場合のみアクセスを許可する

"メンテナンス中です。"というルールの上に新規ルールを追加します。送信元IPでアクセス許可したいIPを記述します。

許可したIPでアクセスすると、Apacheのページが返ってきます。

特定ヘッダーの場合のみアクセスを許可する

先程追加した、IP許可のルールは削除し、"メンテナンス中です。"というルールの上に新規ルールを追加します。HTTP ヘッダー X-Allow-Test-Key がallowの場合のみEC2にアクセスします。

ヘッダーなしだと固定レスポンスが返ってきます。

$ curl -i [ALBのDNS名]
HTTP/1.1 503 Service Temporarily Unavailable
Server: awselb/2.0
Date: Fri, 05 Aug 2022 00:26:19 GMT
Content-Type: application/json; charset=utf-8
Content-Length: 51
Connection: keep-alive

{
    "message": "メンテナンス中です。"
}

ヘッダーを設定するとApacheのページが返ってきます。

$ curl -i -H "X-Allow-Test-Key:allow" [ALBのDNS名]
HTTP/1.1 403 Forbidden
Date: Fri, 05 Aug 2022 00:26:36 GMT
Content-Type: text/html; charset=UTF-8
Content-Length: 3630
Connection: keep-alive
Server: Apache/2.4.54 ()
(省略)
...

Terraformで作成した感想

今回はALBのメンテ検証したかっただけなので、若干サボりました。

private subnetのEC2からyum updateできなくてNat Gatewayが必要なことに気づき、
Nat Gatewayはpublic subnetに配置するけど、private subnetのroute tableに紐付けが必要なところで躓きました。

株式会社ゆめみ

Discussion