IAM ロールを引き受けるための Kubernetes サービスアカウントの設定
このトピックでは、AWS Identity and Access Management (IAM) ロールを引き受けるように Kubernetes サービスアカウントを設定する方法について説明します。これにより、サービスアカウントを使用するように設定されている任意のポッドが、ロールにアクセス権限がある任意の AWS のサービス にアクセスできるようになります。
前提条件
-
既存のクラスター。まだ所有していない場合は、Amazon EKS の使用開始 でのガイドのいずれかに従って作成します。
-
クラスター用の既存 IAM OpenID Connect (OIDC) プロバイダー。既に所有中かどうかの確認、または作成方法については「クラスター用の IAM OIDC プロバイダーの作成」を参照してください。
-
ご使用のデバイスまたは AWS CloudShell で、AWS CLI のバージョン
2.9.20
以降または1.27.63
以降がインストールおよび設定されていること。現在のバージョンは、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.24
である場合、kubectl
のバージョン1.23
、1.24
、または1.25
が使用できます。kubectl
をインストールまたはアップグレードする方法については、「kubectl のインストールまたは更新」を参照してください。 -
クラスター構成を含む既存の
kubectl
config
ファイル。kubectl
config
ファイルの作成については、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照してください。
IAM ロールを Kubernetes サービスアカウントに関連付けるには
-
既存の 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 サービスアカウントに関連付けます。
eksctl
または AWS CLI を使用できます。 -
ロールとサービスアカウントが正しく設定されていることを確認します。
-
IAM ロールの信頼ポリシーが正しく設定されていることを確認します。
aws iam get-role --role-name
my-role
--query Role.AssumeRolePolicyDocument出力例を次に示します。
{ "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::
111122223333
:oidc-provider/oidc.eks.region-code
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "oidc.eks.region-code
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:sub": "system:serviceaccount:default:my-service-account
", "oidc.eks.region-code
.amazonaws.com/id/EXAMPLED539D4633E53DE1B71EXAMPLE
:aud": "sts.amazonaws.com" } } } ] } -
前の手順でロールにアタッチしたポリシーが、そのロールにアタッチされていることを確認します。
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 v
1
出力例を次に示します。
{ "Version": "2012-10-17", "Statement": [
{ "Effect": "Allow", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::my-pod-secrets-bucket" }
] }前の手順でサンプルポリシーを作成した場合、出力は同じになります。別のポリシーを作成した場合、
サンプル
の内容は異なります。 -
Kubernetes サービスアカウントにロールが注釈されていることを確認します。
kubectl describe serviceaccount
my-service-account
-ndefault
出力例を次に示します。
Name:
my-service-account
Namespace:default
Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::111122223333
:role/my-role
Image pull secrets: <none> Mountable secrets:my-service-account
-token-qqjfl
Tokens:my-service-account
-token-qqjfl
...
-
-
(オプション) サービスアカウントの AWS Security Token Service エンドポイントの設定。AWS では、グローバルエンドポイントの代わりに地域の AWS STS エンドポイントを使用することを推奨しています。これにより、レイテンシーが減少し、組み込みの冗長性が提供され、セッショントークンの有効性が向上します。
次のステップ
ポッドが Kubernetes サービスアカウントを使用するように設定する