ACM で Amazon EKS ワークロードの HTTPS トラフィックを終了する方法を教えてください。

最終更新日: 2020 年 11 月 18 日

AWS Certificate Manager (ACM) を使用して Amazon Elastic Kubernetes Service (Amazon EKS) ワークロードの HTTPS トラフィックを終了しようと考えています。

簡単な説明

Kubernetes Service オブジェクト用 Elastic Load Balancing レベルで HTTPS トラフィックを終了するには、以下を行う必要があります。

  1. カスタムドメインのパブリック ACM 証明書をリクエストします。
  2. [type] フィールドを LoadBalancer に設定して Kubernetes のサービスを公開します。
  3. Kubernetes ウェブサイトから、service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注釈を使用して、Kubernetes サービスで ACM 証明書の Amazon リソースネーム (ARN) を指定します。この注釈により、Kubernetes API サーバーは作成時にその証明書を Classic Load Balancer に関連付けることができます。
  4. カスタムドメインをロードバランサーに関連付けます。

次の解決方法では、以下の点を前提としています。

  • 関連するワーカーノードを持つアクティブな Amazon EKS クラスターがあります。
  • Classic Load Balancer を使用しています。

注: Application Load Balancer を使用するには、アプリケーション負荷分散を Amazon EKS にデプロイする必要があります。

注: Network Load Balancer での TLS 接続の終了は、Kubernetes 1.15 以降でのみサポートされています。詳細については、Kubernetes ウェブサイトの「Support TLS termination with AWS NLB」を参照してください。

解決方法

1.    カスタムドメインのパブリック ACM 証明書をリクエストします。

2.    ロードバランサーの HTTPS リスナーで使用する証明書の ARN を特定します。

3.    Amazon EKS クラスターに登録されているノードを特定するには、kubectl が設定されている環境で次のコマンドを実行します。

$ kubectl get nodes

4.    テキストエディタで、以下に基づいて deployment.yaml マニフェストファイルを作成します。

apiVersion: apps/v1
kind: Deployment
metadata:
  name: echo-deployment
spec:
  replicas: 3
  selector:
    matchLabels:
      app: echo-pod
  template:
    metadata:
      labels:
        app: echo-pod
    spec:
      containers:
      - name: echoheaders
        image: k8s.gcr.io/echoserver:1.10
        imagePullPolicy: IfNotPresent
        ports:
        - containerPort: 8080

5.    Kubernetes の Deployment (デプロイメント) オブジェクトを作成するには、次のコマンドを実行します。

$ kubectl create -f deployment.yaml

6.    Kubernetes ポッドが Amazon EKS クラスターにデプロイされていることを確認するには、次のコマンドを実行します。

$ kubectl get pods

注: このポッドのラベルは app=echo-pod です。このラベルを Service (サービス) オブジェクトのセレクタとして使用して、ポッドのセットを特定することができます。

7.    テキストエディタで、次の例に基づいて service.yaml マニフェストファイルを作成します。次に、service.beta.kubernetes.io/aws-load-balancer-ssl-cert 注釈を編集して、ステップ 2 の ACM ARN を指定します。

apiVersion: v1
kind: Service
metadata:
  name: echo-service
  annotations:
    # Note that the backend talks over HTTP.
    service.beta.kubernetes.io/aws-load-balancer-backend-protocol: http
    # TODO: Fill in with the ARN of your certificate.
    service.beta.kubernetes.io/aws-load-balancer-ssl-cert: arn:aws:acm:{region}:{user id}:certificate/{id}
    # Only run SSL on the port named "https" below.
    service.beta.kubernetes.io/aws-load-balancer-ssl-ports: "https"
spec:
  selector:
    app: echo-pod
  ports:
  - name: http
    port: 80
    targetPort: 8080
  - name: https
    port: 443
    targetPort: 8080
  type: LoadBalancer

8.    Service (サービス) オブジェクトを作成するには、次のコマンドを実行します。

$ kubectl create -f service.yaml

9.    LoadBalancer タイプのサービスの DNS URL を返すには、次のコマンドを実行します。

$ kubectl get service

注: クラスター内で複数のアクティブなサービスが実行されている場合は、必ずコマンド出力をして、LoadBalancer タイプの正しいサービスの URL を取得してください。

10.    Amazon Elastic Compute Cloud (Amazon EC2) コンソールを開き、[Load Balancers] (ロードバランサー) を選択します。

11.    ロードバランサーを選んで、[Listeners] を選択します。

12.    [Listener ID] で、ロードバランサーポートが 443 に設定されていることを確認します。

13.    [SSL Certificate] では、YAML ファイルで定義した SSL 証明書がロードバランサーにアタッチされていることを確認します。

14.    カスタムドメイン名をロードバランサー名に関連付けます。

15.    ウェブブラウザで、以下の HTTPS プロトコルを使用してカスタムドメインをテストします。

https://yourdomain.com

成功の応答は、クライアントの詳細が記載されたウェブページを返します。この応答には、ホスト名、ポッド情報、サーバー値、リクエスト情報、およびリクエストヘッダーが含まれます。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?