

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

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

# EKS Pod Identity のターゲット IAM ロールを使用して AWS リソースにアクセスする
<a name="pod-id-assign-target-role"></a>

Amazon Elastic Kubernetes Service (Amazon EKS) でアプリケーションを実行する場合、異なる AWS アカウントに存在する AWS リソースへのアクセスが必要になることがあります。このガイドでは、EKS Pod Identity を使用してクロスアカウントアクセスを設定する方法を示します。これにより、Kubernetes ポッドからターゲットロールを使用して他の AWS リソースにアクセスできるようになります。

## 前提条件
<a name="_prerequisites"></a>

作業を開始する前に、次の手順が完了していることを確認してください。
+  [Amazon EKS Pod Identity エージェントのセットアップ](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html) 
+  [EKS Pod Identity ロールの作成](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) 

## 仕組み
<a name="_how_it_works"></a>

Pod Identity を使用すると、EKS クラスター内のアプリケーションから、ロールチェーンと呼ばれるプロセスを通じてアカウント間の AWS リソースにアクセスできます。

Pod Identity の関連付けを作成する際は、EKS クラスターと同じアカウント内にある [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)と、アクセスしたいユーザーの AWS リソース (S3 バケットや RDS データベースなど) が含まれたアカウントのターゲット IAM ロールという 2 つの IAM ロールを指定できます。[IAM PassRole](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_iam-passrole-service.html) の要件により、[EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)は EKS クラスターのアカウント内に存在する必要がありますが、ターゲット IAM ロールは任意の AWS アカウントに存在できます。PassRole を使用すると、AWS エンティティはロールの引き受けを別のサービスに委任できます。EKS Pod Identity は PassRole を使用してロールを Kubernetes サービスアカウントに接続し、ロールとそれを渡す ID の両方が EKS クラスターと同じ AWS アカウントに存在する必要があります。アプリケーションポッドから AWS リソースにアクセスする必要がある場合、ポッドで Pod Identity の認証情報が要求されます。次に、Pod Identity は 2 つのロールの引き受けを順番に自動実行します。つまり、最初に [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)を引き受け、次にその認証情報を使用してターゲット IAM ロールを引き受けます。このプロセスにより、ターゲットロールで定義されたアクセス許可を含む一時的な認証情報がポッドに提供され、他の AWS アカウントのリソースへの安全なアクセスが実現します。

## キャッシュに関する考慮事項
<a name="_caching_considerations"></a>

