AWS
kubernetes
eks

EKSで作成されたロードバランサにACMで発行した証明書を当てる

概要

EKSによって作成されるロードバランサにACMで発行した証明書を適用して、HTTPSなアプリ(サイト)にする

EKS : Amazon Elastic Container Service for Kubernetes
ACM : AWS Certificate Manager

EKSがロードバランサを作成?

EKSというかKubernetesというか、あいつらが裏側でいろんなAWSリソースを作成するような仕組みになってます。

ロードバランサやらENIやら、いろいろと作られるっぽい。

その作成権限を与えるために、クラスタ作成時にIAMロールを選択しますよね。

Select the IAM Role to allow Amazon EKS and the Kubernetes control plane to manage AWS resources on your behalf.

あなたの代わりにEKSやKubernetesがAWSリソースを管理できるようにするために、IAMロールを選んでね。

スクリーンショット 2018-06-19 16.03.28.png

作成された時点でのロードバランサ

こんな感じでマニフェストからserviceを作るとする。

$ kubectl create -f service.yml
service.yml
kind: Service
apiVersion: v1
metadata:
  name: eks-service
spec:
  type: LoadBalancer
  selector:
    app: rails-api
  ports:
  - protocol: TCP
    port: 80
    targetPort: 3000

serviceが作成された時点で、EKSによりロードバランサが作られる。

それを確認すべく、以下のコマンドを打つ。

$ kubectl describe services

こんな項目を見つける

LoadBalancer Ingress: xxxxxxxxxx.us-east-1.elb.amazonaws.com

xxxxxxxxxx.us-east-1.elb.amazonaws.com がアプリのエンドポイント。

ブラウザに貼り付けてEnterしてみると

http://xxxxxxxxxx.us-east-1.elb.amazonaws.com

で繋がっていることが確認できると思う。

http が許されるのは小学生までだよね

って言われそうなので https を使うことにします。

serviceのマニフェストを変更する。

service.yml
kind: Service
apiVersion: v1
metadata:
  name: eks-service
  annotations:
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: <ACMで作成した証明書のARN>
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "443"
spec:
  type: LoadBalancer
  selector:
    app: rails-api
  ports:
  - protocol: TCP
    port: 443
    targetPort: 3000
  • ACMで作成した証明書をロードバランサに適用
    • あらかじめ作成しておいてください
  • ロードバランサより内側での通信はhttpで行う
    • プライベートサブネットにインスタンスを置いている場合などはこんな感じの設定でOK
  • 443ポートでhttpsな通信を受け付ける

感想

  • kubernetesの公式サイトをちゃんと見ていない僕「手動で証明書適用しないとだめなのかな...」
  • kubernetesの公式サイトをちゃんと見たあとの僕「全部書いてるやん!!!」

手動で頑張らなくて良い証明書の当て方はkubernetesの公式にありましたとさ。

"SSL support on AWS" って見出しところ。

マニフェストに記述するだけで済んで楽でした。

まだベータ版なのかな? というところがちょっと気になりポイント。

最後に

なんだかんだ公式が最強なので英語だけど頑張って読みましょう。
僕はGoogle翻訳使いまくってるけど