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

6 minutos de lectura
0

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

Resolución

Nota: Si se muestran errores al ejecutar comandos de la Interfaz de la línea de comandos de AWS (AWS CLI), consulte Troubleshoot AWS CLI errors. Además, asegúrese de utilizar la versión más reciente de la AWS CLI.

Comprobación de que tiene un proveedor de identidad de OIDC de IAM para su clúster de Amazon EKS

Cree un proveedor de OpenID Connect (OIDC) de IAM para su clúster, si aún no lo tiene. Debe tener un proveedor de identidad de OIDC para que su clúster pueda usar un rol de IAM en su cuenta de servicio.

A continuación, compruebe que el proveedor de identidad de OIDC esté configurado correctamente:

  1. Abra la consola de IAM. En el panel de navegación, elija Proveedores de identidad.
  2. En la columna Proveedor, identifique y anote la URL del proveedor de OIDC.
  3. En otra pestaña o ventana, abra la consola de Amazon EKS. A continuación, elija Clústeres en el panel de navegación.
  4. Elija su clúster y, a continuación, elija la pestaña Configuración.
  5. En la sección 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 de su 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.

Validación de 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 todos los permisos necesarios. 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 la 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 y, a continuación, elija su rol.
  3. Seleccione la pestaña Permisos en la página del rol y, a continuación, compruebe que todos los permisos necesarios estén asignados al rol.
  4. Seleccione la pestaña Relaciones de confianza y, a continuación, elija Editar la relación 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",
              "oidc.eks.your-region-code.amazonaws.com/id/EXAMPLE_OIDC_IDENTIFIER:aud": "sts.amazonaws.com"
            }
          }
        }
      ]
    }
    En la política JSON, 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 único de OIDC (EXAMPLE_OIDC_IDENTIFIER) tienen el formato correcto. En la línea StringEquals, confirme que el código de región (your-region-code), el identificador único de OIDC (EXAMPLE_OIDC_IDENTIFIER), el espacio de nombres de Kubernetes (your-namespace) y el nombre de la cuenta de servicio de Kubernetes (your-namespace) tienen el formato correcto.
  6. Si edita el documento de política para corregir errores de formato, elija Actualizar la política de confianza.

Confirmación de 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: Sustituya YOUR_ACCOUNT_NAME por el nombre de su cuenta. Sustituya YOUR_NAMESPACE por su espacio de nombres.
    Si el comando anterior no devuelve un nombre de cuenta de servicio, cree una cuenta de servicio. Para obtener más información, consulte Use more than one ServiceAccount en el sitio web de Kubernetes.

  2. Confirme que su cuenta de servicio tiene el nombre que espera. Además, confirme que su anotación role-arn tenga 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

Utilización de un pod de prueba para comprobar que la cuenta de servicio funciona

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

  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: Sustituya 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: Sustituya YOUR_NAMESPACE por su espacio de nombres.

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

    $ kubectl exec -n YOUR_NAMESPACE awscli -- env | grep AWS

    El resultado es similar al siguiente:

    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

    El resultado es similar al siguiente:

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

    Anote el valor Arn, incluido el nombre del rol de IAM que recibe en este resultado.

  5. Después de comprobar el rol de IAM, elimine el pod awscli:

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

    Si el pod awscli muestra el rol de IAM correcto, la característica de 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 de 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 o porque la versión del SDK no es compatible. Para obtener más información, consulte Uso de la cadena predeterminada de proveedores de credenciales, Credentials en el sitio web de Boto3 y Uso de IRSA con el SDK de AWS.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año