

 **帮助改进此页面** 

要帮助改进本用户指南，请选择位于每个页面右侧窗格中的**在 GitHub 上编辑此页面**链接。

# 使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源
<a name="pod-id-assign-target-role"></a>

在 Amazon Elastic Kubernetes Service（Amazon EKS）上运行应用程序时，您可能需要访问位于不同 AWS 账户中的 AWS 资源。本指南向您介绍如何使用 EKS 容器组身份设置跨账户访问，以便 Kubernetes 容器组（pod）能够使用目标角色访问其他 AWS 资源。

## 先决条件
<a name="_prerequisites"></a>

在开始之前，请确保您已完成以下步骤：
+  [设置 Amazon EKS 容器组身份代理](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-agent-setup.html) 
+  [创建 EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) 

## 工作方式
<a name="_how_it_works"></a>

容器组身份通过名为角色链的流程，使 EKS 集群中的应用程序能够跨账户访问 AWS 资源。

创建容器组身份关联时，可以提供两个 IAM 角色：一个是与 EKS 集群位于同一账户的 [EKS 容器组（pod）身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)，另一个是包含您希望访问的 AWS 资源（例如 S3 存储桶或 RDS 数据库）的账户中的目标 IAM 角色。因 [IAM PassRole](https://docs.aws.amazon.com/IAM/latest/UserGuide/reference_policies_examples_iam-passrole-service.html) 要求，[EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)必须位于 EKS 集群所在账户中，而目标 IAM 角色可以位于任何 AWS 账户中。PassRole 允许 AWS 实体将角色代入委派给其他服务。EKS 容器组身份通过 PassRole 将角色连接到 Kubernetes 服务账户，同时要求角色及传递该角色的身份都必须与 EKS 集群位于同一 AWS 账户中。如果应用程序容器组（pod）需要访问 AWS 资源，它会向容器组身份请求凭证。随后，容器组身份会按顺序自动执行两次角色代入：首先代入 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)，然后使用该凭证代入目标 IAM 角色。此过程可为容器组（pod）提供临时凭证（这些凭证具有目标角色中定义的权限），从而安全访问其他 AWS 账户中的资源。

## 缓存注意事项
<a name="_caching_considerations"></a>

由于缓存机制，对现有容器组身份关联中 IAM 角色的更新可能不会立即在 EKS 集群上运行的容器组（pod）中生效。容器组身份代理会根据获取凭证时的关联配置来缓存 IAM 凭证。如果关联仅包含 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)而不包含目标 IAM 角色，则缓存凭证有效期为 6 小时。如果关联同时包含 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN 和目标 IAM 角色，则缓存凭证有效期为 59 分钟。修改现有关联（例如更新 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html) ARN 或添加目标 IAM 角色）不会重置现有缓存。因此，只有在刷新缓存凭证后，代理才会识别更新。如需立即应用更改，可重新创建现有容器组（pod）；否则需等待缓存过期。

## 第 1 步：创建并关联目标 IAM 角色
<a name="_step_1_create_and_associate_a_target_iam_role"></a>

在此步骤中，您将通过创建和配置目标 IAM 角色来建立安全的信任链。出于演示目的，我们将创建新的目标 IAM 角色，以在两个 AWS 账户间建立信任链：位于 EKS 集群 AWS 账户中的 [EKS 容器组身份角色](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. 在左侧导航窗格中，选择 **角色**。

1. 选择**创建角色**按钮，然后选择“可信实体类型”下的 **AWS 账户**。

1. 选择**其他 AWS 账户**，输入 AWS 账号（[EKS 容器组身份角色](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"
        }
      }
    }
  ]
}
```

上述策略允许来自 AWS 账户 111122223333，并带有相关 [EKS 容器组身份会话标签](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html)的角色 `eks-pod-identeity-primary-role` 代入此角色。

如果您在 EKS 容器组身份中[禁用会话标签](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-abac.html#pod-id-abac-tags)，则在代入目标角色时，EKS 容器组身份还会设置 `sts:ExternalId`，其中包含有关容器组（pod）集群、命名空间和服务账户的信息。

```
{
  "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 容器组身份角色的权限策略
<a name="_update_the_permission_policy_for_eks_pod_identity_role"></a>

在此步骤中，您将通过添加目标 IAM 角色 ARN 作为资源，来更新 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)（与 Amazon EKS 集群关联）的权限策略。

1. 打开 [Amazon EKS 控制台](https://console.aws.amazon.com/eks/home#/clusters)。

1. 在左侧导航窗格中，选择**集群**，然后选择 EKS 集群名称。

1. 选择**访问**选项卡。

1. 在**容器组身份关联**下，选择 [EKS 容器组身份角色](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. 在**容器组身份关联**中，选择**创建**。

1. 在 **IAM 角色**中选择供工作负载代入的 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)。

1. 在**目标 IAM 角色**中选择将由 [EKS 容器组身份角色](https://docs.aws.amazon.com/eks/latest/userguide/pod-id-role.html)代入的目标 IAM 角色。

1. 在 **Kubernetes 命名空间**字段中，输入要在其中创建关联的命名空间名称（例如 `my-app-namespace`），这将定义服务账户所在的位置。

1. 在 **Kubernetes 服务账户**字段中，输入将使用 IAM 凭证的服务账户名称（例如 `my-service-account`）。这会将 IAM 角色链接到服务账号。

1. （可选）选择**禁用会话标签**以禁用容器组身份在担任角色时自动添加的默认会话标签。

1. （可选）切换**配置会话策略**，以配置 IAM 策略，以便对这个容器组身份关联施加超出附加到**目标 IAM 角色**的 IAM 策略所定义权限的额外限制。
**注意**  
1. 只有在**禁用会话标签**设置被选中的情况下，才能应用会话策略。2. 如果您指定会话策略，则策略限制适用于**目标 IAM 角色**的权限，而不是与此容器组身份关联相关联的 **IAM 角色**。

1. 选择**创建**以创建关联。