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を行う方法が分かった。