¿Cómo puedo solucionar los problemas habituales relacionados con cargas de trabajo del SDK de AWS en Amazon EKS?

6 minutos de lectura
0

Utilicé AWS SDK para desarrollar una aplicación de contenedores para Amazon Elastic Kubernetes Service (Amazon EKS). Cuando intento hacer llamadas a los servicios de AWS, aparece un error.

Resolución

Al implementar una aplicación de contenedores que usa AWS SDK en un clúster de Amazon EKS, es posible que reciba uno de los siguientes errores:

  • NoCredentialsError: No se pueden encontrar las credenciales
  • EndpointConnectionError
  • ClientError: Se ha producido un error (AccessDenied)
  • ClientError: Se ha producido un error (UnauthorizedOperation)

El mensaje de error específico depende del lenguaje de programación AWS SDK que utilice la aplicación. Consulte los siguientes pasos de solución de problemas para su error.

No se pueden encontrar las credenciales

Si Amazon EKS no encuentra las credenciales de su pod, aparecerá un error similar al siguiente mensaje:

«Archivo «/usr/local/lib/python2.7/site-packages/botocore/auth.py», línea 315, en add_auth
generar NoCredentialsError
botocore.exceptions.NoCredentialsError: No se pueden encontrar las credenciales»

Este error se produce cuando no configura las credenciales del pod, no las configura correctamente o su versión del SDK de AWS no es compatible.

Para resolver este error, utilice los roles de AWS Identity and Access Management (IAM). Normalmente, las credenciales de AWS se crean y distribuyen para el cliente del SDK en la aplicación o con el rol de la instancia de Amazon EC2. En su lugar, configure los pods para que utilicen los roles de IAM para cuentas de servicio. Asocie un rol de IAM a una cuenta de servicio de Kubernetes y, a continuación, configure los pods para usar la cuenta de servicio.

Importante: Los contenedores de los pods deben usar una versión del AWS SDK que permita asumir un rol de IAM a través de un archivo de token de identidad web de OpenID Connect.

No se ha podido conectar con la URL del punto de conexión

Si su pod no puede comunicarse con los puntos de conexión del servicio de AWS, aparecerá un error similar al siguiente mensaje:

«Archivo «/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py", línea 359, en _check_caught_exception
generar caught_exception
botocore.exceptions.EndpointConnectionError: No se pudo conectar a la URL del extremo: «https://ec2.eu-west-1.amazonaws.com/»
botocore.exceptions.EndpointConnectionError: No se pudo conectar a la URL del extremo: «sts.eu-west-1.amazonaws.com/»»

Para resolver este error, solucione los problemas de DNS y confirme los siguientes puntos:

Comprobar si los pods de CoreDNS se están ejecutando en el clúster

Ejecute el comando siguiente:

kubectl get pods --namespace=kube-system -l k8s-app=kube-dns -o wide

Verá un resultado similar al ejemplo siguiente:

NAME                       READY   STATUS    RESTARTS   AGE   IP                NODE                                            NOMINATED NODE   READINESS GATES  
coredns-7f85bf9964-kz8lp   1/1     Running   0          15d   192.168.100.36    ip-192-168-101-156.eu-west-1.compute.internal   <none>           <none>  
coredns-7f85bf9964-wjxvb   1/1     Running   0          15d   192.168.135.215   ip-192-168-143-137.eu-west-1.compute.internal   <none>           <none>

Asegúrese de tener nodos de trabajo en ejecución con capacidad suficiente en el clúster de Amazon EKS para ejecutar correctamente los pods de CoreDNS.

Resolver el punto de conexión de la prueba

Compruebe que el pod de CoreDNS y el pod de la aplicación puedan resolver el punto de conexión del servicio de AWS al que desea que llame su pod. Ejecute el comando siguiente:

nslookup SERVICE_ENDPOINT  

nslookup ec2.eu-west-1.amazonaws.com  

nslookup ec2.amazonaws.com

Nota: Sustituya SERVICE_ENDPOINT por el PUNTO DE CONEXIÓN que aparece impreso en el mensaje de error.

Se ha producido un error (AccessDenied) al llamar a la operación AssumeRoleWithWebIdentity

Si el pod no puede solicitar una credencial de seguridad temporal, aparecerá un error similar al siguiente mensaje:

«Archivo «/usr/local/lib/python3.11/site-packages/botocore/client.py", línea 960, en _make_api_call
generar error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Se ha producido un error (AccessDenied) al llamar a la operación PutBucketLogging: No está autorizado a realizar sts:AssumeRoleWithWebIdentity»

