9.3. 独自の Pod で AWS IAM ロールを引き受ける


このセクションの手順に従って、ユーザー定義のプロジェクトにデプロイされた Pod でサービスアカウントが AWS Identity and Access Management (IAM) ロールを引き受けられるようにします。

AWS IAM ロール、サービスアカウント、AWS SDK を含むコンテナーイメージ、イメージを使用してデプロイされた Pod など、必要なリソースを作成できます。この例では、AWS Boto3 SDK for Python が使用されています。また、Pod ID Webhook が AWS 環境変数、ボリュームマウント、およびトークンボリュームを Pod に変更することを確認することもできます。さらに、サービスアカウントが Pod で AWS IAM ロールを引き受け、AWS SDK オペレーションを正常に実行できることを確認できます。

9.3.1. サービスアカウントの AWS IAM ロールの設定

Red Hat OpenShift Service on AWS クラスターのサービスアカウントが引き受ける AWS Identity and Access Management (IAM) ロールを作成します。サービスアカウントが Pod で AWS SDK オペレーションを実行するために必要なアクセス許可をアタッチします。

前提条件

  • AWS アカウントに IAM ロールをインストールして設定するために必要なアクセス許可がある。
  • AWS Security Token Service (STS) を使用する Red Hat OpenShift Service on AWS クラスターにアクセスできる。管理者レベルのユーザー権限は必要ありません。
  • STS クラスターを使用する Red Hat OpenShift Service on AWS でサービスアカウント発行者として設定されている OpenID Connect (OIDC) プロバイダーの Amazon Resource Name (ARN) がある。

    注記

    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
                    }
                }
            }
        ]
    }
    1
    <oidc_provider_arn> を OIDC プロバイダーの ARN に置き換えます (例: arn:aws:iam::<aws_account_id>:oidc-provider/rh-oidc.s3.us-east-1.amazonaws.com/1v3r0n44npxu4g58so46aeohduomfres)。
    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>:*" を使用して、指定したプロジェクト内の任意のサービスアカウントにロールを制限できます。* ワイルドカードを指定する場合は、前の行で StringEqualsStringLike に置き換える必要があります。

  2. trust-policy.json ファイルで定義されている信頼ポリシーを使用する AWS IAM ロールを作成します。

    $ aws iam create-role \
        --role-name <aws_iam_role_name> \ 1
        --assume-role-policy-document file://trust-policy.json 2
    1
    <aws_iam_role_name>pod-identity-test-role などの IAM ロールの名前に置き換えます。
    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>

    出力でロールの 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
    1
    この例のポリシーは、IAM ロールに読み取り専用アクセス許可を追加します。
    2
    <aws_iam_role_name> を、前のステップで作成した IAM ロールの名前に置き換えます。
  4. オプション: カスタム属性または権限境界をロールに追加します。詳細は、AWS ドキュメントの AWS サービスにアクセス許可を委任するロールの作成 を参照してください。

9.3.2. プロジェクトでサービスアカウントを作成する

ユーザー定義プロジェクトにサービスアカウントを追加します。サービスアカウントに引き受けさせる AWS Identity and Access Management (IAM) ロールの Amazon Resource Name (ARN) を参照する eks.amazonaws.com/role-arn アノテーションをサービスアカウント設定に含めます。

前提条件

  • サービスアカウントの AWS IAM ロールを作成している。詳細は、サービスアカウントの AWS IAM ロールの設定 を参照してください。
  • AWS Security Token Service (STS) クラスターを使用して Red Hat OpenShift Service on AWS にアクセスできます。管理者レベルのユーザー権限は必要ありません。
  • OpenShift CLI (oc) がインストールされている。

手順

  1. Red Hat OpenShift Service on AWS クラスターで、プロジェクトを作成します。

    $ oc new-project <project_name> 1
    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
    1
    <service_account_name> をサービスアカウントの名前に置き換えます。この名前は、AWS IAM ロールの設定で指定したサービスアカウント名と一致させる必要があります。
    2
    <project-name> は、プロジェクト名に置き換えます。この名前は、AWS IAM ロールの設定で指定したプロジェクト名と一致する必要があります。
    3
    サービスアカウントが Pod 内で使用するために想定する AWS IAM ロールの ARN を指定します。<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

    出力例

    serviceaccount/<service_account_name> created

  4. サービスアカウントの詳細を確認します。

    $ oc describe serviceaccount <service_account_name> 1
    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>

    1
    サービスアカウントの名前を指定します。
    2
    サービスアカウントを含むプロジェクトを指定します。
    3
    サービスアカウントが引き受ける AWS IAM ロールの ARN のアノテーションを一覧表示します。

9.3.3. サンプル AWS SDK コンテナーイメージの作成

この手順のステップでは、AWS SDK を含むコンテナーイメージを作成する方法の例を示します。

例の手順では、Podman を使用してコンテナーイメージを作成し、Quay.io を使用してイメージをホストします。Quay.io の詳細は、Quay.io の使用を開始する を参照してください。コンテナーイメージを使用して、AWS SDK オペレーションを実行できる Pod をデプロイできます。

