AWSでRoute53とACMとALBとEC2を使ってSSLにしているWEBアプリケーションで、メンテナンス画面の運用を簡単便利にするため、下記5点をALBとLambda(python)で可能にします。
ロードバランサーの「リスナー」の「リスナーID」の「https:443」の「ルールの表示/編集」の「ルール」の「転送先」の「ターゲットグループ」で0か1の重み設定だけで簡単にメンテナンスページへ切り替えられるようにします。
そのため、ALBのロードバランサー1台に対して以下2つのターゲットグループをあらかじめ準備して「ルール」の「転送先」に追加したままにしておきます。
キャッシュが邪魔してくることがあるのでブラウザのシークレットウィンドウで検証しながら作業する様にしてください。
このメンテページ方式のデメリットは、html保存はS3にして欲しい!とか、プレビューも見られるようにしたい!っていう話が出ると困るという事です。
ターゲットグループの「ターゲットの種類」でpythonで作った「Lambda関数」を使って「ターゲットグループ」を新しく作る
ロードバランサーの「リスナー」で「ルール」の「HTTPS:443」転送先に新たに作ったLamdaのターゲットグループを「重み:0」で追加する
この作業を行うと、CloudFromationスタックも自動で作成されます。
今回は、「VPC設定」は行いません。
Qiitaからいただいたものをちょっと加工した以下のものでよければご利用ください。インデントが雑ですみません。
<!doctype html>
<html lang="ja">
<head>
<meta charset="utf-8">
<title>◯◯システムメンテナンスのお知らせ</title>
<meta name="description" content="◯◯システムメンテナンスのお知らせ">
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div style='max-width: 600px; margin: 30px auto;'>
<div style='border: 1px solid #ccc; padding: 30px; margin-top: 30px;'>
<h1 style="color: #F00">◯◯システムメンテナンスのお知らせ</h1>
<p>
いつも◯◯システムをご利用いただき、誠にありがとうございます。<br />
このたびサービス向上のため、システムメンテナンスを実施させていただきます。<br />
下記日時はサービスをご利用いただけません。</p>
<ul>
<li>2020/10/13(火)PM11:00~2020/10/14(水)AM3:00</li>
</ul>
<p>お客さまには大変ご迷惑をおかけいたしますが、何卒、よろしくお願い申し上げます。
</p>
</div>
</div>
</body>
</html>
def lambda_handler(event, context):
response = {
"statusCode": 200,
"statusDescription": "200 OK",
"isBase64Encoded": False,
"headers": {
"Content-Type": "text/html; charset=utf-8"
}
}
response['body'] = """<html lang="ja">
<head>
<meta charset="utf-8">
<title>◯◯システムメンテナンスのお知らせ</title>
<meta name="description" content="◯◯システムメンテナンスのお知らせ">
<!--[if lt IE 9]>
<script src="https://cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.js"></script>
<![endif]-->
</head>
<body>
<div style='max-width: 600px; margin: 30px auto;'>
<div style='border: 1px solid #ccc; padding: 30px; margin-top: 30px;'>
<h1 style="color: #F00">◯◯システムメンテナンスのお知らせ</h1>
<p>
いつも◯◯システムをご利用いただき、誠にありがとうございます。<br />
このたびサービス向上のため、システムメンテナンスを実施させていただきます。<br />
下記日時はサービスをご利用いただけません。</p>
<ul>
<li>2020/10/13(火)PM11:00~2020/10/14(水)AM3:00</li>
</ul>
<p>お客さまには大変ご迷惑をおかけいたしますが、何卒、よろしくお願い申し上げます。
</p>
</div>
</div>
</body>
</html>
"""
return response
※helloworld_27.pyでsyntax errorなどが出る場合。helloworld_27.pyファイルの最初の行に以下1行を追記してみてください。エスケープです。
# coding: UTF-8
通常運用向けのEC2インスタンス向けのターゲットグループを「重み:0」、メンテナンスモード向けのLambdaのターゲットグループ「重み:1」として設定してください。
※シークレットウィンドウで反映するまで15秒くらいで、やや反映が遅いです。
通常運用向けのEC2インスタンス向けのターゲットグループを「重み:1」、メンテナンスモード向けのLamdaのターゲットグループ「重み:0」として設定する。
※シークレットウィンドウで反映するまで15秒くらいで、やや反映が遅いです。