Para resolver este error, siga estos pasos:

Confirmar el rol de IAM asumido

Confirma que el pod asuma un rol de IAM asociado a una cuenta de servicio de Kubernetes que exista en el clúster. De lo contrario, el pod asume el rol de IAM del nodo de Amazon EKS. Para obtener el ARN del rol de IAM de la cuenta de servicio, ejecute el siguiente comando:

kubectl get serviceaccount -A  

kubectl describe serviceaccount serviceaccount_name -n namespace_name | grep -i arn

Nota: Sustituya serviceaccount_name y namespace_name por sus propios valores.

Verá un resultado similar al ejemplo siguiente:

Annotations: eks.amazonaws.com/role-arn: arn:aws:iam::11112222333:role/AccessEC2role

Consulte los eventos de CloudTrail

Compruebe a qué identidad de IAM se le deniega el acceso para ejecutar AssumeRoleWithWebIdentity actionView. Para ello, compruebe los eventos de AWS CloudTrail en la consola de CloudTrail.

  1. Inicie sesión en la consola de CloudTrail.
  2. En el panel de navegación, seleccione Historial de eventos.
  3. En el menú desplegable Lookup attributes, cambie la selección de Read-only a Event name.
  4. En la barra de búsqueda Enter an event name, escriba AssumeRoleWithWebIdentity. Inspeccione la lista de eventos que aparece en el panel de contenido. Consulte el siguiente ejemplo de un evento denegado:
{  
    "eventVersion": "1.08",  
    "userIdentity": {  
        "type": "WebIdentityUser",  
        "userName": "system:serviceaccount:serverless:aws-sdk"  
    },  
    "eventName": "AssumeRoleWithWebIdentity",  
    "errorCode": "AccessDenied",  
    "errorMessage": "An unknown error occurred",  
    "requestParameters": {  
        "roleArn": "arn:aws:iam::11112222333:role/AccessEC2role",  
        "roleSessionName": "botocore-session-1675698641"  
    }  
}

En este resultado, roleArn debe tener el mismo rol de IAM que configuró para la cuenta de servicio del pod.
UserName (system:serviceaccount:serverless:aws-sdk) debe coincidir con el nombre de la cuenta de servicio y su espacio de nombres. El formato de este nombre es system:serviceaccount:namespace:serviceaccount_name.

Configure el rol de IAM de la cuenta de servicio del pod

En la consola de IAM, configure el rol de IAM de la cuenta de servicio del pod con la declaración de política de confianza de IAM correcta:

     {  
            "Effect": "Allow",  
            "Principal": {  
                "Federated": "arn:aws:iam::ACCOUNT_ID:oidc-provider/oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD"  
            },  
            "Action": "sts:AssumeRoleWithWebIdentity",  
            "Condition": {  
                "StringEquals": {  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:sub": "system:serviceaccount:namespace_name:serviceaccount_name",  
                    "oidc.eks.region_code.amazonaws.com/id/EXAMPLE11111122222333334444ABCD:aud": "sts.amazonaws.com"  
                }  
            }  
    }     

Nota: Sustituya region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_name and namespace_name por sus propios valores.

Se ha producido un error (UnauthorizedOperation)

Es posible que el rol de IAM que configuró para la cuenta de servicio del pod no esté autorizado para llamar a otros servicios de AWS. En este caso, aparecerá un error similar al siguiente mensaje:

Archivo «/usr/local/lib/python3.11/site-packages/botocore/client.py", línea 960, en _make_api_call
generar error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Se ha producido un error (UnauthorizedOperation) al llamar a la operación DescribeInstances: No está autorizado a realizar esta operación.

Para resolver este error, siga estos pasos:

  1. Confirme que el pod asume un rol de IAM asociado a una cuenta de servicio de Kubernetes. Para ello, consulte la sección anterior, Confirmar el rol de IAM asumido. Tenga en cuenta el ARN del rol que devuelve este paso.
  2. Abra la consola de IAM. En el panel de navegación, elija Roles. A continuación, busque y seleccione el ARN del rol del paso 1.
  3. En la pestaña Permissions, adjunte los permisos de la política de IAM necesarios para el rol de IAM.

Para ver un pod de ejemplo, consulte Ejemplo de pod que ejecuta AWS Python SDK con un proveedor de identidades federadas web como proveedor de credenciales en GitHub.

OFICIAL DE AWS
OFICIAL DE AWSActualizada hace un año