注記

この手順例では、AWS Boto3 SDK for Python がコンテナーイメージにインストールされます。AWS Boto3 SDK のインストールと使用の詳細は、AWS Boto3 ドキュメント を参照してください。その他の AWS SDK の詳細は、AWS ドキュメントの AWS SDKs and Tools Reference Guide を参照してください。

前提条件

  • インストールホストに 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
    1
    Red Hat Universal Base Image バージョン 9 を指定します。
    2
    pip パッケージ管理システムを使用して AWS Boto3 SDK をインストールします。この例では、AWS Boto3 SDK バージョン 1.15.0 以降がインストールされています。
  2. ファイルを含むディレクトリーから、awsboto3sdk という名前のコンテナーイメージをビルドします。

    $ podman build -t awsboto3sdk .
  3. Quay.io にログインします。

    $ podman login quay.io
  4. Quay.io へのアップロードの準備として、イメージにタグを付けます。

    $ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    <quay_username> を Quay.io ユーザー名に置き換えます。
  5. タグ付けされたコンテナーイメージを Quay.io にプッシュします。

    $ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
    1
    <quay_username> を Quay.io ユーザー名に置き換えます。
  6. イメージを含む 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 ID Webhook が AWS 環境変数、ボリュームマウント、およびトークンボリュームを Pod に挿入します。Pod のミューテーションにより、サービスアカウントは Pod で AWS IAM ロールを自動的に引き受けることができます。

前提条件

  • サービスアカウントの AWS Identity and Access Management (IAM) ロールを作成している。詳細は、サービスアカウントの AWS IAM ロールの設定 を参照してください。
  • AWS Security Token Service (STS) を使用する Red Hat OpenShift Service on AWS クラスターにアクセスできる。管理者レベルのユーザー権限は必要ありません。
  • OpenShift CLI (oc) がインストールされている。
  • サービスアカウントが引き受ける IAM ロールの Amazon Resource Name (ARN) を参照する eks.amazonaws.com/role-arn アノテーションを含むサービスアカウントをプロジェクトに作成している。
  • AWS SDK を含むコンテナーイメージがあり、そのイメージをクラスターで使用できる。詳細な手順は、サンプルの AWS SDK コンテナーイメージの作成 を参照してください。

    注記

    この手順例では、AWS Boto3 SDK for Python が使用されています。AWS Boto3 SDK のインストールと使用の詳細は、AWS Boto3 ドキュメント を参照してください。その他の AWS SDK の詳細は、AWS ドキュメントの AWS SDKs and Tools Reference Guide を参照してください。

手順

  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
    1
    <project-name> は、プロジェクト名に置き換えます。この名前は、AWS IAM ロールの設定で指定したプロジェクト名と一致する必要があります。
    2
    Pod の名前を指定します。
    3
    <service_account_name> を、AWS IAM ロールを引き受けるように設定されたサービスアカウントの名前に置き換えます。この名前は、AWS IAM ロールの設定で指定したサービスアカウント名と一致させる必要があります。
    4
    awsboto3sdk コンテナーイメージの場所を指定します。<quay_username> を Quay.io ユーザー名に置き換えます。
    5
    この Pod 設定の例では、この行は Pod を 100000 秒間実行し続け、Pod で直接検証テストを有効にします。詳細な検証手順は、Pod で想定される IAM ロールの検証 を参照してください。
  2. awsboto3sdk Pod をデプロイします。

    $ oc create -f awsboto3sdk-pod.yaml

    出力例

    pod/awsboto3sdk created

9.3.5. Pod で想定される IAM ロールを確認する

プロジェクトに awsboto3sdk Pod をデプロイした後、Pod ID Webhook が Pod を変更したことを確認します。必要な AWS 環境変数、ボリュームマウント、および OIDC トークンボリュームが Pod 内に存在することを確認します。

Pod で AWS SDK オペレーションを実行するときに、サービスアカウントが AWS アカウントの AWS Identity and Access Management (IAM) ロールを引き受けていることを確認することもできます。

前提条件

  • サービスアカウントの AWS IAM ロールを作成している。詳細は、サービスアカウントの AWS IAM ロールの設定 を参照してください。
  • AWS Security Token Service (STS) を使用する Red Hat OpenShift Service on AWS クラスターにアクセスできる。管理者レベルのユーザー権限は必要ありません。
  • OpenShift CLI (oc) がインストールされている。
  • サービスアカウントが引き受ける IAM ロールの Amazon Resource Name (ARN) を参照する eks.amazonaws.com/role-arn アノテーションを含むサービスアカウントをプロジェクトに作成している。
  • AWS SDK を含むユーザー定義プロジェクトに Pod をデプロイしている。Pod は、Pod ID Webhook を使用するサービスアカウントを参照して、AWS SDK オペレーションの実行に必要な AWS IAM ロールを引き受けます。詳細な手順は、AWS SDK を含む Pod のデプロイ を参照してください。

    注記

    この手順例では、AWS Boto3 SDK for Python を含む Pod が使用されます。AWS Boto3 SDK のインストールと使用の詳細は、AWS Boto3 ドキュメント を参照してください。その他の AWS SDK の詳細は、AWS ドキュメントの AWS SDKs and Tools Reference Guide を参照してください。

