¿Por qué no puedo usar un rol de IAM para la cuenta de servicio en mi pod de Amazon EKS?

Última actualización: 05/10/2021

Intento usar un rol de AWS Identity and Access Management (IAM) para una cuenta de servicio. Sin embargo, mi pod de Amazon Elastic Kubernetes Service (Amazon EKS) no asume el rol de IAM asignado. Recibo un error de autorización. O bien, mi pod intenta utilizar el rol de IAM predeterminado asignado al nodo Amazon EKS en lugar del rol de IAM asignado a mi pod.

Descripción corta

Para resolver problemas mediante la característica Roles de IAM para cuentas de servicio, pruebe a hacer lo siguiente:

  • Compruebe que tiene un proveedor de identidad de OpenID Connect (OIDC) de IAM para su clúster de Amazon EKS
  • Valide las políticas de rol de IAM y la configuración de la política de confianza
  • Confirme que su cuenta de servicio existe y que tiene una anotación con el formato correcto para el ARN del rol de IAM
  • Use un pod de prueba para comprobar que la cuenta de servicio funciona

Nota: Si recibe errores al ejecutar comandos de AWS Command Line Interface (AWS CLI), asegúrese de que está utilizando la versión más reciente de AWS CLI.

Resolución

Comprobar que tiene un proveedor de identidad OIDC de IAM para su clúster de Amazon EKS

Cree un proveedor de OIDC de IAM para su clúster, si aún no lo tiene. Debe tener un proveedor de identidades OIDC para que su clúster use un rol de IAM para su cuenta de servicio.

A continuación, compruebe que el proveedor de identidades OIDC está configurado correctamente:

1.    Abra la consola de IAM y, a continuación, seleccione Identity providers (Proveedores de identidad) en el panel de navegación.

2.    En la columna Provider (Proveedor), identifique y anote la URL del proveedor de OIDC.

3.    En otra pestaña o ventana, abra la consola de Amazon EKS y, a continuación, elija Clusters (Clústeres) en el panel de navegación.

4.    Elija su clúster y, a continuación, seleccione la pestaña (Configuration) Configuración.

5.    En la sección Details (Detalles), anote el valor de la propiedad de la URL del proveedor de OpenID Connect.

6.    Compruebe que la URL del proveedor de OIDC de la consola de Amazon EKS (paso 5) coincida con la URL del proveedor de OIDC de la consola de IAM (paso 2).

Si la URL del proveedor de OIDC del clúster de Amazon EKS no coincide con ninguna de las URL del proveedor de OIDC de la consola de IAM, debe crear un nuevo proveedor de OIDC de IAM.

Valide las políticas de rol de IAM y la configuración de la política de confianza

Es posible que su rol de IAM no tenga la gama completa de permisos que espera que se le asignen a ese rol. La política de relaciones de confianza de su rol de IAM también podría tener errores de sintaxis si creó su rol de IAM mediante la consola de administración de AWS o AWS CLI.

Para validar sus políticas de rol de IAM y comprobar si hay errores de sintaxis en la política de confianza, haga lo siguiente:

1.    Abra la consola de IAM.

2.    En el panel de navegación, elija Roles (Roles) y luego elija su rol.

3.    Seleccione la pestaña Permissions (Permisos) en la página del rol y, a continuación, compruebe que todos los permisos necesarios están asignados al rol.

4.    Elija la pestaña Trust Relationships (Relaciones de confianza) y luego elija Edit trust relationship (Editar las relaciones de confianza).

5.    En el documento de política de la relación de confianza, compruebe que el formato de la política coincide con el formato de la siguiente política 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"
        }
      }
    }
  ]
}

En la política JSON anterior, revise el formato de la línea de propiedad Federated y de la línea de propiedad StringEquals. En la línea Federated, confirme que el código de región de AWS (your-region-code), el ID de cuenta (your-account-id) y el identificador OIDC único (EXAMPLE_OIDC_IDENTIFIER) tienen el formato correcto. En la línea StringEquals, confirma que el código de región (tu código de región), el identificador único OIDC (EXAMPLE_OIDC_IDENTIFIER), el espacio de nombres de Kubernetes (tu espacio de nombres) y la cuenta de servicio de Kubernetes name (tu-espacio de nombres) tienen el formato correcto.

6.    Si edita el documento de política para corregir errores de formato, elijaUpdate Trust Policy (Actualizar política de confianza).

Confirme que su cuenta de servicio existe y que tiene una anotación con el formato correcto para el ARN del rol de IAM

1.    Confirme que su cuenta de servicio de Kubernetes existe:

$ kubectl get serviceaccount YOUR_ACCOUNT_NAME -n YOUR_NAMESPACE -o yaml

Nota: Reemplace YOUR_ACCOUNT_NAME por el nombre de su cuenta. Reemplace YOUR_NAMESPACE por su espacio de nombres.

Si el comando anterior no devuelve un nombre de cuenta de servicio, cree una cuenta de servicio (desde el sitio web de Kubernetes).

2.    Confirme que su cuenta de servicio tiene el nombre que espera y que su anotación role-arn tiene el formato correcto. Por ejemplo:

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

Use un pod de prueba para comprobar que la cuenta de servicio funciona

Puede comprobar si la cuenta de servicio funciona correctamente si ejecuta un pod de prueba. A continuación, compruebe si el pod puede montar las variables de entorno correctamente y asumir el rol de IAM especificado.

Nota: Puede experimentar un problema relacionado con las credenciales de la aplicación aunque la característica Roles de IAM para cuentas de servicio funcione correctamente. También puede experimentar este problema si su pod tiene las variables de entorno correctas. Para evitar este problema, puede utilizar una imagen de contenedor de AWS CLI para la verificación.

1.    Cree un archivo YAML local denominado awscli-pod.yaml. Por ejemplo:

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

Nota: Reemplace YOUR_SERVICE_ACCOUNT por el nombre de su cuenta de servicio de Kubernetes.

2.    Cree el pod de prueba (desde el archivo YAML) en su espacio de nombres:

$ kubectl apply -f ./awscli-pod.yaml -n YOUR_NAMESPACE

Nota: Reemplace YOUR_NAMESPACE por su espacio de nombres.

3.    Confirme que el pod awscli tiene las variables de entorno correctas:

$ kubectl exec -n YOUR_NAMESPACE awscli env | grep AWS

Salida:

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.    Confirme que el pod de prueba utiliza el rol de IAM correcto:

$ kubectl exec -it awscli -n YOUR_NAMESPACE -- aws sts get-caller-identity

Salida:

{
    "UserId": "REDACTEDY471234567890:botocore-session-1632772568",
    "Account": "012345678912",
    "Arn": "arn:aws:sts::012345678912:assumed-role/your-iam-role/botocore-session-1632772568"
}

Anote el valor de Arn, incluido el nombre del rol de IAM (your-iam-role), que recibe en el resultado del comando del paso 4.

5.    Elimine el pod awscli después de verificar el rol de IAM:

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

Si el pod awscli muestra el rol de IAM correcto, la característica Roles de IAM para cuentas de servicio funciona correctamente.

Los pasos anteriores confirman que el token de IAM está montado correctamente en el pod. Si su aplicación sigue sin poder usar el archivo token correctamente, es probable que haya un problema a nivel de aplicación o SDK. Es probable que este problema esté relacionado con la forma en que la aplicación captura las credenciales de AWS. Para obtener más información, consulte Uso de la cadena de proveedores de credenciales predeterminadas y Credenciales (en el sitio web de Boto3).


¿Le resultó útil este artículo?


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