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
という名前のファイルを作成します。{ "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>:*"
を使用して、指定したプロジェクト内の任意のサービスアカウントにロールを制限できます。*
ワイルドカードを指定する場合は、前の行でStringEquals
をStringLike
に置き換える必要があります。
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
出力例
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>
です。サービスアカウントが 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
- オプション: カスタム属性または権限境界をロールに追加します。詳細は、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> 1
- 1
<project-name>
は、プロジェクト名に置き換えます。この名前は、AWS IAM ロールの設定で指定したプロジェクト名と一致する必要があります。
注記プロジェクトが作成されると、自動的にプロジェクトに切り替わります。
次のサービスアカウント設定で、
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>
です。
プロジェクトにサービスアカウントを作成します。
$ oc create -f test-service-account.yaml
出力例
serviceaccount/<service_account_name> created
サービスアカウントの詳細を確認します。
$ 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>
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 1 RUN dnf makecache && dnf install -y python3-pip && dnf clean all && pip3 install boto3>=1.15.0 2
ファイルを含むディレクトリーから、
awsboto3sdk
という名前のコンテナーイメージをビルドします。$ podman build -t awsboto3sdk .
Quay.io にログインします。
$ podman login quay.io
Quay.io へのアップロードの準備として、イメージにタグを付けます。
$ podman tag localhost/awsboto3sdk quay.io/<quay_username>/awsboto3sdk:latest 1
- 1
<quay_username>
を Quay.io ユーザー名に置き換えます。
タグ付けされたコンテナーイメージを Quay.io にプッシュします。
$ podman push quay.io/<quay_username>/awsboto3sdk:latest 1
- 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
という名前のファイルを作成します。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 ロールの検証 を参照してください。
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 を参照してください。
手順
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 トークンが含まれています。
awsboto3sdk
Pod でインタラクティブターミナルを起動します。$ oc exec -ti awsboto3sdk -- /bin/sh
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 を指定する必要があります。
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 トークンへのフルパスを指定する必要があります。
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)
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 を認証するために使用されます。
Pod で、AWS Boto3 SDK オペレーションが正常に実行されることを確認します。
Pod の対話型ターミナルで、Python 3 シェルを開始します。
$ python3
Python 3 シェルで、
boto3
モジュールをインポートします。>>> import boto3
Boto3
s3
サービスリソースを含む変数を作成します。>>> s3 = boto3.resource('s3')
AWS アカウントのすべての S3 バケットの名前を出力します。
>>> for bucket in s3.buckets.all(): ... print(bucket.name) ...
出力例
<bucket_name> <bucket_name> <bucket_name> ...
サービスアカウントが AWS IAM ロールを正常に引き受けた場合は、AWS アカウントで使用可能なすべての S3 バケットが出力に一覧表示されます。