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

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

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

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

IAM ポリシーを作成する

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

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

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

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

  2. 左のナビゲーションペインで、[Policies] (ポリシー) を選択し、[Criate policy] (ポリシーの作成) を選択します。

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

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

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

    { "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 ロールを作成する

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

前提条件

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

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

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

IAM ロールを作成するには、eksctl または AWS CLI を使用できます。

eksctl

次のコマンドを使用して、サービスアカウントと IAM ロールを作成します。my-service-accountmy-namespace を、IAM ロールを関連付ける Kubernetes サービスアカウントと名前空間に置き換えます。my-cluster をクラスターの名前に置き換え、my-role-name を IAM ロールに使用する名前に置き換えます。111122223333 をアカウント ID (または、AWS マネージドポリシーを添付している場合は aws) に置き換え、my-iam-policy を作成した既存の IAM ポリシーの名前またはマネージド AWS IAM ポリシーの名前に置き換えます。

eksctl create iamserviceaccount \ --name my-service-account \ --namespace my-namespace \ --cluster my-cluster \ --role-name "my-role-name" \ --attach-policy-arn arn:aws:iam::111122223333:policy/my-iam-policy \ --approve \ --override-existing-serviceaccounts

eksctl ユーティリティは、AWS CloudFormation テンプレートを作成し、デプロイします。このテンプレートは、IAM ロールを作成して指定した IAM ポリシーをアタッチします。ロールは、指定した Kubernetes サービスアカウントに関連付けられています。Kubernetes サービスアカウントが存在しなかった場合、eksctl はユーザーが指定して eks.amazonaws.com/role-arn:arn:aws:iam::111122223333:role/my-role-name の注釈を付けた名前空間にサービスアカウントを作成します。これは、AWS CloudFormation テンプレートによって作成された IAM ロールの名前です。

Kubernetes サービスアカウントがコマンドの実行前に存在しており、それが eksctl で作成されていない場合、eksctl は既存のサービスアカウントに eks.amazonaws.com/role-arn:arn:aws:iam::111122223333:role/my-role-name の注釈を付けています。コマンドを実行する前に Kubernetes サービスアカウントが存在し、eksctl によって作成された場合、コマンドは失敗します。eksctl によって作成されたサービスアカウントを更新するには eksctl update iamserviceaccount を使用します。

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

    ACCOUNT_ID=$(aws sts get-caller-identity --query "Account" --output text)
  2. 次のコマンドを使用して、OIDC ID プロバイダーを環境変数に設定します。my-cluster を自分のクラスター名に置き換えます。

    重要

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

    OIDC_PROVIDER=$(aws eks describe-cluster --name my-cluster --query "cluster.identity.oidc.issuer" --output text | sed -e "s/^https:\/\///")
  3. 次のコードブロックをコンピュータにコピーします。my-namespacemy-service-account を、ロールを関連付けたい Kubernetes 名前空間とサービスアカウントに置き換えます。

    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}:aud": "sts.amazonaws.com", "${OIDC_PROVIDER}:sub": "system:serviceaccount:my-namespace:my-service-account" } } } ] } EOF echo "${TRUST_RELATIONSHIP}" > trust.json
  4. 前のステップで変更したコードブロックを実行して、trust.json という名前のファイルを作成します。

  5. 次の AWS CLI コマンドを実行して、ロールを作成します。my-iam-role を IAM ロールの名前に、my-role-description をユーザーロールの表記に置き換えます。

    aws iam create-role --role-name my-iam-role --assume-role-policy-document file://trust.json --description "my-role-description"
  6. 次のコマンドを実行して、IAM ポリシーをロールにアタッチします。my-iam-role を IAM ロールの名前に、111122223333 をアカウント ID (aws マネージドポリシーを添付している場合は AWS) に、my-iam-policy を作成した既存のポリシーまたは IAM AWS マネージドポリシーの名前に置き換えます。

    aws iam attach-role-policy --role-name my-iam-role --policy-arn=arn:aws:iam::111122223333:policy/my-iam-policy