IAM ロールを Kubernetes サービスアカウントに割り当てる
このトピックでは、EKS Pod Identity に関連付けられている AWS Identity and Access Management (IAM) ロール を引き受けるように Kubernetes サービスアカウントを設定する方法について説明します。任意の Pods はサービスアカウントを使用するように設定すると、ロールにアクセス許可がある AWS サービスすべてにアクセスできます。
EKS Pod Identity の関連付けを作成するには、1 つの手順しかありません。AWS Management Console、AWS CLI、AWS SDK、AWS CCloudFormation などのツールを使用して EKS で関連付けを作成します。クラスター内の関連付けに関するデータやメタデータはどの Kubernetes オブジェクトにもなく、サービスアカウントに注釈を追加することもありません。
-
既存のクラスター。まだ所有していない場合は、Amazon EKS の使用を開始する でのガイドのいずれかに従って作成できます。
-
関連付けを作成している IAM プリンシパルには
iam:PassRole
が必要です。 -
ご使用のデバイスまたは AWS CloCloudShell に最新バージョンの AWS CLI がインストールおよび設定されていること。現在のバージョンは、
aws --version | cut -d / -f2 | cut -d ' ' -f1
で確認できます。macOS のyum
、apt-get
、または Homebrew などのパッケージマネージャーは、AWS CLI の最新バージョンより数バージョン遅れることがあります。最新バージョンをインストールするには、「AWS コマンドラインインターフェイスユーザーガイド」の「インストール」および「aws configure を使用したクイック設定」を参照してください。AWS CloudShell にインストールされている AWS CLI バージョンは、最新バージョンより数バージョン遅れている可能性もあります。更新するには、「AWS CloudShell ユーザーガイド」の「ホームディレクトリへの AWS CLI のインストール」を参照してください。 -
デバイスまたは AWS CloudShell に、
kubectl
コマンドラインツールがインストールされていること。バージョンは、ご使用のクラスターの Kubernetes バージョンと同じか、1 つ前のマイナーバージョン以前、あるいはそれより新しいバージョンが使用できます。例えば、クラスターのバージョンが1.29
である場合、kubectl
のバージョン1.28
、1.29
、または1.30
が使用できます。kubectl
をインストールまたはアップグレードする方法については、「kubectl と eksctl のセットアップ」を参照してください。 -
クラスター構成を含む既存の
kubectl
config
ファイル。kubectl
config
ファイルの作成については、「kubeconfig ファイルを作成して kubectl を EKS クラスターに接続する」を参照してください。
Pod Identity の関連付けを作成する (AWS コンソール)
-
Amazon EKS コンソール
を開きます。 -
左のナビゲーションペインで、[クラスター] を選択し、次にアドオンを設定するEKS Pod Identity エージェントを選択します。
-
[アクセス] タブを選択します。
-
[Pod Identity の関連付け] で [作成] を選択します。
-
[IAM ロール] には、ワークロードに付与する権限を持つ IAM ロールを選択します。
注記
リストには、EKS Pod Identity による使用を許可する以下の信頼ポリシーを持つロールのみが含まれています。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
sts:AssumeRole
- EKS Pod Identity は一時的な認証情報をポッドに渡す前に、AssumeRole
を使用して IAM ロールを引き継ぎます。sts:TagSession
- EKS Pod Identity は、AWS STS へのリクエストにセッションタグを含めるためにTagSession
を使用します。これらのタグを信頼ポリシーの条件キーで使用して、このロールを使用できるサービスアカウント、名前空間、およびクラスターを制限できます。
Amazon EKS 条件キーのリストについては、「サービス認可リファレンス」の「Amazon Elastic Kubernetes Service によって定義された条件」を参照してください。条件キーを使用できるアクションとリソースについては、「Amazon Elastic Kubernetes Service で定義されるアクション」を参照してください。
-
[Kubernetes 名前空間] には、サービスアカウントとワークロードを含む Kubernetes 名前空間を選択します。オプションで、クラスターに存在しない名前で名前空間名で指定できます。
-
[Kubernetes サービスアカウント] で、使用する Kubernetes サービスアカウントを選択します。Kubernetes ワークロードのマニフェストには、このサービスアカウントを指定する必要があります。オプションで、クラスターに存在しないサービスアカウントを名前で指定できます。
-
(オプション) [タグ] で [タグを追加] を選択し、キーと値のペアにメタデータを追加します。これらのタグは関連付けに適用され、IAM ポリシーで使用できます。
このステップでは、複数のリージョンを追加できます。
-
[Create] (作成) を選択します。
Pod Identity の関連付けを作成する (AWS CLI)
-
既存の IAM ポリシーを IAM ロールに関連付ける場合は、次のステップにスキップします。
IAM ポリシーを作成します。ポリシーを自作することも、必要となるアクセス権限のいくつかが既に付与されている AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズすることもできます。詳細については、『IAM ユーザーガイド』の「IAM ポリシーの作成」を参照してください。
-
Pods にアクセスさせる AWS サービスの権限を含むファイルを作成します。すべての AWS サービスに対するアクションの全リストについては、「サービス認可リファレンス」を参照してください。
次のコマンドを実行して、Amazon S3 バケットへの読み取り専用アクセスを許可するサンプルポリシーファイルを作成できます。必要に応じて、このバケットに設定情報またはブートストラップスクリプトを格納すると、Pod 内のコンテナがバケットからファイルを読み取り、アプリケーションにロードできます。このサンプルポリシーを作成する場合は、次のコンテンツをデバイスにコピーします。
my-pod-secrets-bucket
をバケット名に置き換え、コマンドを実行します。cat >my-policy.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] } EOF
-
IAM ポリシーを作成します。
aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
-
-
IAM ロールを作成し、Kubernetes サービスアカウントに関連付けます。
-
IAM ロールを引き受ける既存の Kubernetes サービスアカウントがある場合は、この手順を省略できます。
Kubernetes サービスアカウントを作成します。次のコンテンツをデバイスにコピーします。
my-service-account
を目的の名前に置き換え、必要に応じてdefault
を別の名前空間に置き換えます。default
を変更する場合、名前空間は既に存在している必要があります。cat >my-service-account.yaml <<EOF apiVersion: v1 kind: ServiceAccount metadata: name: my-service-account namespace: default EOF kubectl apply -f my-service-account.yaml
以下のコマンドを実行します。
kubectl apply -f my-service-account.yaml
-
IAM ロール用の信頼ポリシーファイルを作成するには、次のコマンドを実行します。
cat >trust-relationship.json <<EOF { "Version": "2012-10-17", "Statement": [ { "Sid": "AllowEksAuthToAssumeRoleForPodIdentity", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] } EOF
-
ロールを作成します。
my-role
を IAM ロールの名前に置き換え、my-role-description
をロールの説明に置き換えます。aws iam create-role --role-name my-role --assume-role-policy-document file://trust-relationship.json --description "my-role-description"
-
IAM ポリシーをロールにアタッチします。
my-role
を IAM ロールの名前に置き換え、my-policy
を、作成した既存のポリシーの名前に置き換えます。aws iam attach-role-policy --role-name my-role --policy-arn=arn:aws:iam::111122223333:policy/my-policy
注記
サービスアカウントの IAM ロールとは異なり、EKS Pod Identity はサービスアカウントの注釈を使用しません。
-
次のコマンドを実行して、関連付けを作成します。
my-cluster
をクラスターの名前で置き換え、my-service-account
を目的の名前に置き換え、必要に応じてdefault
を別の名前空間に置き換えます。aws eks create-pod-identity-association --cluster-name my-cluster --role-arn arn:aws:iam::111122223333:role/my-role --namespace default --service-account my-service-account
出力例は次のとおりです。
{ "association": { "clusterName": "my-cluster", "namespace": "default", "serviceAccount": "my-service-account", "roleArn": "arn:aws:iam::111122223333:role/my-role", "associationArn": "arn:aws::111122223333:podidentityassociation/my-cluster/a-abcdefghijklmnop1", "associationId": "a-abcdefghijklmnop1", "tags": {}, "createdAt": 1700862734.922, "modifiedAt": 1700862734.922 } }
注記
名前空間とサービスアカウントは、クラスターには存在しない名前で指定できます。EKS Pod Identity の関連付けを機能させるには、名前空間、サービスアカウント、およびサービスアカウントを使用するワークロードを作成する必要があります。
-
設定の確認
-
IAM ロールの信頼ポリシーが正しく設定されていることを確認します。
aws iam get-role --role-name my-role --query Role.AssumeRolePolicyDocument
出力例は次のとおりです。
{ "Version": "2012-10-17", "Statement": [ { "Sid": "Allow EKS Auth service to assume this role for Pod Identities", "Effect": "Allow", "Principal": { "Service": "pods.eks.amazonaws.com" }, "Action": [ "sts:AssumeRole", "sts:TagSession" ] } ] }
-
前の手順でロールにアタッチしたポリシーが、そのロールにアタッチされていることを確認します。
aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text
出力例は次のとおりです。
arn:aws:iam::111122223333:policy/my-policy
-
使用するポリシーの Amazon リソースネーム (ARN) を保存する変数を設定します。
my-policy
を、アクセス許可を確認するポリシーの名前に置き換えます。export policy_arn=arn:aws:iam::111122223333:policy/my-policy
-
ポリシーのデフォルトバージョンを確認します。
aws iam get-policy --policy-arn $policy_arn
出力例は次のとおりです。
{ "Policy": { "PolicyName": "my-policy", "PolicyId": "EXAMPLEBIOWGLDEXAMPLE", "Arn": "arn:aws:iam::111122223333:policy/my-policy", "Path": "/", "DefaultVersionId": "v1", [...] } }
-
ポリシーの内容を表示して、Pod で必要な権限がすべて含まれていることを確認します。必要であれば、次のコマンドの
1
を、前の出力で返されたバージョンに置き換えます。aws iam get-policy-version --policy-arn $policy_arn --version-id v1
出力例は次のとおりです。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" } ] }
前の手順でサンプルポリシーを作成した場合、出力は同じになります。別のポリシーを作成した場合、
サンプル
の内容は異なります。
次のステップ
サービスアカウントを使用して AWS サービスにアクセスするように pods を設定する