

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

# ACM 証明書を使用して Kubernetes ワークロードを保護する
<a name="exportable-certificates-kubernetes"></a>

 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](https://github.com/aws-controllers-k8s/acm-controller)」を参照してください。

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

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

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

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

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

パブリックに発行された証明書は、ACM が発行する前に[ドメイン検証](https://docs.aws.amazon.com//acm/latest/userguide/dns-validation.html)が必要です。[Amazon Route 53 の ACK サービスコントローラー](https://github.com/aws-controllers-k8s/route53-controller)を使用して、ホストゾーンに必要な DNS 検証 CNAME レコードを自動的に作成できます。

## 証明書の使用オプション
<a name="kubernetes-ack-certificate-usage"></a>

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

![](http://docs.aws.amazon.com/ja_jp/acm/latest/userguide/images/kubernetes-acm.png)


1. *ロードバランサーの終了 (エクスポートなし)*: ACK を介して証明書を発行し、それらを使用して AWS ロードバランサーで TLS を終了します。証明書は ACM に残り、[AWS Load Balancerコントローラー](https://kubernetes-sigs.github.io/aws-load-balancer-controller/v2.1/guide/ingress/cert_discovery/)によって自動的に検出されます。この方法では、証明書をエクスポートする必要はありません。

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

**注記**  
プライベート証明書を必要とするユースケースについては、「証明書マネージャープラグインである [AWS Private CA Connector for Kubernetes](https://docs.aws.amazon.com//privateca/latest/userguide/PcaKubernetes-concepts.html)」を参照してください。

## 前提条件
<a name="kubernetes-ack-prerequisites"></a>

ACM 用の ACK サービスコントローラーをインストールする前に、以下があることを確認してください。
+ Kubernetes クラスター。
+ Helm がインストールされました。
+ クラスターと通信できるように `kubectl` が設定されている。
+ `eksctl` EKS でポッド ID の関連付けを設定するためにインストールされている。

## ACM 用の ACK サービスコントローラーをインストールする
<a name="kubernetes-ack-installation"></a>

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

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

   ```
   $ kubectl create namespace ack-system --dry-run=client -o yaml | kubectl apply -f -
   ```

1. 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
   ```

1. Amazon ECR Public レジストリにログインします。

   ```
   $ aws ecr-public get-login-password --region us-east-1 | helm registry login --username AWS --password-stdin public.ecr.aws
   ```

1. 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}}
   ```

1. コントローラーが実行されていることを確認します。

   ```
   $ kubectl get pods -n ack-system
   ```

ポッド ID の関連付けの詳細については、*「Amazon* [EKS ユーザーガイド」の「EKS Pod Identity](https://docs.aws.amazon.com//eks/latest/userguide/pod-identities.html)」を参照してください。

## 例: Ingress で TLS を終了する
<a name="kubernetes-ack-example"></a>

次の例は、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 が手動で介入することなく有効な証明書を使用し続けます。