¿Por qué recibo el error “webidentityerr” al utilizar el controlador del equilibrador de carga de AWS en Amazon EKS?

Última actualización: 04/01/2023

Recibo el siguiente mensaje de error al intentar utilizar el controlador del equilibrador de carga de AWS en Amazon Elastic Kubernetes Service (Amazon EKS): “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” (no se pudo encontrar un equilibrador de carga existente debido a WebIdentityErr: no se pudieron recuperar las credenciales\ncausado por: AccessDenied: no hay autorización para ejecutar sts:AssumeRoleWithWebIdentity\n\tcódigo de estado: 403)

Descripción breve

Aparece este error al utilizar el controlador del equilibrador de carga de AWS en Amazon EKS por los siguientes motivos:

  • Configuración incorrecta de la cuenta de servicio
  • Relación de confianza incorrecta del rol de AWS Identity and Access Management (IAM) que se utiliza en la cuenta de servicio

Con el controlador del equilibrador de carga de AWS, los nodos de trabajo realizan las tareas. Estos nodos de trabajo deben tener acceso a los recursos del equilibrador de carga de aplicación de AWS o del equilibrador de carga de red de AWS mediante los permisos de IAM. Puede configurar los permisos de IAM para la cuenta de servicio mediante el rol de IAM. O bien, puede adjuntar los permisos de IAM directamente al rol de IAM del nodo de trabajo. Para más información, consulte Load Balancer Controller installation (Instalación del controlador del equilibrador de carga) en el sitio web de Kubernetes.

Resolución

Configuración incorrecta de la cuenta de servicio

Para verificar si las configuraciones de las cuentas de servicio se encuentran correctamente configuradas, realice los siguientes pasos:

1.    Verifique el nombre de la cuenta de servicio que está definida en la implementación:

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

2.    Describa la cuenta de servicio:

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

3.    Compruebe la anotación de la cuenta de servicio para el rol de IAM:

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

4.    Si esta anotación falta o es incorrecta, actualice la anotación. Asegúrese de asociar correctamente el rol de IAM a una cuenta de servicio:

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.    Elimine y vuelva a crear los pods de Amazon EKS existentes que estén asociados a la cuenta de servicio. Asegúrese de aplicar las variables de entorno de las credenciales:

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

Relación de confianza incorrecta entre el rol de IAM utilizado y la cuenta de servicio

Los siguientes ejemplos muestran algunos errores comunes que pueden ocurrir al establecer la relación de confianza entre el rol de IAM y la cuenta de servicio.

Ejemplo 1: el rol de IAM o la relación de confianza no están correctamente definidos para la acción “sts:AssumeRoleWithWebIdentity”

Verifique que la relación de confianza esté definida correctamente para la acción sts:AssumeRoleWithWebIdentity (y no para la acción sts:AssumeRole).

Este es un ejemplo de una relación de confianza que no está correctamente definida:

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

Para corregir la relación de confianza, asegúrese de definir la relación de confianza para la acción 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>"
        }
      }
    }
  ]
}

Nota: Asegúrese de sustituir todas las variables por sus propios valores.

Para usar el mismo rol de IAM en varios clústeres de una cuenta, defina la relación de confianza de manera similar a la siguiente:

{
 "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-1-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-1-OIDC-Provider-ID>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
            "oidc.eks.<REGION>.amazonaws.com/id/<Your-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/<Your-EKS-Cluster-2-OIDC-Provider-ID>"
   },
   "Action": "sts:AssumeRoleWithWebIdentity",
   "Condition": {
    "StringEquals": {
     "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-Cluster-2-OIDC-Prob>:sub": "system:serviceaccount: kube-system:<aws-load-balancer-controller-serviceaccount>",
                                        "oidc.eks.<REGION>.amazonaws.com/id/<Your-EKS-cluster-2-OIDC-Provider-ID>:aud": "sts.amazonaws.com"
    }
   }
  }
 ]
}

Ejemplo 2: ID de proveedor de OIDC incorrecto al crear un clúster de Amazon EKS

Asegúrese de crear y verificar correctamente un proveedor de OIDC para su clúster de Amazon EKS. Verifique que el ID del proveedor de OIDC y la región de AWS asociada aparecen correctamente. Si no, recibirá un error WebIdentityErr.

Ejemplo 3: el nombre de la cuenta de servicio o su espacio de nombre no se han ingresado correctamente

Asegúrese de ingresar el nombre correcto de la cuenta de servicio y su espacio de nombre cuando actualice la implementación del controlador del equilibrador de carga de AWS.

Ejemplo 4: falta el paso “sts.amazonaws.com” en la relación de confianza

Si el rol de servicio asociado a su pod de EKS no puede realizar la operación STS en la acción AssumeRoleWithWebIdentity, actualice la relación de confianza. La relación de confianza debe incluir “sts.amazonaws.com” para realizar una operación STS.

Por ejemplo:

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

Para más información sobre las condiciones de IAM con múltiples claves o valores, consulte Creación de una condición con varias claves o valores.


¿Le resultó útil este artículo?


¿Necesita asistencia técnica o con la facturación?