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) をインストールしている。
手順
- 次の 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)。ARN は、- rosa describe clusterCLI コマンドを使用して取得できます。
- 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に置き換える必要があります。
 
- trust-policy.jsonファイルで定義されている信頼ポリシーを使用する AWS IAM ロールを作成します。- 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. プロジェクトでサービスアカウントを作成する
					ユーザー定義プロジェクトにサービスアカウントを追加します。サービスアカウントに引き受けさせる 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) がインストールされている。
手順
- 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 - 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>です。
 
- プロジェクトにサービスアカウントを作成します。 - 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 をデプロイできます。
この手順例では、AWS Boto3 SDK for Python がコンテナーイメージにインストールされます。AWS Boto3 SDK のインストールと使用の詳細は、AWS Boto3 ドキュメント を参照してください。その他の AWS SDK の詳細は、AWS ドキュメントの AWS SDKs and Tools Reference Guide を参照してください。
前提条件
- インストールホストに 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>を 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>を Quay.io ユーザー名に置き換えます。
 
- イメージを含む 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 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 を参照してください。 
手順
- 次の 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>を Quay.io ユーザー名に置き換えます。
- 5
- この Pod 設定の例では、この行は Pod を 100000 秒間実行し続け、Pod で直接検証テストを有効にします。詳細な検証手順は、Pod で想定される IAM ロールの検証 を参照してください。
 
- awsboto3sdkPod をデプロイします。- 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 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 を参照してください。 
手順
- AWS 環境変数、ボリュームマウント、および OIDC トークンボリュームが、デプロイされた - awsboto3sdkPod の説明にリストされていることを確認します。- 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 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 トークンが含まれています。
 
- awsboto3sdkPod でインタラクティブターミナルを起動します。- oc exec -ti awsboto3sdk -- /bin/sh - $ oc exec -ti awsboto3sdk -- /bin/sh- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Pod のインタラクティブターミナルで、Pod ID Webhook により - $AWS_ROLE_ARN環境変数が 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 SDK オペレーションを実行するために必要なアクセス許可を持つ AWS IAM ロールの ARN を指定する必要があります。
 
- Pod のインタラクティブターミナルで、Pod ID Webhook によって - $AWS_WEB_IDENTITY_TOKEN_FILE環境変数が 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 ID 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 のインタラクティブターミナルで、 - tokenという名前の OIDC トークンファイルが- /var/run/secrets/eks.amazonaws.com/serviceaccount/マウントポイントに存在することを確認します。- 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
- Pod ID Webhook によって Pod にマウントされたaws-iam-tokenボリューム内の OIDC トークンファイル。トークンは、AWS でサービスアカウントの ID を認証するために使用されます。
 
- Pod で、AWS Boto3 SDK オペレーションが正常に実行されることを確認します。 - Pod の対話型ターミナルで、Python 3 シェルを開始します。 - python3 - $ python3- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Python 3 シェルで、 - boto3モジュールをインポートします。- >>> import boto3 - >>> import boto3- Copy to Clipboard Copied! - Toggle word wrap Toggle overflow 
- Boto3 - s3サービスリソースを含む変数を作成します。- >>> 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 バケットが出力に一覧表示されます。