🗣️
【CDK】ALBリスナールールでホストヘッダをチェックする
はじめに
今回はややTipsめの内容です。
ホストヘッダの中身が特定の値の場合のみリクエストを通し、それ以外なら403を返す構成を想定します。
AWS
のElastic Load Balancer
(の中のApplication Load Balancer
)でリスナールールを変更することによって実現しています。
その構成をCDK
で再現したものになります。
早速コードを見ていきます。
CDK
変数としてalb
やcertificate
やtargetGroup
の宣言をしていますが、枝葉の話のため割愛。
ポイントは「デフォルトのルールでは403を返す」作りにしておいて、特定の条件(今回でいうところのホストヘッダがhoge.example.com
だったら)を満たしていたら目的のターゲットへリクエストを通すようなルールを重ねています。
ルールの優先度は好きなように変更でき、デフォルトのルールはそれ以外の全てのルールが満たされたかった場合に適用されます。
ルールは優先順位の低~高順によって評価されます。デフォルトのルールが最後に評価されます。デフォルト以外のルールは、優先順位をいつでも変更できます。デフォルトルールの優先順位は変更できません。
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"
])
]
});
参考
Discussion