IAM ロールを EKS Pod Identity と共に引き受けるための Kubernetes サービスアカウントを設定する - Amazon EKS

このページの改善にご協力ください

本ユーザーガイドの改善にご協力いただけませんか? このページの下部までスクロールし、[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 の yumapt-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.281.29、または 1.30 が使用できます。kubectl をインストールまたはアップグレードする方法については、「kubectl のインストールまたは更新」を参照してください。

  • クラスター構成を含む既存の kubectl config ファイル。kubectl config ファイルの作成については、「Amazon EKS クラスターの kubeconfig ファイルを作成または更新する」を参照してください。

EKS Pod Identity の関連付けの作成

AWS Management Console
  1. Amazon EKS コンソール (https://console.aws.amazon.com/eks/home#/clusters) を開きます。

  2. 左のナビゲーションペインで、[クラスター] を選択し、次にアドオンを設定するEKS Pod Identity エージェントを選択します。

  3. [アクセス] タブを選択します。

  4. [Pod Identity の関連付け][作成] を選択します。

  5. [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 を使用します。

    これらのタグを信頼ポリシーの condition keys で使用して、このロールを使用できるサービスアカウント、名前空間、およびクラスターを制限できます。

    Amazon EKS 条件キーのリストについては、「サービス認証リファレンス」の「Amazon Elastic Kubernetes Service によって定義された条件」を参照してください。条件キーを使用できるアクションとリソースについては、「Amazon Elastic Kubernetes Service で定義されるアクション」を参照してください。

  6. [Kubernetes 名前空間] には、サービスアカウントとワークロードを含む Kubernetes 名前空間を選択します。オプションで、クラスターに存在しない名前空間を名前空間名で指定できます。

  7. [Kubernetes サービスアカウント] で、使用する Kubernetes サービスアカウントを選択します。Kubernetes ワークロードのマニフェストには、このサービスアカウントを指定する必要があります。オプションで、クラスターに存在しないサービスアカウントを名前で指定できます。

  8. (オプション) [タグ][タグを追加] を選択し、キーと値のペアにメタデータを追加します。これらのタグは関連付けに適用され、IAM ポリシーで使用できます。

    このステップでは、複数のリージョンを追加できます。

  9. [Create] (作成) を選択します。

AWS CLI
  1. 既存の IAM ポリシーを IAM ロールに関連付ける場合は、次のステップにスキップします。

    IAM ポリシーを作成します。ポリシーを自作することも、必要となるアクセス権限のいくつかが既に付与されている AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズすることもできます。詳細については、『IAM ユーザーガイド』の「IAM ポリシーの作成」を参照してください。

    1. 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
    2. IAM ポリシーを作成します。

      aws iam create-policy --policy-name my-policy --policy-document file://my-policy.json
  2. IAM ロールを作成し、Kubernetes サービスアカウントに関連付けます。

    1. 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
    2. 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
    3. ロールを作成します。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"
    4. 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 はサービスアカウントの注釈を使用しません。

    5. 次のコマンドを実行して、関連付けを作成します。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 の関連付けを機能させるには、名前空間、サービスアカウント、およびサービスアカウントを使用するワークロードを作成する必要があります。

  3. ロールとサービスアカウントが正しく設定されていることを確認します。

    1. 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" ] } ] }
    2. 前の手順でロールにアタッチしたポリシーが、そのロールにアタッチされていることを確認します。

      aws iam list-attached-role-policies --role-name my-role --query AttachedPolicies[].PolicyArn --output text

      出力例は次のとおりです。

      arn:aws:iam::111122223333:policy/my-policy
    3. 使用するポリシーの Amazon リソースネーム (ARN) を保存する変数を設定します。my-policy を、アクセス許可を確認するポリシーの名前に置き換えます。

      export policy_arn=arn:aws:iam::111122223333:policy/my-policy
    4. ポリシーのデフォルトバージョンを確認します。

      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", [...] } }
    5. ポリシーの内容を表示して、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 を設定するには