ACM 証明書を使用して Kubernetes ワークロードを保護する - AWS Certificate Manager

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

ACM 証明書を使用して Kubernetes ワークロードを保護する

AWS Controllers for Kubernetes (ACK) で AWS Certificate Manager エクスポート可能なパブリック証明書を使用して、ACM から Kubernetes ワークロードにパブリック TLS 証明書を発行およびエクスポートできます。この統合により、Amazon Elastic Kubernetes Service (Amazon EKS) ポッドを保護し、Kubernetes Ingress で TLS を終了できます。開始するには、GitHub の「ACM Controller for Kubernetes」を参照してください。

AWS Controllers for Kubernetes (ACK) は、Kubernetes API を拡張して、ネイティブ Kubernetes マニフェストを使用して AWS リソースを管理します。ACM 用 ACK サービスコントローラーは、Kubernetes ワークフロー内で証明書のライフサイクル管理を自動化します。Kubernetes で ACM 証明書リソースを作成すると、ACK コントローラーは次のアクションを実行します。

  1. 証明書署名リクエスト (CSR) を生成する ACM から証明書をリクエストします。

  2. ドメインの検証が完了し、ACM が証明書を発行するのを待ちます。

  3. exportTo フィールドが指定されている場合、 は発行された証明書とプライベートキーをエクスポートし、指定された Kubernetes シークレットに保存します。

  4. exportTo フィールドが指定され、証明書が更新対象である場合、 は有効期限が切れる前に更新された証明書で Kubernetes シークレットを更新します。

公開された証明書は、ACM が発行する前にドメイン検証が必要です。Amazon Route 53 の ACK サービスコントローラーを使用して、ホストゾーンに必要な DNS 検証 CNAME レコードを自動的に作成できます。

証明書の使用オプション

ACM 証明書は、いくつかの方法で Kubernetes で使用できます。

  1. ロードバランサーの終了 (エクスポートなし): ACK を介して証明書を発行し、それらを使用して AWS ロードバランサーで TLS を終了します。証明書は ACM に残り、AWS Load Balancerコントローラーによって自動的に検出されます。この方法では、証明書をエクスポートする必要はありません。

  2. イングレス終了 (エクスポートあり): ACM から証明書をエクスポートし、イングレスレベルで TLS 終了のために Kubernetes シークレットに保存します。これにより、Kubernetes ワークロード内で証明書を直接使用できます。

注記

プライベート証明書を必要とするユースケースについては、「証明書マネージャープラグインである AWS Private CA Connector for Kubernetes」を参照してください。

前提条件

ACM 用の ACK サービスコントローラーをインストールする前に、以下があることを確認してください。

  • Kubernetes クラスター。

  • Helm がインストールされました。

  • クラスターと通信できるように kubectl が設定されている。

  • eksctl は、EKS でポッド ID の関連付けを設定するためにインストールされています。

ACM 用の ACK サービスコントローラーをインストールする

Helm を使用して、Amazon EKS クラスターに ACM 用の ACK サービスコントローラーをインストールします。

  1. ACK コントローラーの名前空間を作成します。

    $ kubectl create namespace ack-system --dry-run=client -o yaml | kubectl apply -f -
  2. ACK コントローラーのポッド ID 関連付けを作成します。CLUSTER_NAME をクラスター名に、REGION を AWS リージョンに置き換えます。

    $ eksctl create podidentityassociation --cluster CLUSTER_NAME --region REGION \ --namespace ack-system \ --create-service-account \ --service-account-name ack-acm-controller \ --permission-policy-arns arn:aws:iam::aws:policy/AWSCertificateManagerFullAccess
  3. Amazon ECR Public レジストリにログインします。

    $ aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
  4. ACM 用の ACK サービスコントローラーをインストールします。REGION を自分の AWS リージョンに置き換えます。

    $ helm install -n ack-system ack-acm-controller oci://public.ecr.aws/aws-controllers-k8s/acm-chart --set serviceAccount.create=false --set serviceAccount.name=ack-acm-controller --set aws.region=REGION
  5. コントローラーが実行されていることを確認します。

    $ kubectl get pods -n ack-system

ポッド ID の関連付けの詳細については、「Amazon EKS ユーザーガイド」の「EKS Pod Identity」を参照してください。

例: Ingress で TLS を終了する

次の例は、ACM 証明書をエクスポートし、それを使用して Kubernetes Ingress レベルで TLS を終了する方法を示しています。この設定では、ACM 証明書を作成し、Kubernetes シークレットにエクスポートし、TLS 終了に証明書を使用するように Ingress リソースを設定します。

この例では、以下のようになっています:

  • エクスポートされた証明書を保存するためにシークレットが作成されます (exported-cert-secret)

  • ACK Certificate リソースは、ドメインの ACM に証明書をリクエストし、シーexported-cert-secretクレットにエクスポートします。

  • Ingress リソースは を参照してexported-cert-secret、受信トラフィックの TLS を終了します。

をドメイン名${HOSTNAME}に置き換えます。

apiVersion: v1 kind: Secret type: kubernetes.io/tls metadata: name: exported-cert-secret namespace: demo-app data: tls.crt: "" tls.key: "" --- apiVersion: acm.services.k8s.aws/v1alpha1 kind: Certificate metadata: name: exportable-public-cert namespace: demo-app spec: domainName: ${HOSTNAME} options: certificateTransparencyLoggingPreference: ENABLED exportTo: namespace: demo-app name: exported-cert-secret key: tls.crt --- apiVersion: networking.k8s.io/v1 kind: Ingress metadata: name: ingress-traefik namespace: demo-app spec: tls: - hosts: - ${HOSTNAME} secretName: exported-cert-secret ingressClassName: traefik rules: - host: ${HOSTNAME} http: paths: - path: / pathType: Prefix backend: service: name: whoami port: number: 80

デプロイされると、ACM の ACK サービスコントローラーは、更新を含む証明書のライフサイクルを自動的に管理します。ACM が証明書を更新すると、コントローラーはシーexported-cert-secretクレットを新しい証明書で更新し、Ingress が手動で介入することなく有効な証明書を引き続き使用できるようにします。