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

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

ポッド内のコンテナに付与するアクセス許可を指定する IAM ポリシーを作成する必要があります。IAM の新しい権限ポリシーを作成する方法は複数あります。目的の操作のいくつかをすでに実行できる完全な AWS 管理ポリシーをコピーし、特定の要件に応じてカスタマイズできます。詳細については、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 フィールドに、サービスアカウントに適用する次のいずれかのポリシーを貼り付けるか、独自のポリシードキュメントをフィールドに貼り付けます。ビジュアルエディタを使用して独自のポリシーを作成することもできます。

    以下の例では、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 ロールを作成する

サービスアカウントの IAM ロールを作成します。ロールの作成に使用するツールの名前が付いているタブを選択します。

eksctl

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

注記

このコマンドは、eksctl で作成したクラスターでのみ使用できます。eksctl でクラスターを作成していない場合は、AWS マネジメントコンソール または AWS CLI タブの手順を使用します。

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

IAM ロールを作成し、IAM ポリシーをアタッチした AWS CloudFormation テンプレートがデプロイされました。ロールは Kubernetes サービスアカウントに関連付けられました。

AWS マネジメントコンソール
  1. クラスターの Amazon EKS コンソールの説明から OIDC 発行者 URL を取得するか、次の AWS CLI コマンドを使用します。

    重要

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

    aws eks describe-cluster --name cluster_name --query "cluster.identity.oidc.issuer" --output text
  2. IAM コンソール (https://console.aws.amazon.com/iam/) を開きます。

  3. ナビゲーションペインで [ロール]、[ロールの作成] の順に選択します。

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

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

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

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

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

  7. [Attach Policy (ポリシーをアタッチする)] セクションで、サービスアカウントに使用するポリシーを選択します。[次へ: タグ] を選択します。

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

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

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

  11. [信頼関係] タブを選択してから、[信頼関係の編集] を選択します。

    1. OIDC プロバイダーのサフィックスを編集し、:aud から :sub に変更します。

    2. sts.amazonaws.com をサービスアカウント ID に置き換えます。

    結果の行は次のようになります。

    "oidc.eks.region-code.amazonaws.com/id/EXAMPLED539D4633E53DE1B716D3041E:sub": "system:serviceaccount:SERVICE_ACCOUNT_NAMESPACE:SERVICE_ACCOUNT_NAME"
  12. [Update Trust Policy (信頼ポリシーの更新)] を選択して終了します。

  13. IAM ロールを Kubernetes サービスアカウントに関連付けます。詳細については、「サービスアカウントの IAM ロールの指定」を参照してください。

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

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

    重要

    このコマンドで適切な出力を得るには、最低でも AWS CLI のバージョン 1.18.97 または 2.0.30 を使用する必要があります。詳細については、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. 次のコードブロックをコンピューターにコピーし、 namespaceservice-account-name を独自の値に置き換えます。

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

  5. 次の AWS CLI コマンドを実行してロールを作成し、IAM ロール名と説明を置き換えます。

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

    aws iam attach-role-policy --role-name IAM_ROLE_NAME --policy-arn=IAM_POLICY_ARN
  7. IAM ロールを Kubernetes サービスアカウントに関連付けます。詳細については、「サービスアカウントの IAM ロールの指定」を参照してください。