

 **このページの改善にご協力ください** 

このユーザーガイドに貢献するには、すべてのページの右側のペインにある「**GitHub でこのページを編集する**」リンクを選択してください。

# IRSA を使用するように Amazon VPC CNI プラグインを設定する
<a name="cni-iam-role"></a>

[Amazon VPC CNI plugin for Kubernetes](https://github.com/aws/amazon-vpc-cni-k8s) は、Amazon EKS クラスター内の Pod ネットワーキング用のネットワークプラグインです。プラグインは Kubernetes ポッドに VPC IP アドレスを割り当て、各ノードのポッドに必要なネットワークを設定する役割を果たしています。

**注記**  
Amazon VPC CNI プラグインは、Amazon EKS Pod Identity もサポートしています。詳細については、「[IAM ロールを Kubernetes サービスアカウントに割り当てる](pod-id-association.md)」を参照してください。

プラグイン:
+ AWS アイデンティティとアクセス管理 (IAM のアクセス許可が必要です。クラスターが `IPv4` ファミリーを使用する場合、このアクセス許可は、[https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html](https://docs.aws.amazon.com/aws-managed-policy/latest/reference/AmazonEKS_CNI_Policy.html) AWS 管理ポリシーで指定されます。クラスターが `IPv6` ファミリーを使用する場合には、作成した IAM ポリシーにアクセス許可を追加する必要があります。手順については、「[`IPv6` ファミリーを使用するクラスター用に IAM ポリシーを作成します。](#cni-iam-role-create-ipv6-policy)」を参照してください。このポリシーはAmazon EKS ノード IAM ロール または 個別の IAM ロールにアタッチすることができます。Amazon EKS ノード IAM ロールにポリシーをアタッチする手順については「[Amazon EKS ノードの IAM ロール](create-node-role.md)」を参照してください。このトピックで詳細に説明するように、別のロールに割り当てることをお勧めします。
+ デプロイ時に作成すると、`aws-node` という名前の Kubernetes サービスアカウントを使用するように設定されます。サービスアカウントは `aws-node` という名前の Kubernetes `clusterrole` にバインドされます。これには、必要な Kubernetes アクセス許可が割り当てられています。

**注記**  
IMDS へのアクセスをブロックする場合を除き、Amazon VPC CNI plugin for Kubernetes 用の Pod には、[Amazon EKS ノード IAM ロール](create-node-role.md)に割り当てられたパーミッションへのアクセス権があります。詳細については「[ワーカーノードに割り当てられたインスタンスプロファイルへのアクセスを制限する](https://aws.github.io/aws-eks-best-practices/security/docs/iam/#restrict-access-to-the-instance-profile-assigned-to-the-worker-node)」を参照してください。
+ 既存の Amazon EKS クラスターが必要です。デプロイするには「[Amazon EKS の使用を開始する](getting-started.md)」を参照してください。
+ クラスターに、既存の AWS Identity and Access Management (IAM) OpenID Connect (OIDC) プロバイダーが必要です。既に存在しているかどうかを確認する、または作成するには「[クラスターの IAM OIDC プロバイダーを作成するには](enable-iam-roles-for-service-accounts.md)」を参照してください。

## ステップ 1: Amazon VPC CNI plugin for Kubernetes の IAM ロールを作成する
<a name="cni-iam-role-create-role"></a>

1. クラスターで使用する IP ファミリを決定します。

   ```
   aws eks describe-cluster --name my-cluster | grep ipFamily
   ```

   出力例は次のとおりです。

   ```
   "ipFamily": "ipv4"
   ```

   この出力では代わりに `ipv6` が返されることがあります。

1. IAM ロールの作成 IAM ロールを作成するには`eksctl` または `kubectl` および AWS CLI を使用してます。  
eksctl  
   + クラスターの IP ファミリーに適合するコマンドを使用して IAM ロールを作成し、そのロールに IAM ポリシーをアタッチします。このコマンドでは、IAM ロールを作成する AWS CloudFormation スタックを作成およびデプロイし、そのために指定したポリシーをアタッチします。さらに、既存の `aws-node` Kubernetes サービスアカウントに対し、作成された IAM ロールの ARN をアノテーションします。
     +  `IPv4` 

       *マイクラスター* を独自の値に置き換えます。

       ```
       eksctl create iamserviceaccount \
           --name aws-node \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKSVPCCNIRole \
           --attach-policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
           --override-existing-serviceaccounts \
           --approve
       ```
     +  `IPv6` 

       *マイクラスター* を独自の値に置き換えます。*111122223333* を、ご自身のアカウント ID に置き換えます。また、*AmazonEKS\$1CNI\$1IPv6\$1Policy* を、`IPv6` ポリシー名に置き換えます。`IPv6` ポリシーがない場合は[`IPv6` ファミリーを使用するクラスター用に IAM ポリシーを作成します。](#cni-iam-role-create-ipv6-policy) を参照して作成します。クラスターで `IPv6` を使用するにはいくつかの要件を満たす必要があります。詳細については「[クラスター、Pod、サービスに対する IPv6 アドレスの説明](cni-ipv6.md)」を参照してください。

       ```
       eksctl create iamserviceaccount \
           --name aws-node \
           --namespace kube-system \
           --cluster my-cluster \
           --role-name AmazonEKSVPCCNIRole \
           --attach-policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
           --override-existing-serviceaccounts \
           --approve
       ```  
kubectl と AWS CLI  

   1. クラスターの OIDC プロバイダーの URL を表示します。

      ```
      aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text
      ```

      出力例は次のとおりです。

      ```
      https://oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
      ```

      出力が返されない場合は[クラスター用の IAM OIDC プロバイダーを作成する](enable-iam-roles-for-service-accounts.md)必要があります。

   1. 次の内容を *vpc-cni-trust-policy.json* という名前のファイルにコピーします。*111122223333* を、ご自身のアカウント ID および前のステップで返された出力 *EXAMPLED539D4633E53DE1B71EXAMPLE* に置き換えます。*地域コード* を、クラスターのある AWS リージョンに置き換えます。

      ```
      {
          "Version":"2012-10-17",		 	 	 
          "Statement": [
              {
                  "Effect": "Allow",
                  "Principal": {
                      "Federated": "arn:aws:iam::111122223333:oidc-provider/oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE"
                  },
                  "Action": "sts:AssumeRoleWithWebIdentity",
                  "Condition": {
                      "StringEquals": {
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:aud": "sts.amazonaws.com",
                          "oidc.eks.us-east-1.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE:sub": "system:serviceaccount:kube-system:aws-node"
                      }
                  }
              }
          ]
      }
      ```

   1. ロールを作成します。*AmazonEKSVPCCNIRole* は任意の名前に置き換えることができます。

      ```
      aws iam create-role \
        --role-name AmazonEKSVPCCNIRole \
        --assume-role-policy-document file://"vpc-cni-trust-policy.json"
      ```

   1. 必要な IAM ポリシーをロールにアタッチします。クラスターの IP ファミリに適合したコマンドを実行してください。
      +  `IPv4` 

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```
      +  `IPv6` 

        *111122223333* はご自身のアカウント ID に置き換え、*AmazonEKS\$1CNI\$1IPv6\$1Policy* はご使用の `IPv6` ポリシーの名前に置き換えます。`IPv6` ポリシーがない場合は[`IPv6` ファミリーを使用するクラスター用に IAM ポリシーを作成します。](#cni-iam-role-create-ipv6-policy) を参照して作成します。クラスターで `IPv6` を使用するにはいくつかの要件を満たす必要があります。詳細については「[クラスター、Pod、サービスに対する IPv6 アドレスの説明](cni-ipv6.md)」を参照してください。

        ```
        aws iam attach-role-policy \
          --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy \
          --role-name AmazonEKSVPCCNIRole
        ```

   1. 次のコマンドを実行し、先に作成した IAM ロールの ARN で `aws-node` サービスアカウントをアノテーションします。example の値は独自の値に置き換えます。

      ```
      kubectl annotate serviceaccount \
          -n kube-system aws-node \
          eks.amazonaws.com/role-arn=arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
      ```

1. (オプション) Kubernetes サービスアカウントで使用されている AWS Security Token Service エンドポイントタイプを設定します。詳細については、「[サービスアカウントの AWS Security Token Service エンドポイントを設定する](configure-sts-endpoint.md)」を参照してください。

## ステップ 2: Amazon VPC CNI plugin for Kubernetes の Pod を再デプロイする
<a name="cni-iam-role-redeploy-pods"></a>

1. 認証情報環境変数を適用するために、サービスアカウントに関連付けられている既存の Pod を削除して再作成します。現在アノテーションなしで実行されている Pod には、アノテーションは適用されません。次のコマンドは、既存の `aws-node` DaemonSet Pod を削除し、サービスアカウントのアノテーションを使用してデプロイします。

   ```
   kubectl delete Pods -n kube-system -l k8s-app=aws-node
   ```

1. Pod がすべて再起動したことを確認します。

   ```
   kubectl get pods -n kube-system -l k8s-app=aws-node
   ```

1. Pod の 1 つについて説明し、`AWS_WEB_IDENTITY_TOKEN_FILE` および `AWS_ROLE_ARN` 環境変数が存在することを確認します。*cpjw7* を、前のステップの出力で返された、いずれかの Pod の名前に置き換えます。

   ```
   kubectl describe pod -n kube-system aws-node-cpjw7 | grep 'AWS_ROLE_ARN:\|AWS_WEB_IDENTITY_TOKEN_FILE:'
   ```

   出力例は次のとおりです。

   ```
   AWS_ROLE_ARN:                 arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
         AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token
         AWS_ROLE_ARN:                           arn:aws:iam::111122223333:role/AmazonEKSVPCCNIRole
         AWS_WEB_IDENTITY_TOKEN_FILE:            /var/run/secrets/eks.amazonaws.com/serviceaccount/token
   ```

   Pod には 2 つのコンテナが含まれているため、重複した結果の 2 つのセットが返されます。両方のコンテナの値は同じです。

   Pod で AWS リージョンエンドポイントを使用している場合、前の出力では下記の行も返されています。

   ```
   AWS_STS_REGIONAL_ENDPOINTS=regional
   ```

## ステップ 3: ノードの IAM ロールから CNI ポリシーを削除する
<a name="remove-cni-policy-node-iam-role"></a>

現在、[Amazon EKS ノード IAM ロール](create-node-role.md)に `AmazonEKS_CNI_Policy` IAM (`IPv4`) ポリシーまたは [IPv6 ポリシー](#cni-iam-role-create-ipv6-policy)がアタッチされており、さらに、別の IAM ロールを作成し、このロールに対し前出のポリシーをアタッチし、そのロールを `aws-node` Kubernetes サービスアカウントに割り当てている場合、クラスターの IP ファミリーに適合する AWS CLI コマンドを使用して、ノードのロールからポリシーを削除することをお勧めします。*AmazonEKSNodeRole* を、ノードのロールの名前に置き換えます。
+  `IPv4` 

  ```
  aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::aws:policy/AmazonEKS_CNI_Policy
  ```
+  `IPv6` 

  *111122223333* はご自身のアカウント ID に置き換え、*AmazonEKS\$1CNI\$1IPv6\$1Policy* はご使用の `IPv6` ポリシーの名前に置き換えます。

  ```
  aws iam detach-role-policy --role-name AmazonEKSNodeRole --policy-arn arn:aws:iam::111122223333:policy/AmazonEKS_CNI_IPv6_Policy
  ```

## `IPv6` ファミリーを使用するクラスター用に IAM ポリシーを作成します。
<a name="cni-iam-role-create-ipv6-policy"></a>

`IPv6` ファミリーを使用するクラスターを作成し、そのクラスターでバージョン `1.10.1` 以降の Amazon VPC CNI plugin for Kubernetes アドオンが設定されている場合は、IAM ロールに割り当てることができる IAM ポリシーを作成する必要があります。作成時に `IPv6` ファミリーの使用を設定していない、既存のクラスターにおいて、`IPv6` を使用する場合には新しいクラスターを作成する必要があります。クラスターでの `IPv6` 使用の詳細については「[クラスター、Pod、サービスに対する IPv6 アドレスの説明](cni-ipv6.md)」を参照してください。

1. 次のテキストをコピーし、`vpc-cni-ipv6-policy.json` という名前のファイルに保存します。

   ```
   {
       "Version":"2012-10-17",		 	 	 
       "Statement": [
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:AssignIpv6Addresses",
                   "ec2:DescribeInstances",
                   "ec2:DescribeTags",
                   "ec2:DescribeNetworkInterfaces",
                   "ec2:DescribeInstanceTypes"
               ],
               "Resource": "*"
           },
           {
               "Effect": "Allow",
               "Action": [
                   "ec2:CreateTags"
               ],
               "Resource": [
                   "arn:aws:ec2:*:*:network-interface/*"
               ]
           }
       ]
   }
   ```

1. IAM ポリシーを作成する

   ```
   aws iam create-policy --policy-name AmazonEKS_CNI_IPv6_Policy --policy-document file://vpc-cni-ipv6-policy.json
   ```