キャッシュメカニズムにより、既存の Pod Identity の関連付けで IAM ロールを更新しても、EKS クラスターで実行されているポッドですぐに有効にならない場合があります。Pod Identity エージェントは、認証情報の取得時に関連付けの設定に基づいて IAM 認証情報をキャッシュします。関連付けに [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)のみが含まれ、ターゲット IAM ロールが含まれていない場合、キャッシュされた認証情報は 6 時間有効となります。関連付けに [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN とターゲット IAM ロールの両方が含まれている場合、キャッシュされた認証情報は 59 分間有効です。[EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN の更新やターゲット IAM ロールの追加など、既存の関連付けを変更しても、既存のキャッシュはリセットされません。その結果、エージェントはキャッシュされた認証情報が更新されるまで更新を認識しません。変更をより迅速に適用するには、既存のポッドを再作成できます。再作成しない場合は、キャッシュの有効期限が切れるまで待機する必要があります。

## ステップ 1: ターゲット IAM ロールを作成して関連付ける
<a name="_step_1_create_and_associate_a_target_iam_role"></a>

このステップでは、ターゲット IAM ロールを作成して設定することで、安全な信頼チェーンを確立します。デモンストレーションでは、2 つの AWS アカウント間で信頼チェーンを確立するための新しいターゲット IAM ロールを作成します。EKS クラスターの AWS アカウント内にある [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) (例: `eks-pod-identity-primary-role`) で、ターゲットアカウントでターゲット IAM ロール (例：`eks-pod-identity-aws-resources`) を引き受ける権限を取得し、Amazon S3 バケットなどの AWS リソースへのアクセスを有効にします。

### ターゲット IAM ロールを作成する
<a name="_create_the_target_iam_role"></a>

1. [Amazon IAM コンソール](https://console.aws.amazon.com/iam/home)を開きます。

1. 上部のナビゲーションバーで、ターゲット IAM ロールの AWS リソース (S3 バケットや DynamoDB テーブルなど) を含むアカウントにサインインしていることを確認します。

1. 左のナビゲーションペインで、**[Roles (ロール)]** を選択してください。

1. **[ロールの作成]** ボタンを選択し、「信頼できるエンティティタイプ」の下にある **AWS** アカウントを選択します。

1. **別の AWS アカウント**を選択し、AWS のアカウント番号 ([EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)が存在するアカウント) を入力し、**[次へ]** を選択します。

1. ロールに関連付けるアクセス許可ポリシー (AmazonS3FullAccess など) を追加し、**[次へ]** を選択します。

1. 「`MyCustomIAMTargetRole`」などのロール名を入力し、**[ロールの作成]** を選択します。

### ターゲット IAM ロールの信頼ポリシーを更新する
<a name="_update_the_target_iam_role_trust_policy"></a>

1. ロールを作成すると、**[ロール]** リストに戻ります。前の手順で作成した新規ロールを検索し、選択します (例: `MyCustomIAMTargetRole`)。

1. **[信頼関係]** タブを選択します。

1. 右側の **[信頼ポリシーを編集]** をクリックします。

1. ポリシーエディタで、デフォルトの JSON を信頼ポリシーに置き換えます。IAM ロール ARN のロール名と `111122223333` のプレースホルダー値を、EKS クラスターをホストする AWS アカウント ID に置き換えます。オプションで、ロール信頼ポリシーの PrincipalTags を使用して、特定のクラスターと名前空間の特定のサービスアカウントのみがターゲットロールを引き受けることを許可することもできます。例えば、次のようになります。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": [
        "sts:AssumeRole",
        "sts:TagSession"
      ],
      "Condition": {
        "StringEquals": {
          "aws:RequestTag/eks-cluster-arn": "arn:aws:eks:us-east-1:111122223333:cluster/example-cluster",
          "aws:RequestTag/kubernetes-namespace": "ExampleNameSpace",
          "aws:RequestTag/kubernetes-service-account": "ExampleServiceAccountName"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    }
  ]
}
```

上記のポリシーでは、関連する [EKS Pod Identity セッションタグ](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html)を持つ AWS アカウント 111122223333 のロール `eks-pod-identeity-primary-role` がこのロールを引き受けることを許可します。

EKS Pod Identity で[セッションタグを無効](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html#pod-id-abac-tags)にした場合、EKS Pod Identity は、ターゲットロールを引き受けるときに、ポッドのクラスター、名前空間、およびサービスアカウントに関する情報を `sts:ExternalId` に設定します。

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:AssumeRole",
      "Condition": {
        "StringEquals": {
          "sts:ExternalId": "region/111122223333/cluster-name/namespace/service-account-name"
        },
        "ArnEquals": {
          "aws:PrincipalARN": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "AWS": "arn:aws:iam::111122223333:root"
      },
      "Action": "sts:TagSession"
    }
  ]
}
```

上記のポリシーは、予想されるクラスター、名前空間、サービスアカウントのみがターゲットロールを引き受けることができるようにするのに役立ちます。

### EKS Pod Identity ロールのアクセス許可ポリシーを更新する
<a name="_update_the_permission_policy_for_eks_pod_identity_role"></a>

このステップでは、ターゲット IAM ロール ARN をリソースとして追加し、Amazon EKS クラスターに関連付けられた [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)のアクセス許可ポリシーを更新します。

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで **[クラスター]** を選択し、次に EKS クラスターの名前を選択します。

1. **[リモートアクセス]** タブを選択してください。

1. **[Pod Identity の関連付け]** で、[[EKS Pod Identity ロール]](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) を選択します。

1. **[アクセス許可]**、**[許可を追加]** を選択し、次に **[インラインポリシーを作成]** をクリックします。

1. 右側で **[JSON]** を選択します。

1. ポリシーエディタで、デフォルトの JSON をアクセス許可ポリシーに置き換えます。IAM ロール ARN のロール名と `222233334444` のプレースホルダー値をターゲット IAM ロールに置き換えます。例えば、次のようになります。

```
{
    "Version":"2012-10-17",		 	 	 
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "sts:AssumeRole",
                "sts:TagSession"
            ],
            "Resource": "arn:aws:iam::222233334444:role/eks-pod-identity-aws-resources"
        }
    ]
}
```

## ステップ 2: ターゲット IAM ロールを Kubernetes サービスアカウントに関連付ける
<a name="_step_2_associate_the_target_iam_role_to_a_kubernetes_service_account"></a>

このステップでは、ターゲット IAM ロールと EKS クラスター内の Kubernetes サービスアカウントとの関連付けを作成します。

1. [Amazon EKS コンソール](https://console.aws.amazon.com/eks/home#/clusters)を開きます。

1. 左のナビゲーションペインで **[クラスター]** を選択し、次に関連付けを追加するクラスター名を選択します。

1. **[アクセス]** タブを選択します。

1. **[Pod Identity の関連付け]** で **[作成]** を選択します。

1. ワークロードが引き受ける **IAM ロール**の [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)を選択します。

1. [EKS Pod Identity ロール](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)が引き受けるターゲット IAM ロールを **[ターゲット IAM ロール]** で選択します。

1. **[Kubernetes 名前空間]** フィールドに、関連付けを作成する名前空間の名前を入力します (例: `my-app-namespace`)。これにより、サービスアカウントが存在する場所が定義されます。

1. **[Kubernetes サービスアカウント]** フィールドに、IAM 認証情報を使用するサービスアカウントの名前 (例: `my-service-account`) を入力します。これにより、IAM ロールがサービスアカウントにリンクされます。

1. (オプション) **[セッションタグを無効にする]** を選択することで、Pod Identity がロールを引き受けるときに自動的に追加するデフォルトのセッションタグを無効にできます。

1. (オプション) **[セッションポリシーの設定]** を切り替えることで、**ターゲット IAM ロール**にアタッチされた IAM ポリシーで定義されているアクセス許可以外の追加制限を、この Pod Identity 関連付けに適用するように IAM ポリシーを設定できます。
**注記**  
1. セッションポリシーは、**[セッションタグを無効にする]** の設定がチェックされている場合にのみ適用できます。2. セッションポリシーを指定すると、ポリシーの制限は、この Pod Identity の関連付けに関連付けられた **IAM ロール**ではなく、**ターゲット IAM ロール**のアクセス許可に適用されます。

1. **[作成]** を選択して関連付けを作成します。