サービスアカウントの IAM ロールとポリシーの作成 - Amazon EKS

サービスアカウントの IAM ロールとポリシーの作成

ユーザーは、ポッド内のコンテナに付与するアクセス許可を指定するために、IAM ポリシーを作成する必要があります。IAM の新しい許可ポリシーを作成する方法は複数あります。目的の操作のいくつかをすでに実行できる完全な AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズできます。詳細については、IAM ユーザーガイドの「IAM ポリシーの作成」を参照してください。

また、Kubernetes サービスアカウントで使用する IAM ロールを作成してから、そのサービスアカウントに関連付ける必要があります。信頼関係の範囲はクラスターとサービスアカウントに限定されるため、各クラスターとサービスアカウントの組み合わせには独自のロールが必要です。その後で、ポッドのコンテナに必要なアクセス許可を付与するロールに、特定の IAM ポリシーをアタッチできます。以下の手順でこれを行う方法について説明します。

IAM ポリシーを作成する

この手順では、アプリケーションに使用できる 2 つのポリシーの例を示します。

  • Amazon S3 バケットへの読み取り専用アクセスを許可するポリシー。このバケットに設定情報またはブートストラップスクリプトを保存できます。ポッドのコンテナは、バケットからファイルを読み取り、アプリケーションにロードできます。

  • AWS Marketplace から有料コンテナイメージを許可するポリシー。

  1. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  2. ナビゲーションパネルで、[Policies (ポリシー)] を選択し、[Create Policy (ポリシーを作成)] を選択します。

  3. [JSON] タブを選択します。

  4. Policy Document フィールドに、サービスアカウントに適用する次のいずれかのポリシーを貼り付けるか、独自のポリシードキュメントをフィールドに貼り付けます。ビジュアルエディタを使用して独自のポリシーを作成することもできます。

    以下の例では、Amazon S3 バケット (<my-pod-secrets-bucket>) にアクセス許可を付与します。ポリシードキュメントを特定のニーズに応じて変更できます。

    { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::<my-pod-secrets-bucket>/*" ] } ] }

    次の例では、 AWS Marketplace から有料コンテナイメージを使用するために必要なアクセス許可を付与します。

    { "Version": "2012-10-17", "Statement": [ { "Action": [ "aws-marketplace:RegisterUsage" ], "Effect": "Allow", "Resource": "*" } ] }
  5. [ポリシーの確認] を選択します。

  6. ポリシーの名前と説明を入力し、[ポリシーの作成]を選択します。

  7. 後でロールを作成するときに使用するため、ポリシーの Amazon リソースネーム (ARN) を記録します。

サービスアカウントの IAM ロールを作成する

サービスアカウントの IAM ロールを作成します。ロールを作成するには、eksctl、AWS Management Console、または AWS CLI を使用できます。

Prerequisites

  • 既存のクラスター。まだ所有していない場合は、Amazon EKS の使用開始 でのガイドのいずれかを参照しながら作成します。

  • AWS Management Console または AWS CLI を使用してロールを作成する場合は、クラスター用に IAM OIDC プロバイダーを用意しておく必要があります。詳細については、「クラスターの IAM OIDC プロバイダーを作成するには」を参照してください。

  • サービスアカウントがアクセスする必要がある AWS リソースのアクセス許可を含む、既存の IAM ポリシー。詳細については、「IAM ポリシーを作成する」を参照してください。

IAM ロールを作成するには、eksctl、AWS Management Console、または AWS CLI を使用できます。ロールの作成に使用するツールの名前が付いているタブを選択します。

eksctl

次のコマンドを使用して、サービスアカウントと IAM ロールを作成します。<example values> (<> を含む) を、自分の値に置き換えます。

eksctl create iamserviceaccount \ --name <service_account_name> \ --namespace <service_account_namespace> \ --cluster <cluster_name> \ --attach-policy-arn <IAM_policy_ARN> \ --approve \ --override-existing-serviceaccounts

AWS CloudFormation テンプレートがデプロイされます。このテンプレートは、IAM ロールを作成して IAM ポリシーをアタッチします。このロールは Kubernetes サービスアカウントに関連付けられています。クラスターが、既存の IAM OIDC プロバイダーを持っていない場合は、プロバイダーが作成されます。サービスアカウントが存在しない場合は、指定した名前空間に作成されます。サービスアカウントが存在していた場合は、eks.amazonaws.com/role-arn: arn:aws:iam::<your-account-id>:role/<iam-role-name-that-was-created> がアノテーションされます。

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

  2. クラスターの名前を選択し、[Configuration (設定)] タブを選択します。

  3. [Details (詳細)] セクションで、[OpenID Connect provider URL (OpenID Connect プロバイダーの URL)] の値を書き留めます。

  4. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  5. ナビゲーションペインで [Roles (ロール)]、[Create Role (ロールを作成)] の順に選択します。

  6. [Select type of trusted entity (信頼されたエンティティの種類を選択)] セクションで、[Web identity (ウェブ ID)] を選択します。

  7. [Choose a web identity provider (ウェブ ID プロバイダーを選択)] セクションで、次の操作を行います。

    1. [Identity provider (ID プロバイダー)] で、クラスターの URL を選択します。

    2. [Audience (対象者)] で [sts.amazonaws.com] を選択します。

  8. [Next: Permissions (次へ: アクセス許可)] を選択します。

  9. [Attach Policy (ポリシーのアタッチ)] セクションで、サービスアカウントに付与するアクセス許可が含まれた IAM ポリシーを選択します。

  10. [次へ: タグ] を選択します。

  11. [Add tags (optional) (タグの追加 (オプション))] 画面で、アカウントのタグを追加できます。[Next: Review] を選択します。

  12. [Role Name (ロール名)] にロール名を入力し、[Create Role (ロールの作成)] を選択します。

  13. ロールが作成されたら、コンソールでロールを選択して編集用に開きます。

  14. [Trust relationships] タブを選択し、続いて [Edit trust relationship] を選択します。

  15. 次のように表示されます。

    "oidc.eks.us-west-2.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:aud": "sts.amazonaws.com"

    これを次の行のように変更します。<EXAMPLED539D4633E53DE1B716D3041E> (<> を含む) をクラスターの OIDC プロバイダー ID に置き換え、<region-code> はクラスターがあるリージョンコードに置き換えます。

    注記

    サービスアカウントを持っていない場合は、新たに作成する必要があります。詳細については、Kubernetes ドキュメントの「Configure Service Accounts for Pods (ポッド用にサービスアカウントを設定する)」を参照してください。サービスアカウントが Kubernetes のアクセス許可を使用できるようにするには、Role または ClusterRole を作成し、このロールをサービスアカウントにバインドします。詳細については、Kubernetes ドキュメントの「RBAC 認証の使用」を参照してください。AWS VPC CNI プラグイン がデプロイされる際に、デプロイマニフェストによってサービスアカウント、クラスターロール、およびロールバインドなどが作成されます。GitHub で、マニフェストを確認できます。

  16. [Update Trust Policy (信頼ポリシーの更新)] を選択して終了します。

AWS CLI
  1. 次のコマンドを使用して、AWS アカウント ID を環境変数に設定します。

    ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
  2. 次のコマンドを使用して、OIDC ID プロバイダーを環境変数に設定します。<example values> (<> を含む) を、自分の値に置き換えます。

    重要

    このコマンドで適切な出力を得るには、最低でも 1.20.6 または 2.2.22 のバージョンの AWS CLI を使用する必要があります。詳細については、AWS Command Line Interface ユーザーガイドの「AWS CLI のインストール」を参照してください。

    OIDC_PROVIDER=$(aws eks describe-cluster --name <cluster-name> --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  3. 次のコードブロックをコンピュータにコピーし、<example values> (<> を含む) を自分の値に置き換えます。

    read -r -d '' TRUST_RELATIONSHIP <<EOF { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": { "Federated": "arn:aws:iam::${ACCOUNT_ID}:oidc-provider/${OIDC_PROVIDER}" }, "Action": "sts:AssumeRoleWithWebIdentity", "Condition": { "StringEquals": { "${OIDC_PROVIDER}:sub": "system:serviceaccount:<my-namespace>:<my-service-account>" } } } ] } EOF echo "${TRUST_RELATIONSHIP}" > trust.json
  4. 前のステップで変更したコードブロックを実行して、trust.json という名前のファイルを作成します。

  5. 次の AWS CLI コマンドを実行して、ロールを作成します。

    aws iam create-role --role-name <IAM_ROLE_NAME> --assume-role-policy-document file://trust.json --description "<IAM_ROLE_DESCRIPTION>"
  6. 次のコマンドを実行して、IAM ポリシーをロールにアタッチします。

    aws iam attach-role-policy --role-name <IAM_ROLE_NAME> --policy-arn=<IAM_POLICY_ARN>