AWS

【ALB】IngressでIPアドレスによるアクセス制限

AWS 上の EKS(Kubernetes)で ALB を利用したい場面ってありますよね。

純粋に Terraform などで以下を管理してもいいのですが、

・ALB を構築する
・リスナールールを作成する
・ターゲットグループを EKS に紐つける(ノードグループなど)

せっかくなら Ingress を利用したいものです。

今回は Ingress で構築した ALB で、任意の URL パスに特定の IP アドレスを許可する需要ができたので試してみました。

AWS(EKS)のアプリケーション負荷分散

EKS にはアプリケーションの負荷分散を行うための Ingress リソースが用意されています。

それを管理して ALB を構築するのが以下のモジュールとなります。

・AWS Load Balancer Controller
・AWS Ingress Controller

バージョン 1.1.19 までは「AWS Ingress Controller」、バージョン 2.0 以降は「AWS Load Balancer Controller」となっています。

2021 年 11 月現在、バージョン 1.x 系は推奨されていないので、今から試す場合は「AWS Load Balancer Controller」がいいですね。

日本語ドキュメントはこちら。

アノテーションでIPアドレスの制御

AWS のコンソール上や Terraform で ALB を管理する場合、それほど迷うことはないと思います。

IP アドレス許可などのリスナールールを作成するのも簡単ですよね。

Ingress の場合は少し特殊で、アノテーションの以下の機能を利用する必要があります。

alb.ingress.kubernetes.io/actions.${action-name}

公式ドキュメントのサンプルにもある通り、forward の条件としては以下の 2 つが候補となります。

TargetGroup の Arn が固定されている場合はともかく、通常は ServiceName を指定するのが楽ですよね。

よって、ForwardConfig をうまく活用していきたいところです。

また、特定の IP アドレスのみアクセスを許可させたい場合は、この actions に対して conditions で条件指定しなければいけません。

alb.ingress.kubernetes.io/conditions.${conditions-name}

条件の細かいルールや上限については AWS の公式ドキュメントを参考にしてください。

IPアドレス制御のサンプル

例えば、特定の URL パスに対して「xxx.xxx.101.101」と「xxx.xxx.102.102」のソースアドレスのみを通すには、以下のような設定が考えられます。

パスの設定はアノテーションの定義に合わせて以下のようになります。

リスナールールには数の上限があるので、許可したい IP アドレスの数が多い場合は、このルールを複数個作る必要があります。

さらに 3 つの IP アドレスを条件に加えてみましょう。

クラス単位(クラス C の /24 など)で指定できる場合は楽なのですが、この手の設定では意外にバラけますからね・・・。

パスの定義も以下のようになります。

これで、特定の IP アドレスからのみアクセスを許可することができました。

まとめ

AWS の Load Balancer Controller や Ingress Controller を使って、IP アドレス制御を行ってみました。

IP アドレスに限らず、一定数の条件を組み合わせる場合も 1 つのルールでは定義しきれないケースがあります。

これは直接 ALB のリスナールールを編集するときも同じですので、面倒ですが定義を重ねていくしかないですね。

AWS Load Balancer Controller からは IngressGroup が利用可能になったので、もう少しキレイに整理できると思います。

v1.x から移行する場合は、「IAM ロール」や「Cert Manager」の追加など面倒な部分もありますが、どこかのタイミングで移行しておくことをオススメします。