テックメモ

技術的に気になったことをメモしていきます

ALB Ingress Controller で SSL Redirect を設定する方法

はじめに

ALB Ingress Controllerで作成されたALBでどのようにSSL Redirectを設定するのかを調べたのでメモ。 github.com

設定方法

以下の公式ドキュメントがそのままずばりだった。 kubernetes-sigs.github.io

ドキュメントを参照すれば十分ではあるのだけど、感想や注意点をいくつかメモしておく。

annotations について

ALBでHTTPSのリスナーを有効にする為には alb.ingress.kubernetes.io/certificate-arn が必要となる。また、HTTPからHTTPSへのリダイレクトとなるので alb.ingress.kubernetes.io/listen-ports はHTTPとHTTPSどちらもリッスンする必要がある。
リダイレクトを行うためのALBのアクションとして、以下のような定義も必要となる。(ssl-redirectはアクション名で任意の名付けが可能)
alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'

spec.rules.http.paths の書き方について

ALBとしてSSL Redirectを実現するためにはHTTPとHTTPSでそれぞれ異なるリスナールールを追加する必要がある。しかし以下はALB Ingress Controllerのドキュメントから引用したSSL Redirectの定義例なのだが、httpとhttpsのように個別に定義している訳では無かった。

apiVersion: extensions/v1beta1
kind: Ingress
metadata:
  namespace: default
  name: ingress
  annotations:
    kubernetes.io/ingress.class: alb
    alb.ingress.kubernetes.io/certificate-arn: arn:aws:acm:us-west-2:xxxx:certificate/xxxxxx
    alb.ingress.kubernetes.io/listen-ports: '[{"HTTP": 80}, {"HTTPS":443}]'
    alb.ingress.kubernetes.io/actions.ssl-redirect: '{"Type": "redirect", "RedirectConfig": { "Protocol": "HTTPS", "Port": "443", "StatusCode": "HTTP_301"}}'
spec:
  rules:
    - http:
        paths:
         - path: /*
           backend:
             serviceName: ssl-redirect
             servicePort: use-annotation
         - path: /users/*
           backend:
             serviceName: user-service
             servicePort: 80
         - path: /*
           backend:
             serviceName: default-service
             servicePort: 80

ALB Ingress Controllerでは以下のロジックで処理することにより、ALBのHTTPとHTTPSのリスナールールを定義しているようだ。

  • デフォルトではspecで指定された全てのリスナールールをALBの全てのリスナーに適用する
  • リダイレクトルールが存在する場合、全てのリスナーでリダイレクトループになるかを判定し、リダイレクトループになる場合はルールを無視する

結構トリッキーだなというのが感想だが、これでALB Ingress ControllerでSSL Redirectを行う方法が分かった。