ALB Sorry対応

ALBの作成

ALBの初期作成についてはここでは割愛する
ベーストラフィックも特に理由がなければ固定レスポンス応答にして Sorry画面を返すようにしておく

固定レスポンスで設定できるステータスコードは「2XX」「4XX」「5XX」系
記述できるコンテンツタイプは text/plain text/css text/html application/javascript application/json
記載できる文字数は 1024 文字まで、わりとリッチなコンテンツも設定できそう

次に通常時用のルールを設定する
ALB 単体の機能では自動で固定レスポンスのルールを障害時に返すようには出来ないのでルールだけ設定しておく

ALB のURLにアクセスして コンテンツが表示される事を確認
https://***********************.ap-northeast-1.elb.amazonaws.com/index.html

ダウン確認

CloudWatchアラームの設定

正常系ホストの数が0になった時にアラート検知するようにアラームを作成


とりあえず1分間の平均値が0になった検知を5分連続で検知したらアラートとするよう設定
API経由でステータスを確認

# aws cloudwatch describe-alarms --alarm-names "*******************************"
{
    "MetricAlarms": [
        {
            "EvaluationPeriods": 5,
            "AlarmArn": "arn:aws:cloudwatch:ap-northeast-1:**********:alarm:awsapplicationelb-targetgroup-alb-study-top-group-***********-High-",
            "StateUpdatedTimestamp": "2019-07-12T10:11:35.951Z",
            "AlarmConfigurationUpdatedTimestamp": "2019-07-12T10:14:55.919Z",
            "ComparisonOperator": "LessThanOrEqualToThreshold",
            "AlarmActions": [
                "arn:aws:sns:ap-northeast-1:****************:config-alert-topic"
            ],
            "Namespace": "AWS/ApplicationELB",
            "AlarmDescription": "Created from EC2 ",
            "StateReasonData": "{\"version\":\"1.0\",\"queryDate\":\"2019-07-12T10:11:35.947+0000\",\"startDate\":\"2019-07-12T10:06:00.000+0000\",\"statistic\":\"Average\",\"period\":300,\"recentDatapoints\":[0.0],\"threshold\":0.0}",
            "Period": 60,
            "StateValue": "ALARM",
            "Threshold": 0.0,
            "AlarmName": "awsapplicationelb-targetgroup-alb-study-top-group-****************-High-",
            "Dimensions": [
                {
                    "Name": "LoadBalancer",
                    "Value": "app/alb-study/*****************"
                },
                {
                    "Name": "TargetGroup",
                    "Value": "targetgroup/alb-study-top-group/*****************"
                }
            ],
            "DatapointsToAlarm": 5,
            "Statistic": "Average",
            "StateReason": "Threshold Crossed: 1 out of the last 1 datapoints [0.0 (12/07/19 10:06:00)] was less than or equal to the threshold (0.0) (minimum 1 datapoint for OK -> ALARM transition).",
            "InsufficientDataActions": [],
            "OKActions": [],
            "ActionsEnabled": true,
            "MetricName": "HealthyHostCount"
        }
    ]
}

"StateValue": "OK", になっている

Sorry切り替え

ターゲットグループのメンバーホストを停止(apacheの停止)しアラートを発生させる
CloudWatchのアラーム状態を確認

# aws cloudwatch describe-alarms --alarm-names "awsapplicationelb-targetgroup-alb-study-top-group-************-High-" |jq '.MetricAlarms[].StateValue'
"ALARM"

CloudWatch のアラームを検知したら ALB に設定した固定レスポンス応答の優先順位を最上位に変更する
今は Bad Gateway になっているが

固定レスポンスルールのプライオリティ1にする

# aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:********:listener-rule/app/alb-study/******/******/******,Priority=1
ortheast-1:********:listener-rule/app/alb-study/********/********/********,Priority=1
{
    "Rules": [
        {
            "Priority": "1",
            "Conditions": [
                {
                    "Field": "path-pattern",
                    "Values": [
                        "*"
                    ]
                }
            ],
            "RuleArn": "arn:aws:elasticloadbalancing:ap-northeast-1:********:listener-rule/app/alb-study/********/********/********",
            "IsDefault": false,
            "Actions": [
                {
                    "Type": "fixed-response",
                    "Order": 1,
                    "FixedResponseConfig": {
                        "ContentType": "text/html",
                        "MessageBody": "<!DOCTYPE html>\n<html>\n<head>\n<title>Untitled-1.md</title>\n<meta http-equiv=\"Content-type\" content=\"text/html;charset=UTF-8\">\n\n</head>\n<body>\n<h1>メンテナンス</h1>\n<p>只今メンテナンス中になります。しばらく時間をおいてからアクセスしてください</p>\n\n</body>\n</html>\n",
                        "StatusCode": "503"
                    }
                }
            ]
        }
    ]
}

表示が切り替わっていることを確認できた

元に戻す場合は CloudWatch のアラーム状況を確認して正常ルールのプライオリティを上げればいい

# aws elbv2 set-rule-priorities --rule-priorities RuleArn=arn:aws:elasticloadbalancing:ap-northeast-1:********:listener-rule/app/alb-study/********/********/*******,Priority=1

あとは Lamdba なり スクリプトなりで用意すればいい

メンテナンス時対応

メンテナンス時、一般ユーザーにはメンテナンス画面を表示し、作業者には画面を見せたい場合
メンテナンス用サブドメインを用意して、通常ドメイン時は固定レスポンス応答設定にし、メンテナンスサブドメインは見せるようにすればいける?
アクセス制御は出来ないけど

Amazon Web Services パターン別構築・運用ガイド 改訂第2版 (Informatics&IDEA)
Share Comments
comments powered by Disqus