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

Última actualización: 08-12-2021

Me aparece el siguiente mensaje de error cuando intento utilizar el controlador del balanceador 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)

¿Cómo soluciono este error?

Descripción corta

Al utilizar el controlador del equilibrador de carga de AWS en Amazon EKS, el error WebIdentityErr: failed to retrieve credentials caused by: AccessDenied puede producirse 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 balanceador de carga de AWS, los nodos de trabajo realizan las tareas. Estos nodos de trabajo deben tener acceso a los recursos de AWS Application Load Balancer o de AWS Network Load Balancer mediante los permisos de IAM. Los permisos de IAM se pueden configurar con los roles de IAM para la cuenta de servicio, o se pueden adjuntar directamente a los roles de IAM del nodo de trabajo. Para más información, consulte 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 (SA) 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.    Verifique la anotación SA 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, así:

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 AWS Identity Access Management (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”

Compruebe 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 de 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.

Ejemplo 2: ID de proveedor 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: Nombre de cuenta de servicio (SA) incorrecto y su espacio de nombres al configurar la implementación de controlador del balanceador de carga de AWS

Asegúrese de ingresar el nombre correcto de la cuenta de servicio y su espacio de nombres cuando actualice la implementación del controlador del balanceador 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 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?