使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源 - Amazon EKS

帮助改进此页面

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

使用 EKS 容器组身份目标 IAM 角色访问 AWS 资源

在 Amazon Elastic Kubernetes Service(Amazon EKS)上运行应用程序时,您可能需要访问位于相同或不同 AWS 账户中的 AWS 资源。本指南向您介绍如何使用 EKS 容器组身份设置这些账户之间的访问权限,以便 Kubernetes 容器组(pod)能够访问其他 AWS 资源。

先决条件

在开始之前,请确保您已完成以下步骤:

工作方式

容器组身份通过名为角色链的流程,使 EKS 集群中的应用程序能够跨账户访问 AWS 资源。创建容器组身份关联时,可以提供两个 IAM 角色:一个是与 EKS 集群位于同一账户的 EKS 容器组身份角色,另一个是包含 AWS 资源(例如 S3 存储桶或 DynamoDB 表)的账户中的目标 IAM 角色。因 IAM PassRole 要求,EKS 容器组身份角色必须位于 EKS 集群所在账户中,而目标 IAM 角色可以位于任何 AWS 账户中。PassRole 允许 AWS 实体将角色代入委派给其他服务。EKS 容器组身份通过 PassRole 将角色连接到 Kubernetes 服务账户,同时要求角色及传递该角色的身份都必须与 EKS 集群位于同一 AWS 账户中。如果应用程序容器组(pod)需要访问 AWS 资源,它会向容器组身份请求凭证。随后,容器组身份会按顺序自动执行两次角色代入:首先代入 EKS 容器组身份角色,然后使用该凭证代入目标 IAM 角色。此过程可为容器组(pod)提供临时凭证(这些凭证具有目标角色中定义的权限),从而安全访问其他 AWS 账户中的资源。

缓存注意事项

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

第 1 步:创建并关联目标 IAM 角色

在此步骤中,您将通过创建和配置目标 IAM 角色来建立安全的信任链。出于演示目的,我们将创建新的目标 IAM 角色,以在两个 AWS 账户间建立信任链:位于 EKS 集群 AWS 账户中的 EKS 容器组身份角色(例如 eks-pod-identity-primary-role)将获得代入目标账户中目标 IAM 角色(例如 eks-pod-identity-aws-resources)的权限,从而实现对 Amazon S3 存储桶等 AWS 资源的访问。

创建目标 IAM 角色

  1. 打开 Amazon IAM 控制台

  2. 在顶部导航栏中,确认您已登录包含目标 IAM 角色所需 AWS 资源(例如 S3 存储桶或 DynamoDB 表)的账户。

  3. 在左侧导航窗格中,选择 角色

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

  5. 选择其他 AWS 账户,输入 AWS 账号(EKS 容器组身份角色所在的账户账号),然后选择下一步

  6. 添加要与该角色关联的权限策略(例如 AmazonS3FullAccess),然后选择下一步

  7. 输入 MyCustomIAMTargetRole 等角色名称,然后选择创建角色

更新目标 IAM 角色的信任策略

  1. 创建角色后,您将返回到角色列表。查找并选择您在上一步中创建的新角色(例如 MyCustomIAMTargetRole)。

  2. 选择信任关系选项卡。

  3. 点击右侧的编辑信任策略

  4. 在策略编辑器中,将默认 JSON 替换为信任策略。将 IAM 角色 ARN 中角色名称和 111122223333 的占位符值替换为托管 EKS 集群的 AWS 账户 ID。例如:

{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role" }, "Action": "sts:AssumeRole", }, { "Effect": "Allow", "Principal": { "AWS": "arn:aws:iam::111122223333:role/eks-pod-identity-primary-role" }, "Action": "sts:TagSession" } ] }

更新 EKS 容器组身份角色的权限策略

在此步骤中,您将通过添加目标 IAM 角色 ARN 作为资源,来更新 EKS 容器组身份角色(与 Amazon EKS 集群关联)的权限策略。

  1. 打开 Amazon EKS 控制台

  2. 在左侧导航窗格中,选择集群,然后选择 EKS 集群名称。

  3. 选择访问选项卡。

  4. 容器组身份关联下,选择 EKS 容器组身份角色

  5. 依次选择权限添加权限,然后选择创建内联策略

  6. 选择右侧的 JSON

  7. 在策略编辑器中,将默认 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 服务账户

在此步骤中,您将在目标 IAM 角色与 EKS 集群中的 Kubernetes 服务账户之间创建关联。

  1. 打开 Amazon EKS 控制台

  2. 在左侧导航窗格中,选择集群,然后选择要向其添加关联的集群名称。

  3. 选择访问选项卡。

  4. 容器组身份关联中,选择创建

  5. IAM 角色中选择供工作负载代入的 EKS 容器组身份角色

  6. 目标 IAM 角色中选择将由 EKS 容器组身份角色代入的目标 IAM 角色。

  7. Kubernetes 命名空间字段中,输入要在其中创建关联的命名空间名称(例如 my-app-namespace),这将定义服务账户所在的位置。

  8. Kubernetes 服务账户字段中,输入将使用 IAM 凭证的服务账户名称(例如 my-service-account)。这会将 IAM 角色链接到服务账号。

  9. 选择创建以创建关联。

(可选)第 3 步:向 IAM 目标角色添加外部权限

有时,您需要向第三方提供对您的 AWS 资源的访问权 (提供访问权)。举例来说,您决定聘请一家名为 Example Corp 的第三方公司来监控 AWS 账户并帮助优化成本。为跟踪您的日常开支,Example Corp 需要访问您的 AWS 资源。在这种情况下,建议向 IAM 目标角色的信任策略添加 ExternalId,以避免可能出现的混淆代理问题。

编辑信任策略

  1. 创建角色后,您将返回到角色列表。查找并点击您在上一步中创建的新角色(例如 MyCustomIAMTargetRole)。

  2. 选择信任关系选项卡。

  3. 点击右侧的编辑信任策略

  4. 在策略编辑器中,将默认 JSON 替换为信任策略。将 ExternalId 占位符值替换为 aws-region/other-account/cluster-name/namespace/service-account-name,其中“region”是集群所在的 AWS 区域,“111122223333”是其他 AWS 账户 ID,“cluster-name”是 EKS 集群名称,“namespace”是 Kubernetes 命名空间,“service-account-name”则是 Kubernetes 服务账户名称。例如:

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