Passer au contenu

Pourquoi l’erreur « WebIdentityErr » s’affiche-t-elle lorsque j’utilise le contrôleur AWS Load Balancer dans Amazon EKS ?

Lecture de 4 minute(s)
0

Lorsque j’utilise le contrôleur AWS Load Balancer dans Amazon Elastic Kubernetes Service (Amazon EKS), j’obtiens un message d’erreur « WebIdentityErr ».

Brève description

Lorsque vous utilisez le contrôleur AWS Load Balancer dans Amazon EKS, l'erreur suivante peut s'afficher :

« 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 »

L'erreur « WebIdentityErr » se produit pour les raisons suivantes :

  • Configurations de compte de service incorrectes
  • Relation d’approbation incorrecte avec le rôle Gestion des identités et des accès AWS (AWS IAM) que vous utilisez dans le compte de service

Lorsque vous utilisez le contrôleur AWS Load Balancer, vous devez utiliser les autorisations IAM afin d’autoriser les composants master à gérer les ressources de l'Application Load Balancer ou du Network Load Balancer. Pour configurer les autorisations IAM, utilisez les rôles IAM pour les comptes de service (IRSA) ou associez les autorisations IAM directement aux rôles IAM du composant master. Pour plus d’informations, consultez la page Installation du contrôleur AWS Load Balancer sur le site Web de Kubernetes.

Résolution

Configurations de compte de service incorrectes

Pour vérifier si vous avez correctement configuré votre compte de service, procédez comme suit :

  1. Pour vérifier le nom du compte de service défini dans votre déploiement, exécutez la commande suivante :

    kubectl describe deploy aws-load-balancer-controller -n kube-system | grep -i "Service Account"
  2. Pour vérifier l'annotation du rôle IAM du compte de service, exécutez la commande suivante :

    kubectl describe sa aws-load-balancer-controller -n kube-system | grep "role-arn"

    Exemple de sortie :

    Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::abcdefgxyz:role/AMAZON_EKS_LOAD_BALANCER_CONTROLLER_ROLE
  3. Si l'annotation du rôle IAM est manquante ou incorrecte, exécutez la commande suivante pour mettre à jour l'annotation :

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

    Remarque : Remplacez SERVICE_ACCOUNT_NAMESPACE par votre espace de noms, SERVICE_ACCOUNT_NAME par le nom de votre compte, ACCOUNT_ID par votre ID de compte AWS et IAM_ROLE_NAME par le nom de votre rôle IAM. Vérifiez également que vous avez correctement associé le rôle IAM à un compte de service.

  4. Pour redémarrer le déploiement du contrôleur AWS Load Balancer afin d'actualiser les informations d'identification du pod, exécutez la commande suivante :

    kubectl rollout restart deployment/aws-load-balancer-controller -n kube-system

Relation d’approbation incorrecte entre le rôle IAM utilisé et le compte de service

Des problèmes peuvent survenir lors de l’établissement de la relation d’approbation entre votre rôle IAM et votre compte de service. Pour résoudre ces problèmes, effectuez les actions suivantes en fonction des erreurs courantes qui peuvent survenir lors de l'établissement de la relation d’approbation.

Vous n’avez pas défini correctement le rôle IAM ou la relation d’approbation pour l’action « sts:AssumeRoleWithWebIdentity »

Vérifiez que la relation d’approbation est correctement définie pour l'action sts:AssumeRoleWithWebIdentity, et non pour l'action sts:AssumeRole.

L’exemple suivant illustre une relation d’approbation correctement définie :

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

Pour résoudre ce problème, mettez à jour la relation d’approbation pour l’action sts:AssumeRoleWithWebIdentity. Exemple de politique :

{  "Version": "2012-10-17",
    "Statement": [
      {
        "Effect": "Allow",
        "Principal": {
          "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC-PROVIDER_ID"
        },
        "Action": "sts:AssumeRoleWithWebIdentity",
        "Condition": {
          "StringEquals": {
            "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:sub": "system:serviceaccount:kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
            "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
          }
        }
      }
    ]
  }

Remarque : Remplacez AWS_ACCOUNT par votre ID de compte, REGION par votre région AWS et EKS_CLUSTER_OIDC-PROVIDER_ID par votre ID OpenID Connect (OIDC). Remplacez également LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT par le nom du compte de service défini dans le déploiement de votre contrôleur AWS Load Balancer.

Pour utiliser le même rôle IAM pour plusieurs clusters dans un même compte, définissez la relation d’approbation comme dans l'exemple suivant :

{  "Version": "2012-10-17",
  "Statement": [
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::AWS-ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC-PROVIDER_ID"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_1_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
        }
      }
    },
    {
      "Effect": "Allow",
      "Principal": {
        "Federated": "arn:aws:iam::AWS_ACCOUNT:oidc-provider/oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID"
      },
      "Action": "sts:AssumeRoleWithWebIdentity",
      "Condition": {
        "StringEquals": {
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:sub": "system:serviceaccount: kube-system:LOAD_BALANCER_CONTROLLER_SERVICE_ACCOUNT",
          "oidc.eks.REGION.amazonaws.com/id/EKS_CLUSTER_2_OIDC_PROVIDER_ID:aud": "sts.amazonaws.com"
        }
      }
    }
  ]
}

Vous n'avez pas ajouté l'ID du fournisseur OIDC lorsque vous avez créé un cluster Amazon EKS

Vérifiez que vous avez créé et associé l'ID du fournisseur OIDC à votre cluster Amazon EKS.

Vous avez incorrectement saisi le nom du compte de service

Pour vérifier le déploiement de votre contrôleur AWS Load Balancer, exécutez la commande suivante :

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

Si nécessaire, mettez à jour votre déploiement pour saisir le nom de compte de service correct.

AWS OFFICIELA mis à jour il y a un an