これはなに

  • ALBのリスナールールをCLIで変更してみたときのメモです
背景

  • ALBを利用したWebサイトでお客様側でメンテナンスを実施するときにメンテナンスページへリダイレクトさせたいというご要望
    • メンテナンスページはS3ホスティングの別サイトに配置されている
    • お客様側で任意のタイミングでメンテナンスを実施したいので、リダイレクト設定をお客様側で管理したい
考えたこと

  • ALB自体はterraformで構築しているので、terraformでapplyさせればよいのでは?
    • お客さんに terraform applyさせるのはちょっと無理
      • そこまで詳しくない
  • ALBだけを変更できるポリシーをつけたIAMユーザーを払い出してコンソールで作業してもらう
    • できないことはないが、手順を標準化するのに工数がかかりそう(コンソールのUIが変わったら手順書を書き換え、など)
  • ALBだけを変更できるポリシーをつけたIAMユーザーでCLIを叩かせればよいのではないか?
    • シェルスクリプトやバッチファイル化すればいけそう
使うコマンド

  • aws elbv2 modify-rule
    • オプションとして下記を付与
      •  actions
        • ルールの内容
        • JSONで記述する
      • ルールのARN
  • 今回の要件はターゲットグループへ転送していたものをリダイレクトに変えるということなので、actions の部分のみ変更
  • –rule-arn <ルールのARN>
  • actionの内容はずらずらとかいてもいいし、JSONとしてファイルに保存して file://ファイル名 で与えてもよい
  • コマンドとして与えるのは見通しが悪いのでファイルを使うことにした
actionsの内容の組み立て

  • JSONファイルを作るに当たってリダイレクトをしているルールを describe-rule してその結果のJSONを流用した
$ aws elbv2 describe-rules --rule-arns <ルールのARN>
  "Rules": [
        {
            "RuleArn": "ルールのARN",
            "Priority": "4",
            "Conditions": [
                {
                    "Field": "host-header",
                    "Values": [
                        "www.hoge.com"
                    ],
                    "HostHeaderConfig": {
                        "Values": [
                            "www.hoge.com"
                        ]
                    }
                }
            ],
            "Actions": [
                {
                    "Type": "redirect",
                    "Order": 1,
                    "RedirectConfig": {
                        "Protocol": "HTTPS",
                        "Port": "443",
                        "Host": "www.google.com",
                        "Path": "/",
                        "Query": "",
                        "StatusCode": "HTTP_301"
                    }
                }
            ],
            "IsDefault": false
        }
    ]
“Actions” の部分を抽出
[
    {
        “Type”: “redirect”,
        “Order”: 1,
        “RedirectConfig”: {
            “Protocol”: “HTTPS”,
            “Port”: “443”,
            “Host”: “www.google.com”,
            “Path”: “/”,
            “Query”: “”,
            “StatusCode”: “HTTP_301”
        }
    }
]

 

※冒頭の”Actions”: は削除

 

コマンド実行

  • 変更前のルールをdescribeして確認
$ aws elbv2 describe-rules –rule-arns <ルールのARN>
{
    “Rules”: [
        {
            “RuleArn”: “ルールのARN”,
            “Priority”: “2”,
            “Conditions”: [
                {
                    “Field”: “host-header”,
                    “Values”: [
                        “www.hoge.com”
                    ],
                    “HostHeaderConfig”: {
                        “Values”: [
                            “www.hoge.com”
                        ]
                    }
                }
            ],
            “Actions”: [
                {
                    “Type”: “forward”,
                    “TargetGroupArn”: “ターゲットグループのARN”,
                    “Order”: 1,
                    “ForwardConfig”: {
                        “TargetGroups”: [
                            {
                                “TargetGroupArn”: “ターゲットグループのARN”,
                                “Weight”: 1
                            }
                        ],
                        “TargetGroupStickinessConfig”: {
                            “Enabled”: false,
                            “DurationSeconds”: 3600
                        }
                    }
                }
            ],
            “IsDefault”: false
        }
    ]
}

 

実際に変更する

 

$ aws elbv2 modify-rule –actions file://actions.json –rule-arn <変更するルールのARN>
{
    “Rules”: [
        {
            “RuleArn”: “変更するルールのARN”,
            “Priority”: “3”,
            “Conditions”: [
                {
                    “Field”: “host-header”,
                    “Values”: [
                        “www.hoge.com”
                    ],
                    “HostHeaderConfig”: {
                        “Values”: [
                            “www.hoge.com”
                        ]
                    }
                }
            ],
            “Actions”: [
                {
                    “Type”: “redirect”,
                    “Order”: 1,
                    “RedirectConfig”: {
                        “Protocol”: “HTTPS”,
                        “Port”: “443”,
                        “Host”: “www.google.com”,
                        “Path”: “/”,
                        “Query”: “”,
                        “StatusCode”: “HTTP_301”
                    }
                }
            ],
            “IsDefault”: false
        }
    ]
}

 

Actionsの内容がターゲットグループへforwardしていたものが www.google.com への redirect に変更されている

 

※メンテナンス終了時にはforwardの内容を記述したJSONファイルを与えて戻す

 

まとめ

  • CLIでALBのルールを変更する場合は elbv2 modify-rule
  • パラメータとして下記を与える
    • ルールのARN
    • 変更内容のJSON