9.3. 假设您自己的 pod 中的 AWS IAM 角色
按照本节中的步骤,启用服务帐户,在用户定义的项目中部署的 pod 中假定 AWS Identity and Access Management (IAM)角色。
您可以创建所需资源,包括 AWS IAM 角色、服务帐户、包含 AWS SDK 的容器镜像,以及使用该镜像部署的 pod。在示例中,使用 Python 的 AWS Boto3 SDK。您还可以验证 pod 身份 Webhook 是否将 AWS 环境变量、卷挂载和令牌卷放入 pod 中。另外,您可以检查服务帐户是否在 pod 中假设 AWS IAM 角色,并可成功运行 AWS SDK 操作。
9.3.1. 为服务帐户设置 AWS IAM 角色 复制链接链接已复制到粘贴板!
创建一个 AWS Identity and Access Management (IAM)角色,供 Red Hat OpenShift Service on AWS 集群中的服务帐户假定。附加服务帐户在 pod 中运行 AWS SDK 操作所需的权限。
先决条件
- 您有在 AWS 帐户中安装和配置 IAM 角色所需的权限。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别的用户特权。
您有 Amazon Resource Name (ARN)的 OpenID Connect (OIDC)供应商,该供应商在带有 STS 集群的 Red Hat OpenShift Service on AWS 中被配置为服务帐户签发者。
注意在带有 STS 集群的 Red Hat OpenShift Service on AWS 中,OIDC 供应商会在安装过程中创建,默认设置为服务帐户签发者。如果您不知道 OIDC 供应商 ARN,请联络您的集群管理员。
-
已安装 AWS CLI (
aws
)。
流程
使用以下 JSON 配置创建一个名为
trust-policy.json
的文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<oidc_provider_arn
> 替换为 OIDC 供应商的 ARN,例如:arn:aws:iam::<aws_account_id>:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres
。您可以使用rosa describe cluster
CLI 命令检索 ARN。 - 2
- 将角色限制为指定的项目和服务帐户。将
<oidc_provider_name
> 替换为 OIDC 供应商的名称,如rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres
。将<project_name>:<service_account_name
> 替换为您的项目名称和服务帐户名称,如my-project:test-service-account
。注意或者,您可以使用 "<
oidc_provider_name>:sub": "system:serviceaccount:<project_name>:*" 将角色限制为指定项目中的任何服务帐户
。如果提供*
通配符,您必须在前面的行中将StringEquals
替换为StringLike
。
创建一个 AWS IAM 角色,它使用
trust-policy.json
文件中定义的信任策略:aws iam create-role \ --role-name <aws_iam_role_name> \ --assume-role-policy-document file://trust-policy.json
$ aws iam create-role \ --role-name <aws_iam_role_name> \
1 --assume-role-policy-document file://trust-policy.json
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
ROLE arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 2022-09-28T12:03:17+00:00 / AQWMS3TB4Z2N3SH7675JK <aws_iam_role_name> ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:<project_name>:<service_account_name> PRINCIPAL <oidc_provider_arn>
ROLE arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 2022-09-28T12:03:17+00:00 / AQWMS3TB4Z2N3SH7675JK <aws_iam_role_name> ASSUMEROLEPOLICYDOCUMENT 2012-10-17 STATEMENT sts:AssumeRoleWithWebIdentity Allow STRINGEQUALS system:serviceaccount:<project_name>:<service_account_name> PRINCIPAL <oidc_provider_arn>
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在输出中保留角色的 ARN。角色 ARN 的格式为
arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
。附加服务帐户在 pod 中运行 AWS SDK 操作时所需的受管 AWS 权限:
aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \ --role-name <aws_iam_role_name>
$ aws iam attach-role-policy \ --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \
1 --role-name <aws_iam_role_name>
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 可选:为角色添加自定义属性或权限边界。如需更多信息,请参阅 AWS 文档中的创建角色来将权限委派给 AWS 服务。
9.3.2. 在项目中创建服务帐户 复制链接链接已复制到粘贴板!
在用户定义的项目中添加服务帐户。在服务帐户配置中包含 eks.amazonaws.com/role-arn
注解,引用您想要服务帐户假定的 AWS Identity and Access Management (IAM)角色的 Amazon Resource Name (ARN)。
先决条件
- 您已为服务帐户创建了 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以使用 AWS 安全令牌服务(STS)集群访问 Red Hat OpenShift Service on AWS。不需要 admin 级别的用户特权。
-
已安装 OpenShift CLI(
oc
)。
流程
在 Red Hat OpenShift Service on AWS 集群中,创建一个项目:
oc new-project <project_name>
$ oc new-project <project_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<project_name>
替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
注意您在创建项目时会自动切换到该项目。
使用以下服务帐户配置,创建一个名为
test-service-account.yaml
的文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在项目中创建服务帐户:
oc create -f test-service-account.yaml
$ oc create -f test-service-account.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
serviceaccount/<service_account_name> created
serviceaccount/<service_account_name> created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 查看服务帐户的详情:
oc describe serviceaccount <service_account_name>
$ oc describe serviceaccount <service_account_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<service_account_name
> 替换为服务帐户的名称。
输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.3. 创建 AWS SDK 容器镜像示例 复制链接链接已复制到粘贴板!
此流程中的步骤提供了创建包含 AWS SDK 的容器镜像的示例方法。
示例步骤使用 Podman 创建容器镜像,Quay.io 来托管镜像。有关 Quay.io 的更多信息,请参阅 Quay.io 入门。容器镜像可用于部署可运行 AWS SDK 操作的 pod。
在本例中,Python 的 AWS Boto3 SDK 安装到容器镜像中。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
先决条件
- 您已在安装主机上安装了 Podman。
- 您有一个 Quay.io 用户帐户。
流程
将以下配置添加到名为
Containerfile
的文件中:FROM ubi9/ubi RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0
FROM ubi9/ubi
1 RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0
2 Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在包含文件的目录中,构建名为
awsboto3sdk
的容器镜像:podman build -t awsboto3sdk .
$ podman build -t awsboto3sdk .
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 登录到 Quay.io:
podman login quay.io
$ podman login quay.io
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 标记镜像以准备上传到 Quay.io:
podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest
$ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<quay_username&
gt; 替换为您的 Quay.io 用户名。
将标记的容器镜像推送到 Quay.io:
podman push quay.io/<quay_username>/awsboto3sdk:latest
$ podman push quay.io/<quay_username>/awsboto3sdk:latest
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<quay_username&
gt; 替换为您的 Quay.io 用户名。
创建包含镜像 public 的 Quay.io 存储库。这会发布镜像,以便它可用于在 Red Hat OpenShift Service on AWS 集群上部署 pod:
- 在 https://quay.io/ 上,导航到包含该镜像的存储库的 Repository Settings 页面。
- 单击 Make Public,使存储库公开可用。
9.3.4. 部署包含 AWS SDK 的 pod 复制链接链接已复制到粘贴板!
从包含 AWS SDK 的容器镜像,在用户定义的项目中部署 pod。在 pod 配置中,指定包含 eks.amazonaws.com/role-arn
注解的服务帐户。
随着服务帐户引用 pod,pod 身份 Webhook 会将 AWS 环境变量、卷挂载和令牌卷注入 pod。pod 变异可让服务帐户在 pod 中自动假设 AWS IAM 角色。
先决条件
- 您已为服务帐户创建了 AWS Identity and Access Management (IAM)角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别用户权限。
-
已安装 OpenShift CLI(
oc
)。 -
您已在项目中创建了一个服务帐户,其中包含一个
eks.amazonaws.com/role-arn
注解,该注解引用您想要服务帐户的 IAM 角色的 Amazon Resource Name (ARN)。 您有一个包含 AWS SDK 的容器镜像,且镜像可供集群使用。具体步骤请参阅创建示例 AWS SDK 容器镜像。
注意在这个示例中使用 Python 的 AWS Boto3 SDK。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
流程
使用以下 pod 配置创建一个名为
awsboto3sdk-pod.yaml
的文件:Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 将
<project_name
> 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。 - 2
- 指定 pod 的名称。
- 3
- 将 <
service_account_name
> 替换为配置为假定 AWS IAM 角色的服务帐户的名称。名称必须与您在 AWS IAM 角色配置中指定的服务帐户名称匹配。 - 4
- 指定
awsboto3sdk
容器镜像的位置。将<quay_username&
gt; 替换为您的 Quay.io 用户名。 - 5
- 在这个示例 pod 配置中,此行使 pod 保持运行 100000 秒,以便直接在 pod 中启用验证测试。有关详细验证步骤,请参阅 pod 中验证假定的 IAM 角色。
部署
awsboto3sdk
pod:oc create -f awsboto3sdk-pod.yaml
$ oc create -f awsboto3sdk-pod.yaml
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
pod/awsboto3sdk created
pod/awsboto3sdk created
Copy to Clipboard Copied! Toggle word wrap Toggle overflow
9.3.5. 在 pod 中验证假定的 IAM 角色 复制链接链接已复制到粘贴板!
在项目中部署 awsboto3sdk
pod 后,请验证 pod 身份 Webhook 是否已修改 pod。检查 pod 中是否存在所需的 AWS 环境变量、卷挂载和 OIDC 令牌卷。
在 pod 中运行 AWS SDK 操作时,您还可以验证服务帐户是否假设 AWS 帐户的 AWS Identity and Access Management (IAM)角色。
先决条件
- 您已为服务帐户创建了 AWS IAM 角色。如需更多信息,请参阅为服务帐户设置 AWS IAM 角色。
- 您可以访问使用 AWS 安全令牌服务(STS)的 Red Hat OpenShift Service on AWS 集群。不需要 admin 级别的用户特权。
-
已安装 OpenShift CLI(
oc
)。 -
您已在项目中创建了一个服务帐户,其中包含一个
eks.amazonaws.com/role-arn
注解,该注解引用您希望服务帐户假定的 IAM 角色的 Amazon Resource Name (ARN)。 您已在包含 AWS SDK 的用户定义项目中部署了 pod。pod 引用使用 pod 身份 Webhook 的服务帐户来假定运行 AWS SDK 操作所需的 AWS IAM 角色。具体步骤请参阅部署包含 AWS SDK 的 pod。
注意在本例中,使用包含 Python 的 AWS Boto3 SDK 的 pod。有关安装和使用 AWS Boto3 SDK 的更多信息,请参阅 AWS Boto3 文档。有关其他 AWS SDK 的详情,请参阅 AWS 文档中的 AWS SDK 和工具参考指南。
流程
验证 AWS 环境变量、卷挂载和 OIDC 令牌卷是否在部署的
awsboto3sdk
pod 描述中列出:oc describe pod awsboto3sdk
$ oc describe pod awsboto3sdk
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 列出 Pod 身份 webhook 注入 pod 的
AWS_ROLE_ARN
环境变量。变量包含要被服务帐户假定的 AWS IAM 角色的 ARN。 - 2
- 列出由 pod 身份 webhook 注入 pod 的
AWS_WEB_IDENTITY_TOKEN_FILE
环境变量。变量包含 OIDC 令牌的完整路径,用于验证服务帐户身份。 - 3
- 列出由 pod 身份 Webhook 注入 pod 的卷挂载。
- 4
- 列出挂载到
/var/run/secrets/eks.amazonaws.com/serviceaccount
挂载点的aws-iam-token
卷。卷包含用于验证服务帐户的 OIDC 令牌,以假定 AWS IAM 角色。
在
awsboto3sdk
pod 中启动一个交互式终端:oc exec -ti awsboto3sdk -- /bin/sh
$ oc exec -ti awsboto3sdk -- /bin/sh
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 pod 的交互式终端中,验证
$AWS_ROLE_ARN
环境变量是否已由 pod 身份 webhook 放入 pod 中:echo $AWS_ROLE_ARN
$ echo $AWS_ROLE_ARN
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 输出必须为 AWS IAM 角色指定 ARN,该角色具有运行 AWS SDK 操作所需的权限。
在 pod 的交互式终端中,验证
$AWS_WEB_IDENTITY_TOKEN_FILE
环境变量是否已由 pod 身份 webhook 放入 pod 中:echo $AWS_WEB_IDENTITY_TOKEN_FILE
$ echo $AWS_WEB_IDENTITY_TOKEN_FILE
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
/var/run/secrets/eks.amazonaws.com/serviceaccount/token
/var/run/secrets/eks.amazonaws.com/serviceaccount/token
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
- 输出必须指定 pod 中到服务帐户的 OIDC 令牌的完整路径。
在 pod 的交互式终端中,验证包含 OIDC 令牌文件的
aws-iam-token
卷挂载是否由 pod 身份 Webhook 挂载:mount | grep -is 'eks.amazonaws.com'
$ mount | grep -is 'eks.amazonaws.com'
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)
tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 pod 的交互式终端中,验证
/var/run/secrets/eks.amazonaws.com/serviceaccount/
挂载点上是否存在名为token
的 OIDC 令牌文件:ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token
$ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
/var/run/secrets/eks.amazonaws.com/serviceaccount/token
/var/run/secrets/eks.amazonaws.com/serviceaccount/token
1 Copy to Clipboard Copied! Toggle word wrap Toggle overflow - 1
aws-iam-token
卷中的 OIDC 令牌文件,由 pod 身份 Webhook 挂载到 pod 中。令牌用于验证 AWS 中服务帐户的身份。
在 pod 中,验证 AWS Boto3 SDK 操作是否已成功运行:
在 pod 的交互式终端中,启动 Python 3 shell:
python3
$ python3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 Python 3 shell 中,导入
boto3
模块:>>> import boto3
>>> import boto3
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 创建包含 Boto
3 服务资源
的变量:>>> s3 = boto3.resource('s3')
>>> s3 = boto3.resource('s3')
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 在 AWS 帐户中打印所有 S3 存储桶的名称:
>>> for bucket in s3.buckets.all(): ... print(bucket.name) ...
>>> for bucket in s3.buckets.all(): ... print(bucket.name) ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 输出示例
<bucket_name> <bucket_name> <bucket_name> ...
<bucket_name> <bucket_name> <bucket_name> ...
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 如果服务帐户成功假定 AWS IAM 角色,输出会列出 AWS 帐户中提供的所有 S3 存储桶。