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)。

流程

  1. 使用以下 JSON 配置创建一个名为 trust-policy.json 的文件:

    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Principal": {
                    "Federated": "<oidc_provider_arn>" 
    1
    
                },
                "Action": "sts:AssumeRoleWithWebIdentity",
                "Condition": {
                    "StringEquals": {
                        "<oidc_provider_name>:sub": "system:serviceaccount:<project_name>:<service_account_name>" 
    2
    
                    }
                }
            }
        ]
    }
    Copy to Clipboard Toggle word wrap
    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

  2. 创建一个 AWS IAM 角色,它使用 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 Toggle word wrap
    1
    <aws_iam_role_name > 替换为 IAM 角色的名称,如 pod-identity-test-role
    2
    引用您在上一步中创建的 trust-policy.json 文件。

    输出示例

    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 Toggle word wrap

    在输出中保留角色的 ARN。角色 ARN 的格式为 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>

  3. 附加服务帐户在 pod 中运行 AWS SDK 操作时所需的受管 AWS 权限:

    $ aws iam attach-role-policy \
        --policy-arn arn:aws:iam::aws:policy/ReadOnlyAccess \ 
    1
    
        --role-name <aws_iam_role_name> 
    2
    Copy to Clipboard Toggle word wrap
    1
    本例中的策略为 IAM 角色添加了只读访问权限。
    2
    将 < aws_iam_role_name > 替换为您在上一步中创建的 IAM 角色的名称。
  4. 可选:为角色添加自定义属性或权限边界。如需更多信息,请参阅 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)。

流程

  1. 在 Red Hat OpenShift Service on AWS 集群中,创建一个项目:

    $ oc new-project <project_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <project_name> 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
    注意

    您在创建项目时会自动切换到该项目。

  2. 使用以下服务帐户配置,创建一个名为 test-service-account.yaml 的文件:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      name: <service_account_name> 
    1
    
      namespace: <project_name> 
    2
    
      annotations:
        eks.amazonaws.com/role-arn: "<aws_iam_role_arn>" 
    3
    Copy to Clipboard Toggle word wrap
    1
    <service_account_name > 替换为服务帐户的名称。名称必须与您在 AWS IAM 角色配置中指定的服务帐户名称匹配。
    2
    <project_name> 替换为项目的名称。名称必须与您在 AWS IAM 角色配置中指定的项目名称匹配。
    3
    指定 AWS IAM 角色的 ARN,服务帐户假定在 pod 中使用。将 <aws_iam_role_arn > 替换为您为服务帐户创建的 AWS IAM 角色的 ARN。角色 ARN 的格式为 arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name>
  3. 在项目中创建服务帐户:

    $ oc create -f test-service-account.yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    serviceaccount/<service_account_name> created
    Copy to Clipboard Toggle word wrap

  4. 查看服务帐户的详情:

    $ oc describe serviceaccount <service_account_name> 
    1
    Copy to Clipboard Toggle word wrap
    1
    <service_account_name > 替换为服务帐户的名称。

    输出示例

    Name:                <service_account_name> 
    1
    
    Namespace:           <project_name> 
    2
    
    Labels:              <none>
    Annotations:         eks.amazonaws.com/role-arn: <aws_iam_role_arn> 
    3
    
    Image pull secrets:  <service_account_name>-dockercfg-rnjkq
    Mountable secrets:   <service_account_name>-dockercfg-rnjkq
    Tokens:              <service_account_name>-token-4gbjp
    Events:              <none>
    Copy to Clipboard Toggle word wrap

    1
    指定服务帐户的名称。
    2
    指定包含服务帐户的项目。
    3
    列出服务帐户假定的 AWS IAM 角色的 ARN 注解。

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 用户帐户。

流程

  1. 将以下配置添加到名为 Containerfile 的文件中:

    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 Toggle word wrap
    1
    指定 Red Hat Universal Base Image 版本 9。
    2
    使用 pip 软件包管理系统安装 AWS Boto3 SDK。在本例中,安装了 AWS Boto3 SDK 版本 1.15.0 或更高版本。
  2. 在包含文件的目录中,构建名为 awsboto3sdk 的容器镜像:

    $ podman build -t awsboto3sdk .
    Copy to Clipboard Toggle word wrap
  3. 登录到 Quay.io:

    $ podman login quay.io
    Copy to Clipboard Toggle word wrap
  4. 标记镜像以准备上传到 Quay.io:

    $ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 
    1
    Copy to Clipboard Toggle word wrap
    1
    <quay_username& gt; 替换为您的 Quay.io 用户名。
  5. 将标记的容器镜像推送到 Quay.io:

    $ podman push quay.io/<quay_username>/awsboto3sdk:latest 
    1
    Copy to Clipboard Toggle word wrap
    1
    <quay_username& gt; 替换为您的 Quay.io 用户名。
  6. 创建包含镜像 public 的 Quay.io 存储库。这会发布镜像,以便它可用于在 Red Hat OpenShift Service on AWS 集群上部署 pod:

    1. https://quay.io/ 上,导航到包含该镜像的存储库的 Repository Settings 页面。
    2. 单击 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 和工具参考指南

