Amazon EKS で AWS Load Balancer Controller を使用しているときに「webidentityerr」エラーが発生するのはなぜですか?

最終更新日: 2021 年 12 月 8 日

Amazon Elastic Kubernetes Service (Amazon EKS) で AWS Load Balancer Controller を使用しようとすると、次のエラーメッセージが表示されます。

「failed to find existing LoadBalancer due to WebIdentityErr: failed to retrieve credentials\ncaused by: AccessDenied: Not authorized to perform sts:AssumeRoleWithWebIdentity\n\tstatus code: 403」(WebIdentityErr が原因で既存のロードバランサーが見つかりません。認証情報の取得に失敗しました\n原因: アクセス拒否: sts:AssumeRoleWithWebIdentity を実行する権限がありません\n\tステータスコード: 403)

このエラーを解決するにはどうすればよいですか?

簡単な説明

Amazon EKS で AWS Load Balancer Controller を使用している場合、「WebIdentityErr: failed to retrieve credentials caused by: AccessDenied」(WebIdentityErr: 認証情報の取得に失敗しました。原因: アクセス拒否) エラーは次の原因で発生することがあります。

  • サービスアカウントの設定が正しくない
  • サービスアカウントで AWS Identity and Access Management (IAM) ロールの正しくない信頼関係が使用されている

AWS Load Balancer Controller では、ワーカーノードによってタスクが実行されます。これらのワーカーノードには、IAM アクセス許可を使用して AWS Application Load Balancer または AWS Network Load Balancer リソースへのアクセス権を付与する必要があります。IAM アクセス許可は、サービスアカウントの IAM ロールを使用して設定することも、ワーカーノードの IAM ロールに直接アタッチすることもできます。詳細については、Kubernetes ウェブサイトの「Load Balancer Controller Installation」を参照してください。

解決方法

サービスアカウントの設定が正しくない

サービスアカウントが正しく設定されているかどうかを確認するには、次の手順に従います。

1.    デプロイで定義されているサービスアカウント (SA) 名を確認します。

kubectl describe deploy <aws-load-balancer-controller> -n kube-system | grep -i "Service Account"

2.    サービスアカウントの説明を表示します。

kubectl describe sa <aws-load-balancer-controller> -n kube-system

3.    IAM ロールの SA アノテーションを確認します。

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::xxxxxxxxxx:role/<AmazonEKSLoadBalancerControllerRole>

4.    このアノテーションが欠落しているか正しくない場合は、アノテーションを更新してください。次のように、IAM ロールをサービスアカウントに適切に関連付けていることを確認します。

kubectl annotate serviceaccount -n <SERVICE_ACCOUNT_NAMESPACE> <SERVICE_ACCOUNT_NAME> \ eks.amazonaws.com/role-arn=arn:aws:iam::<ACCOUNT_ID>:role/<IAM_ROLE_NAME>

5.    サービスアカウントに関連付けられている既存の Amazon EKS ポッドを削除して再作成します。認証情報の環境変数を必ず適用してください。

kubectl delete pods <aws-loadbalancer-controller-pod> -n <kube-system>

使用されている AWS Identity Access Management (IAM) ロールとサービスアカウント間の信頼関係が正しくない

次の例は、IAM ロールとサービスアカウント間の信頼関係を確立する際に発生する可能性のあるよくある間違いを示しています。

例 1: 「sts:AssumeRoleWithWebIdentity」アクションに対して IAM ロールまたは信頼関係が適切に定義されていない

「sts:AssumeRoleWithWebIdentity」アクション (「sts:AssumeRole」アクションではなく) の信頼関係が適切に定義されていることを確認します。

適切に定義されていない信頼関係の例を次に示します。

{
      "Sid": "",
      "Effect": "Allow",
      "Principal": {
        "Service": "xxxxx.amazonaws.com"
      },
      "Action": "sts:AssumeRole"
}

信頼関係を修正するには、必ず「sts:AssumeRoleWithWebIdentity」アクションの信頼関係を定義してください。

{
  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::<AWS-ACCOUNT>:oidc-provider/oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>"        
        }
      }
    }
  ]
}

注: すべての変数を必ずご自身の値に置き換えてください。

例 2: Amazon EKS クラスターの作成時に誤った OIDC プロバイダー ID を指定した

Amazon EKS クラスターの OIDC プロバイダーを適切に作成し、検証してください。OIDC プロバイダー ID と関連する AWS リージョンが正しくリストされていることを確認します。そうしないと、WebIdentityErr エラーが発生します。

例 3: AWS Load Balancer Controller デプロイの設定時に誤ったサービスアカウント (SA) 名と名前空間を指定した

AWS Load Balancer Controller デプロイを更新するときは、必ず正しい SA 名とその名前空間を入力してください。

例 4: 信頼関係から「sts.amazonaws.com」のステップが欠落している

EKS ポッドに関連付けられているサービスロールが「AssumeRoleWithWebIdentity」アクションで STS 操作を実行できない場合は、信頼関係を更新します。STS 操作を実行するには、信頼関係に「sts.amazonaws.com」が含まれている必要があります。

例:

"Condition": {
        "StringEquals": {
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:sub": "system:serviceaccount:kube-system:<aws-load-balancer-controller-serviceaccount>",
          "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
        }
}

複数のキーまたは値を持つ IAM 条件の詳細については、「複数のキーまたは値による条件の作成」を参照してください。


この記事はお役に立ちましたか?


請求に関するサポートまたは技術サポートが必要ですか?