手順

  1. AWS 環境変数、ボリュームマウント、および OIDC トークンボリュームが、デプロイされた awsboto3sdk Pod の説明にリストされていることを確認します。

    $ oc describe pod awsboto3sdk

    出力例

    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
    ...

    1
    Pod ID Webhook によって Pod に挿入された AWS_ROLE_ARN 環境変数を一覧表示します。この変数には、サービスアカウントが引き受ける AWS IAM ロールの ARN が含まれます。
    2
    Pod ID Webhook によって Pod に挿入された AWS_WEB_IDENTITY_TOKEN_FILE 環境変数を一覧表示します。この変数には、サービスアカウントの ID を確認するために使用される OIDC トークンの完全なパスが含まれています。
    3
    Pod ID Webhook によって Pod に挿入されたボリュームマウントを一覧表示します。
    4
    /var/run/secrets/eks.amazonaws.com/serviceaccount マウントポイントにマウントされている aws-iam-token ボリュームを一覧表示します。ボリュームには、AWS IAM ロールを引き受けるためにサービスアカウントを認証するために使用される OIDC トークンが含まれています。
  2. awsboto3sdk Pod でインタラクティブターミナルを起動します。

    $ oc exec -ti awsboto3sdk -- /bin/sh
  3. Pod のインタラクティブターミナルで、Pod ID Webhook により $AWS_ROLE_ARN 環境変数が Pod に変更されたことを確認します。

    $ echo $AWS_ROLE_ARN

    出力例

    arn:aws:iam::<aws_account_id>:role/<aws_iam_role_name> 1

    1
    出力では、AWS SDK オペレーションを実行するために必要なアクセス許可を持つ AWS IAM ロールの ARN を指定する必要があります。
  4. Pod のインタラクティブターミナルで、Pod ID Webhook によって $AWS_WEB_IDENTITY_TOKEN_FILE 環境変数が Pod に変更されたことを確認します。

    $ echo $AWS_WEB_IDENTITY_TOKEN_FILE

    出力例

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    出力では、Pod 内のサービスアカウントの OIDC トークンへのフルパスを指定する必要があります。
  5. Pod のインタラクティブターミナルで、OIDC トークンファイルを含む aws-iam-token ボリュームマウントが Pod ID Webhook によってマウントされたことを確認します。

    $ mount | grep -is 'eks.amazonaws.com'

    出力例

    tmpfs on /run/secrets/eks.amazonaws.com/serviceaccount type tmpfs (ro,relatime,seclabel,size=13376888k)

  6. Pod のインタラクティブターミナルで、token という名前の OIDC トークンファイルが /var/run/secrets/eks.amazonaws.com/serviceaccount/ マウントポイントに存在することを確認します。

    $ ls /var/run/secrets/eks.amazonaws.com/serviceaccount/token

    出力例

    /var/run/secrets/eks.amazonaws.com/serviceaccount/token 1

    1
    Pod ID Webhook によって Pod にマウントされた aws-iam-token ボリューム内の OIDC トークンファイル。トークンは、AWS でサービスアカウントの ID を認証するために使用されます。
  7. Pod で、AWS Boto3 SDK オペレーションが正常に実行されることを確認します。

    1. Pod の対話型ターミナルで、Python 3 シェルを開始します。

      $ python3
    2. Python 3 シェルで、boto3 モジュールをインポートします。

      >>> import boto3
    3. Boto3 s3 サービスリソースを含む変数を作成します。

      >>> s3 = boto3.resource('s3')
    4. AWS アカウントのすべての S3 バケットの名前を出力します。

      >>> for bucket in s3.buckets.all():
      ...     print(bucket.name)
      ...

      出力例

      <bucket_name>
      <bucket_name>
      <bucket_name>
      ...

      サービスアカウントが AWS IAM ロールを正常に引き受けた場合は、AWS アカウントで使用可能なすべての S3 バケットが出力に一覧表示されます。

Red Hat logoGithubRedditYoutubeTwitter

詳細情報

試用、購入および販売

コミュニティー

Red Hat ドキュメントについて

Red Hat をお使いのお客様が、信頼できるコンテンツが含まれている製品やサービスを活用することで、イノベーションを行い、目標を達成できるようにします。

多様性を受け入れるオープンソースの強化

Red Hat では、コード、ドキュメント、Web プロパティーにおける配慮に欠ける用語の置き換えに取り組んでいます。このような変更は、段階的に実施される予定です。詳細情報: Red Hat ブログ.

会社概要

Red Hat は、企業がコアとなるデータセンターからネットワークエッジに至るまで、各種プラットフォームや環境全体で作業を簡素化できるように、強化されたソリューションを提供しています。

© 2024 Red Hat, Inc.