Comment résoudre les problèmes courants qui sont liés aux charges de travail d‘AWS SDK dans Amazon EKS ?

Lecture de 6 minute(s)
0

J'ai utilisé AWS SDK afin de développer une application de conteneurs pour Amazon Elastic Kubernetes Service (Amazon EKS). Lorsque j'essaie d'appeler les services AWS, je reçois un message d'erreur.

Résolution

Lorsque vous déployez une application de conteneurs qui utilise le SDK AWS sur un cluster Amazon EKS, vous pouvez recevoir l'une des erreurs suivantes :

  • NoCredentialsError : Impossible de localiser les informations d’identification
  • EndpointConnectionError
  • ClientError : Une erreur s’est produite (AccessDenied)
  • ClientError : Une erreur s’est produite (UnauthorizedOperation)

Le message d'erreur spécifique dépend du langage de programmation du SDK AWS utilisé par votre application. Suivez les étapes de dépannage suivantes en fonction de l’erreur reçue.

Impossible de localiser les informations d'identification

Si Amazon EKS ne trouve pas les informations d'identification de votre pod, un message d'erreur similaire au suivant s'affichera :

« File "/usr/local/lib/python2.7/site-packages/botocore/auth.py », line 315, in add_auth
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials »

Cette erreur se produit lorsque vous ne configurez pas les informations d'identification de votre pod, que vous ne les configurez pas correctement ou que la version de votre SDK AWS n'est pas prise en charge.

Pour résoudre cette erreur, utilisez les rôles Gestion des identités et des accès AWS (AWS IAM). Généralement, vous créez et distribuez des informations d'identification AWS pour le client SDK dans l'application ou avec le rôle de l'instance Amazon EC2. Configurez plutôt vos pods afin d’utiliser des rôles IAM pour les comptes de service. Associez un rôle IAM à un compte de service Kubernetes, puis configurez vos pods pour l’utiliser.

**Important :**Les conteneurs de vos pods doivent utiliser une version AWS SDK qui permet d'assumer un rôle IAM via un fichier de jeton d'identité Web OpenID Connect.

Impossible de se connecter à l'URL du point de terminaison

Si votre pod ne parvient pas à communiquer avec les points de terminaison du service AWS, un message d’erreur similaire au suivant s'affichera :

« File "/usr/local/lib/python2.7/site-packages/botocore/retryhandler.py », line 359, dans _check_caught_exception
raise caught_exception
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: « https://ec2.eu-west-1.amazonaws.com/ »
botocore.exceptions.EndpointConnectionError: Could not connect to the endpoint URL: « https://sts.eu-west-1.amazonaws.com/"»

Pour éliminer cette erreur, résolvez les problèmes de DNS et confirmez les points suivants :

Vérifiez si les pods CoreDNS s'exécutent dans le cluster

Exécutez la commande suivante :

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

Vous obtenez un résultat similaire à l'exemple suivant :

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>

Assurez-vous que les composants master disposent d'une capacité suffisante dans le cluster Amazon EKS pour pouvoir exécuter les pods CoreDNS.

Résolution des problèmes liés au point de terminaison de test

Vérifiez que le pod CoreDNS et le pod d'application peuvent résoudre les problèmes liés au point de terminaison du service AWS que votre pod doit appeler. Exécutez la commande suivante :

nslookup SERVICE_ENDPOINT  

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

nslookup ec2.amazonaws.com

**Remarque :**Remplacez SERVICE_ENDPOINT par le point de terminaison imprimé dans le message d'erreur.

Une erreur s'est produite (AccessDenied) lors de l'appel de l'opération AssumeRoleWithWebIdentity

Si votre pod ne parvient pas à demander des informations d’identification de sécurité temporaires, un message d'erreur similaire au suivant s'affichera :

« File "/usr/local/lib/python3.11/site-packages/botocore/client.py », line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: An error occurred (AccessDenied) when calling the AssumeRoleWithWebIdentity operation: Not authorized to perform sts:AssumeRoleWithWebIdentity »

Pour résoudre cette erreur, procédez comme suit :

Confirmez le rôle IAM assumé

Vérifiez que le Pod assume un rôle IAM associé à un compte de service Kubernetes existant dans le cluster. Dans le cas contraire, le pod assume le rôle IAM du nœud Amazon EKS. Pour obtenir l'ARN du rôle IAM du compte de service, exécutez la commande suivante :

kubectl get serviceaccount -A  

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

Remarque : Remplacez serviceaccount_name et namespace_name par vos propres valeurs.

Vous obtenez un résultat similaire à l'exemple suivant :

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

Vérifiez les événements CloudTrail

Vérifiez à quelle identité IAM l’accès est refusé pour exécuter l’opération AssumeRoleWithWebIdentity actionView. Pour ce faire, vérifiez les événements AWS CloudTrail dans la console du même nom.

  1. Connectez-vous à la console CloudTrail.
  2. Dans le volet de navigation, sélectionnez Historique des événements.
  3. Dans le menu déroulant Attributs de recherche, remplacez la sélection Lecture seule par Nom de l’événement.
  4. Dans le champ Entrer un nom d’événement, saisissez AssumeRoleWithWebIdentity. Inspectez la liste des événements qui s'affiche dans le volet de contenu. Voici un exemple d'événement refusé :
{  
    "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"  
    }  
}

Dans ce résultat, la valeur roleArn doit avoir le même rôle IAM que celui que vous avez configuré pour le compte de service du pod.
Le nom d'utilisateur (system:serviceaccount:serverless:aws-sdk) doit correspondre au nom du compte de service et à son espace de nommage. Le format de ce nom est system:serviceaccount:namespace:serviceaccount_name.

Configurez le rôle IAM du compte de service du pod

Dans la console IAM, configurez le rôle IAM du compte de service du pod avec la bonne politique de confiance IAM :

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

Remarque : Remplacez region_code, ACCOUNT_ID, EXAMPLE11111122222333334444ABCD, serviceaccount_name et namespace_name par vos propres valeurs.

Une erreur s'est produite (UnauthorizedOperation)

Le rôle IAM que vous avez configuré pour le compte de service du pod n'est peut-être pas autorisé à appeler d'autres services AWS. Dans ce cas, un message d'erreur similaire au suivant s'affichera :

Fichier « /usr/local/lib/python3.11/site-packages/botocore/client.py », line 960, in _make_api_call
raise error_class(parsed_response, operation_name)
botocore.exceptions.ClientError: Une erreur s'est produite (UnauthorizedOperation) lors de l'appel de l'opération DescribeInstances : Vous n'avez pas l'autorisation pour effectuer cette opération.

Pour résoudre cette erreur, procédez comme suit :

  1. Vérifiez que le pod assume un rôle IAM associé à un compte de service Kubernetes. Pour ce faire, consultez la section précédente Confirmer le rôle IAM assumé. Prenez note du rôle ARN renvoyé par cette étape.
  2. Ouvrez la console IAM. Dans le volet de navigation, choisissez Rôles. Ensuite, recherchez et sélectionnez l'ARN du rôle à l'étape 1.
  3. Dans l’onglet Autorisations, associez les politiques et autorisations IAM nécessaires au rôle IAM.

Pour un exemple de pod, consultez la page Sample pod running AWS Python SDK with web federated identity provider as credential provider sur GitHub.

AWS OFFICIEL
AWS OFFICIELA mis à jour il y a un an