Amazon EKS ポッドでサービスアカウントの IAM ロールを使用できないのはなぜですか?

所要時間3分
0

サービスアカウントに AWS ID およびアクセス管理 (IAM) ロールを使用しようとしています。私の Amazon Elastic Kubernetes サービス (Amazon EKS) ポッドは、割り当てられた IAM ロールを引き継ぐことができず、認証エラーが発生します。または、ポッドは、ポッドに割り当てられた IAM ロールの代わりに Amazon EKS ノードに割り当てられたデフォルトの IAM ロールを使用しようとします。

解決策

: AWS コマンドラインインターフェイス (AWS CLI) コマンドの実行中にエラーが発生した場合は、「AWS CLI エラーのトラブルシューティング」を参照してください。また、AWS CLI の最新バージョンを使用しているようにしてください。

Amazon EKS クラスター用の IAM OIDC アイデンティティプロバイダーがあることを確認する

クラスター用の IAM OIDC プロバイダーを作成します (まだ作成していない場合)。サービスアカウントに IAM ロールを使用するには、クラスターの OIDC ID プロバイダーが必要です。

次に、OIDC ID プロバイダーが正しく設定されていることを確認します。

  1. IAM コンソールを開きます。ナビゲーションペインから [ID プロバイダー] を選択します。
  2. [プロバイダー] 列で、OIDC プロバイダー URL を特定して書き留めます。
  3. 別のタブまたはウィンドウで、Amazon EKS コンソールを開きます。次に、ナビゲーションペインから [クラスター] を選択します。
  4. クラスターを選択し、[構成] タブを選択します。
  5. [詳細] セクションで、OpenID Connect プロバイダーの URL の値を書き留めておきます。
  6. Amazon EKS コンソール (ステップ 5) の OIDC プロバイダーの URL が IAM コンソール (ステップ 2) の OIDC プロバイダーの URL と一致することを確認します。
    Amazon EKS クラスターの OIDC プロバイダーの URL が IAM コンソールの OIDC プロバイダーの URL のいずれとも一致しない場合は、新しい IAM OIDC プロバイダーを作成する必要があります。

IAM ロールポリシーと信頼ポリシー設定を検証する

お使いの IAM ロールには、必要なすべての権限がない場合があります。AWS マネジメントコンソールまたは AWS CLI で IAM ロールを作成した場合、IAM ロールの信頼関係ポリシーにも構文エラーがある可能性があります。

IAM ロールポリシーを検証し、信頼ポリシーに構文エラーがないかどうかを確認するには、以下を実行してください。

  1. IAM コンソールを開きます。
  2. ナビゲーションペインで [ロール] を選択し、ロールを選択します。
  3. ロールのページで [権限] タブを選択し、必要な権限がすべてロールに割り当てられていることを確認します。
  4. [信頼関係] タブを選択し、[信頼関係の編集] を選択します。
  5. 信頼関係のポリシードキュメントで、ポリシーの形式が次の JSON ポリシーの形式と一致していることを確認します。
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Federated": "arn:aws:iam::your-account-id:oidc-provider/oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER"
          },
          "Action": "sts:AssumeRoleWithWebIdentity",
          "Condition": {
            "StringEquals": {
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:sub": "system:serviceaccount:your-namespace:your-service-account",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    JSON ポリシーで、[Federated] プロパティ行と [StringEquals] プロパティ行の形式を確認します。[Federated] 行で、AWS リージョンコード (your-region-code)、アカウント ID (your-account-id)、一意の OIDC 識別子 (EXAMPLE_OIDC_IDENTIFIER) の形式が正しいことを確認します。**StringEquals ** 行で、リージョンコード (your-region-code)、OIDC 固有識別子 (EXAMPLE_OIDC_IDENTIFIER)、Kubernetes 名前空間 (your-namespace)、および Kubernetes サービスアカウント名 (your-namespace) の形式が正しいことを確認します。
  6. ポリシードキュメントを編集して、形式のエラーを修正する場合は、[信頼ポリシーの更新] を選択します。

サービスアカウントが存在し、IAM ロールの ARN の注釈の形式が正しいことを確認します。

  1. Kubernetes サービスアカウントが存在することを確認します。

    $ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

    注: YOUR_ACCOUNT_NAME をアカウント名に置き換えてください。YOUR_NAMESPACE を自分の名前空間に置き換えます。
    上記のコマンドでサービスアカウント名が返されない場合は、サービスアカウントを作成します。詳細については、Kubernetes ウェブサイトの「複数のサービスアカウントを使用する」を参照してください。

  2. サービスアカウントの名前が期待どおりであることを確認します。また、role-arn アノテーションの形式が正しいことも確認してください。例:

    apiVersion: v1
    kind: ServiceAccount
    metadata:
      annotations:
        eks.amazonaws.com/role-arn: arn:aws:iam::012345678912:role/my-example-iam-role
      name: my-example-serviceaccount
      namespace: my-test-namespace

テストポッドを使用して、サービスアカウントが機能することを確認する

テストポッドを実行して、サービスアカウントが正しく機能することを確認します。次に、ポッドが環境変数を正しくマウントでき、指定された IAM ロールを引き受けることができるかどうかを確認します。

  1. awscli-pod.yaml というローカルの YAML ファイルを作成します。例:

    apiVersion: v1
    kind: Pod
    metadata:
      name: awscli
      labels:
        app: awscli
    spec:
      serviceAccountName: YOUR_SERVICE_ACCOUNT
      containers:
      - image: amazon/aws-cli
        command:
          - "sleep"
          - "604800"
        imagePullPolicy: IfNotPresent
        name: awscli
      restartPolicy: Always

    注: YOUR_SERVICE_ACCOUNT を Kubernetes サービスのアカウント名に置き換えます。

  2. 名前空間にテストポッドを (YAML ファイルから) 作成します。

    $ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    注: [YOUR_NAMESPACE] を自分の名前空間に置き換えます。

  3. **awscli ** ポッドに正しい environment variables があることを確認します。

    $ kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    出力は次のようになります。

    AWS_ROLE_ARN=arn:aws:iam::ACCOUNT_ID:role/IAM_ROLE_NAME
    AWS_WEB_IDENTITY_TOKEN_FILE=/var/run/secrets/eks.amazonaws.com/serviceaccount/token
  4. テストポッドに正しい IAM ロールが割り当てられていることを確認します。

    $ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

    出力は次のようになります。

    {
        "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
        "Account": "012345678912",
        "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
    }

    この出力で受け取る IAM ロール名を含む Arn 値を書き留めておきます。

  5. IAM ロールを確認したら、awscli ポッドを削除します。

    $ kubectl delete -f ./awscli-pod.yaml -n YOUR_NAMESPACE

    awscli ポッドに正しい IAM ロールが表示されていれば、サービスアカウントの IAM ロール機能は正しく機能します。

前述の手順で、IAM トークンがポッドに正しくマウントされていることを確認できます。それでもアプリケーションがトークンファイルを正しく使用できない場合は、アプリケーションレベルまたは SDK レベルで問題がある可能性があります。この問題は、アプリケーションが AWS 認証情報を取り込む方法に関連しているか、SDK バージョンがサポートされていないことが原因である可能性があります。詳細については、「デフォルトの認証情報プロバイダーチェーンの使用」、Boto3 ウェブサイトの「認証情報」、および「サポートされている AWS SDK の使用」を参照してください。

AWS公式
AWS公式更新しました 1年前
コメントはありません

関連するコンテンツ