スキップしてコンテンツを表示

Amazon EKS ポッドでサービスアカウントに IAM ロールを使用できない理由を知りたいです。

所要時間2分
0

サービス AWS アカウント (IRSA) で AWS Identity and Access Management (IAM) ロールを使用したいのですが、Amazon Elastic Kubernetes Service (Amazon EKS) ポッドが割り当てられた IAM ロールを引き受けられなかったり、ポッドがそのロールを使用せず、Amazon EKS ノードに割り当てられたデフォルト IAM ロールを使用したりします。

解決策

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

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

クラスター用の IAM OpenID Connect (OIDC) プロバイダーを作成済みでない場合は、作成します。IRSA を使用するには、クラスター用の OIDC プロバイダーが必要です。

次に以下の手順を実行し、OIDC プロバイダーが正しく設定されていることを確認します。

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

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

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 リージョンコード、AWS アカウント ID、一意の OIDC 識別子の形式が適切であることを確認します。StringEquals において、リージョンコード、OIDC ユニーク識別子、Kubernetes 名前空間、Kubernetes サービスアカウント名の形式が適切であることを確認します。
  6. ポリシードキュメントを編集して形式のエラーを修正する場合は、[信頼ポリシーの更新] を選択します。

サービスアカウントが存在し、IAM ロールの Amazon リソースネーム (ARN) のアノテーションが適切な形式であることを確認します。

次の手順を実行します。

  1. Kubernetes サービスアカウントが存在することを確認するには、次のコマンドを実行します。
    kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml
    注: 実際のものでそれぞれ、YOUR_ACCOUNT_NAME をアカウント名に、YOUR_NAMESPACE を名前空間に置き換えます。
    上記のコマンドでサービスアカウント名が返されない場合は、サービスアカウントを作成します。詳細については、Kubernetes のウェブサイトで「複数の ServiceAccount を使用する」を参照してください。
  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 ポッドに AWS_ROLE_ARNAWS_WEB_IDENTITY_TOKEN_FILE という環境変数があることを確認するには、次のコマンドを実行します。

    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"
    }

    Arn の値を書き留めておきます。IAM ロールがポッドで使用するロールであることを確認します。

  5. awscli ポッドを削除するには、次のコマンドを実行します。

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

    注: YOUR_NAMESPACE を実際の名前空間に置き換えます。

awscli ポッドに正しい IAM ロールが表示されている場合は、サービスアカウント機能用の IAM ロールは期待通りに動作しています。上記の手順により、IAM トークンがポッドに正しくマウントされていることが検証されます。それでもアプリケーションがトークンファイルを使用できない場合は、アプリケーションレベルまたは SDK レベルでの問題がある可能性があります。たとえば、アプリケーションの AWS 認証情報の使用方法に問題があったり、SDK バージョンがサポートされていなかったりする場合があります。詳細については、「デフォルトの認証情報プロバイダーチェーンを使用する」および「AWS SDK で IRSA を使用する」を参照してください。

AWS公式更新しました 5ヶ月前
コメントはありません

関連するコンテンツ