流程

  1. 使用以下 pod 配置创建一个名为 awsboto3sdk-pod.yaml 的文件:

    apiVersion: v1
    kind: Pod
    metadata:
      namespace: <project_name> 
    1
    
      name: awsboto3sdk 
    2
    
    spec:
      securityContext:
        runAsNonRoot: true
        seccompProfile:
          type: RuntimeDefault
      serviceAccountName: <service_account_name> 
    3
    
      containers:
      - name: awsboto3sdk
        image: quay.io/<quay_username>/awsboto3sdk:latest 
    4
    
        command:
        - /bin/bash
        - "-c"
        - "sleep 100000" 
    5
    
        securityContext:
          allowPrivilegeEscalation: false
          capabilities:
            drop: [ALL]
      terminationGracePeriodSeconds: 0
      restartPolicy: Never
    Copy to Clipboard Toggle word wrap
    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 角色
  2. 部署 awsboto3sdk pod:

    $ oc create -f awsboto3sdk-pod.yaml
    Copy to Clipboard Toggle word wrap

    输出示例

    pod/awsboto3sdk created
    Copy to Clipboard Toggle word wrap

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 和工具参考指南

流程

  1. 验证 AWS 环境变量、卷挂载和 OIDC 令牌卷是否在部署的 awsboto3sdk pod 描述中列出:

    $ oc describe pod awsboto3sdk
    Copy to Clipboard Toggle word wrap

    输出示例

    Name:         awsboto3sdk
    Namespace:    <project_name>
    ...
    Containers:
      awsboto3sdk:
        ...
        Environment:
          AWS_ROLE_ARN:                 <aws_iam_role_arn> 
    1
    
          AWS_WEB_IDENTITY_TOKEN_FILE:  /var/run/secrets/eks.amazonaws.com/serviceaccount/token 
    2
    
        Mounts:
          /var/run/secrets/eks.amazonaws.com/serviceaccount from aws-iam-token (ro) 
    3
    
    ...
    Volumes:
      aws-iam-token: 
    4
    
        Type:                    Projected (a volume that contains injected data from multiple sources)
        TokenExpirationSeconds:  86400
    ...
    Copy to Clipboard Toggle word wrap

    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 角色。
  2. awsboto3sdk pod 中启动一个交互式终端:

    $ oc exec -ti awsboto3sdk -- /bin/sh
    Copy to Clipboard Toggle word wrap
  3. 在 pod 的交互式终端中,验证 $AWS_ROLE_ARN 环境变量是否已由 pod 身份 webhook 放入 pod 中:

    $ echo $AWS_ROLE_ARN
    Copy to Clipboard Toggle word wrap

    输出示例

    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 
    1
    Copy to Clipboard Toggle word wrap

    1
    输出必须为 AWS IAM 角色指定 ARN,该角色具有运行 AWS SDK 操作所需的权限。
  4. 在 pod 的交互式终端中,验证 $AWS_WEB_IDENTITY_TOKEN_FILE 环境变量是否已由 pod 身份 webhook 放入 pod 中:

    $ echo $AWS_WEB_IDENTITY_TOKEN_FILE
    Copy to Clipboard Toggle word wrap

    输出示例

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 
    1
    Copy to Clipboard Toggle word wrap

    1
    输出必须指定 pod 中到服务帐户的 OIDC 令牌的完整路径。
  5. 在 pod 的交互式终端中,验证包含 OIDC 令牌文件的 aws-iam-token 卷挂载是否由 pod 身份 Webhook 挂载:

    $ mount | grep -is 'eks.amazonaws.com'
    Copy to Clipboard Toggle word wrap

    输出示例

    tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)
    Copy to Clipboard Toggle word wrap

  6. 在 pod 的交互式终端中,验证 /var/run/secrets/eks.amazonaws.com/serviceaccount/ 挂载点上是否存在名为 token 的 OIDC 令牌文件:

    $ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token
    Copy to Clipboard Toggle word wrap

    输出示例

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 
    1
    Copy to Clipboard Toggle word wrap

    1
    aws-iam-token 卷中的 OIDC 令牌文件,由 pod 身份 Webhook 挂载到 pod 中。令牌用于验证 AWS 中服务帐户的身份。
  7. 在 pod 中,验证 AWS Boto3 SDK 操作是否已成功运行:

    1. 在 pod 的交互式终端中,启动 Python 3 shell:

      $ python3
      Copy to Clipboard Toggle word wrap
    2. 在 Python 3 shell 中,导入 boto3 模块:

      >>> import boto3
      Copy to Clipboard Toggle word wrap
    3. 创建包含 Boto 3 服务资源 的变量:

      >>> s3 = boto3.resource('s3')
      Copy to Clipboard Toggle word wrap
    4. 在 AWS 帐户中打印所有 S3 存储桶的名称:

      >>> for bucket in s3.buckets.all():
      ...     print(bucket.name)
      ...
      Copy to Clipboard Toggle word wrap

      输出示例

      <bucket_name>
      <bucket_name>
      <bucket_name>
      ...
      Copy to Clipboard Toggle word wrap

      如果服务帐户成功假定 AWS IAM 角色,输出会列出 AWS 帐户中提供的所有 S3 存储桶。

返回顶部
Red Hat logoGithubredditYoutubeTwitter

学习

尝试、购买和销售

社区

关于红帽文档

通过我们的产品和服务,以及可以信赖的内容,帮助红帽用户创新并实现他们的目标。 了解我们当前的更新.

让开源更具包容性

红帽致力于替换我们的代码、文档和 Web 属性中存在问题的语言。欲了解更多详情,请参阅红帽博客.

關於紅帽

我们提供强化的解决方案,使企业能够更轻松地跨平台和环境(从核心数据中心到网络边缘)工作。

Theme

© 2025 Red Hat