🗣️

【CDK】ALBリスナールールでホストヘッダをチェックする

2024/05/01に公開

はじめに

今回はややTipsめの内容です。
ホストヘッダの中身が特定の値の場合のみリクエストを通し、それ以外なら403を返す構成を想定します。

AWSElastic Load Balancer(の中のApplication Load Balancer)でリスナールールを変更することによって実現しています。
その構成をCDKで再現したものになります。
早速コードを見ていきます。

CDK

変数としてalbcertificatetargetGroupの宣言をしていますが、枝葉の話のため割愛。
ポイントは「デフォルトのルールでは403を返す」作りにしておいて、特定の条件(今回でいうところのホストヘッダがhoge.example.comだったら)を満たしていたら目的のターゲットへリクエストを通すようなルールを重ねています。
ルールの優先度は好きなように変更でき、デフォルトのルールはそれ以外の全てのルールが満たされたかった場合に適用されます。

ルールは優先順位の低~高順によって評価されます。デフォルトのルールが最後に評価されます。デフォルト以外のルールは、優先順位をいつでも変更できます。デフォルトルールの優先順位は変更できません。

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-update-rules.html

import * as elbv2 from 'aws-cdk-lib/aws-elasticloadbalancingv2';

// albは事前に宣言済み
// certificateはACMで取得したもの

// HTTPSのリスナールールを追加
const httpsListener = alb.addListener('SampleHttpsListener', {
  port: 443,
  protocol: elbv2.ApplicationProtocol.HTTPS,
  // デフォルトでは403を返すようにする
  defaultAction: elbv2.ListenerAction.fixedResponse(403, {
    contentType: "text/plain",
    messageBody: '403 Forbidden'
  }),
  certificates: [certificate],
});

// 追加のルールを設定
httpsListener.addTargetGroups("SampleTargetGroup", {
  // 優先度
  priority: 100,
  // ターゲットグループ(addTargetでも同じことが可能)
  targetGroups: [targetGroup],
  // 条件設定
  conditions: [
    // ホストヘッダが任意の値だったら適用する
    // この他にもSourceIpなどで絞ることも可能
    elbv2.ListenerCondition.hostHeaders([
      "hoge.example.com"
    ])
  ]
});

参考

https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/application/listener-update-rules.html

https://dev.classmethod.jp/articles/alb-condition-values-per-rule/

Discussion