Comment résoudre les problèmes courants qui sont liés aux charges de travail d‘AWS SDK dans Amazon EKS ?
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.
- Connectez-vous à la console CloudTrail.
- Dans le volet de navigation, sélectionnez Historique des événements.
- Dans le menu déroulant Attributs de recherche, remplacez la sélection Lecture seule par Nom de l’événement.
- 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 :
- 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.
- 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.
- 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.
Contenus pertinents
- demandé il y a 4 moislg...
- demandé il y a 2 anslg...
- demandé il y a 20 jourslg...
- demandé il y a 5 moislg...
- demandé il y a un anlg...
- AWS OFFICIELA mis à jour il y a 5 mois
- AWS OFFICIELA mis à jour il y a 6 mois
- AWS OFFICIELA mis à jour il y a 3 ans