このページの改善にご協力ください
本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[GitHub でこのページの編集] を選択します。皆さまにご協力いただくことで、あらゆる人々に使いやすいユーザーガイドになります。
IAM ロールを EKS Pod Identity と共に引き受けるための Kubernetes サービスアカウントを設定する
このトピックでは、AWS Identity and Access Management (IAM) ロール を EKS Pod Identity と共に引き受けるように Kubernetes サービスアカウントを設定する方法について説明します。任意の Pods はサービスアカウントを使用するように設定すると、ロールにアクセス許可がある AWS のサービス すべてにアクセスできます。
EKS Pod Identity の関連付けを作成するには、1 つの手順しかありません。AWS Management Console、AWS CLI、AWS SDK、AWS CloudFormation などのツールを使用して EKS で関連付けを作成します。クラスター内の関連付けに関するデータやメタデータはどの Kubernetes オブジェクトにもなく、サービスアカウントに注釈を追加することもありません。
前提条件
-
既存のクラスター。まだ所有していない場合は、Amazon EKS の使用開始 でのガイドのいずれかに従って作成します。
-
関連付けを作成している IAM プリンシパルには iam:PassRole
が必要です。
-
ご使用のデバイスまたは で、 のバージョン AWS CLI 以降または AWS CloudShell 以降がインストールおよび設定されていること。現在のバージョンは、aws --version | cut -d / -f2
| cut -d ' ' -f1
で確認できます。macOS の yum
、apt-get
、または Homebrew などのパッケージマネージャは、AWS CLI の最新バージョンより数バージョン遅れることがあります。最新バージョンをインストールするには、「AWS Command Line Interface ユーザーガイド」の「AWS CLI のインストール、更新、およびアンインストール」と「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 のインストールまたは更新」を参照してください。
-
クラスター構成を含む既存の kubectl
config
ファイル。kubectl
config
ファイルの作成については、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照してください。
EKS Pod Identity の関連付けの作成
- AWS Management Console
-
Amazon EKS コンソール (https://console.aws.amazon.com/eks/home#/clusters) を開きます。
-
左のナビゲーションペインで、[クラスター] を選択し、次にアドオンを設定する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"
]
}
]
}
-
[Kubernetes 名前空間] には、サービスアカウントとワークロードを含む Kubernetes 名前空間を選択します。オプションで、クラスターに存在しない名前空間を名前空間名で指定できます。
-
[Kubernetes サービスアカウント] で、使用する Kubernetes サービスアカウントを選択します。Kubernetes ワークロードのマニフェストには、このサービスアカウントを指定する必要があります。オプションで、クラスターに存在しないサービスアカウントを名前で指定できます。
-
(オプション) [タグ] で [タグを追加] を選択し、キーと値のペアにメタデータを追加します。これらのタグは関連付けに適用され、IAM ポリシーで使用できます。
このステップでは、複数のリージョンを追加できます。
-
[Create] (作成) を選択します。
- 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"
}
]
}
前の手順でサンプルポリシーを作成した場合、出力は同じになります。別のポリシーを作成した場合、サンプル
の内容は異なります。
次のステップ
Kubernetes サービスアカウントを使用するように Pods を設定するには