Unable to locate credentials (boto3 / DynamoDB)
TL;DR — boto3/botocore a parcouru toute sa chaîne de fournisseurs d'identifiants — variables d'environnement, fichier partagé ~/.aws/credentials, profil de config, rôle de conteneur/instance — et n'a rien trouvé. Sans identifiants, il ne peut pas signer la requête DynamoDB. Donne à la chaîne une source d'identifiants qu'elle puisse trouver : aws configure, des variables d'environnement, un profil ou un rôle IAM.
Ce que ça signifie
botocore.exceptions.NoCredentialsError: Unable to locate credentialsAvant tout appel DynamoDB, le SDK doit résoudre une clé d'accès + un secret pour signer la requête avec SigV4. Cette erreur est déclenchée à cette étape : aucun fournisseur d'identifiants n'a rien renvoyé. Elle survient avant l'envoi de la requête — ce n'est pas un refus de permission (ce serait AccessDeniedException), c'est l'absence totale d'identité.
Pourquoi ça arrive
- Aucun identifiant configuré —
aws configuren'a jamais été lancé et aucun~/.aws/credentialsn'existe. - Variables d'environnement manquantes —
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYne sont pas définies dans l'environnement du processus (fréquent dans les cron jobs, les conteneurs, la CI). - Profil erroné ou manquant — tu as référencé
--profile foo(ouAWS_PROFILE=foo) mais ce profil n'est pas dans le fichier credentials/config. - Pas de rôle d'instance/conteneur — sur EC2/ECS/Lambda sans rôle IAM attaché, donc le fournisseur de métadonnées ne renvoie rien.
- Répertoire home d'un autre utilisateur — l'exécution sous un compte de service dont le
~/.awsne contient pas le fichier que tu as édité. - Jeton de session expiré/absent pour une configuration à identifiants temporaires.
Comment le corriger
- Configure un profil pour le développement local :
aws configure # writes ~/.aws/credentials + ~/.aws/config - Ou définis des variables d'environnement pour le processus :
export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... export AWS_DEFAULT_REGION=us-east-1 - Sur EC2/ECS/Lambda, attache un rôle IAM — le SDK le récupère automatiquement depuis les métadonnées d'instance/conteneur ; n'intègre pas de clés en dur.
- Vérifie que l'identité se résout avant de lancer ton code :
aws sts get-caller-identity - Pointe vers le bon profil — passe
profile_nameàboto3.Session(...)ou définisAWS_PROFILE. - Contre DynamoDB Local, n'importe quelles clés fictives fonctionnent — passe des
aws_access_key_id/aws_secret_access_keybidon pour que la chaîne ne soit pas vide.
Une vérification rapide hors de ton code : DynoTable se connecte avec les mêmes profils AWS — s'il liste tes tables, les identifiants existent et le problème est de savoir quelle source ton processus lit.
DynoTable + Local
DynoTable résout les identifiants exactement comme la CLI — s'il se connecte mais que boto3 non, ton processus lit un autre répertoire personnel ou n'a pas d'AWS_PROFILE. Configure les profils sous Settings → Profiles et lance Test Connection ; change avec ⌘P.
Pour Local, ajoute un profil avec des clés factices et l'endpoint http://localhost:8000. Vois Se connecter à AWS et Installation. Confirme avec une requête de test dans le Query Builder.
Sources
- Credentials — Boto3 documentation (vérifié le 2026-07-13)
- Error handling — Boto3 documentation (vérifié le 2026-07-13)
FAQ
Comment corriger « Unable to locate credentials » dans boto3 ?
Donne à la chaîne de fournisseurs d'identifiants quelque chose à trouver : lance aws configure pour écrire ~/.aws/credentials, définis AWS_ACCESS_KEY_ID et AWS_SECRET_ACCESS_KEY dans l'environnement du processus, ou attache un rôle IAM sur EC2/ECS/Lambda. Puis vérifie avec aws sts get-caller-identity.
« Unable to locate credentials » est-il la même chose que AccessDeniedException ? Non. NoCredentialsError est déclenchée localement avant l'envoi de la requête, parce qu'aucun fournisseur d'identifiants n'a rien renvoyé. AccessDeniedException vient d'AWS après authentification, quand une identité valide manque de la permission IAM pour l'action.
Reproduire l'erreur
Appelle DynamoDB sans qu'aucun identifiant ne soit résolvable nulle part dans la chaîne — pas de variables d'environnement, pas de fichier d'identifiants partagé, pas de profil, pas de rôle d'instance :
import boto3
boto3.client('dynamodb', region_name='us-east-1').list_tables()Sortie réelle :
NoCredentialsError: Unable to locate credentialsLe message est réputé laconique : il ne nomme aucun des endroits où boto3 a cherché. C'est toute la difficulté de cette erreur, et pourquoi parcourir la chaîne dans l'ordre — environnement, puis fichier partagé, puis profil, puis rôle — vaut mieux que de deviner.
Erreurs liées
- The security token included in the request is invalid — des identifiants ont été trouvés mais AWS les a rejetés.
- AccessDeniedException — identité valide, mais pas de permission IAM pour l'action.
- Missing region in config
- En savoir plus : Running DynamoDB Local — identifiants fictifs contre un endpoint local.
Références
- Credentials — Boto3 documentation
- Error handling — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
Dernière vérification le 2026-07-13 par rapport à la documentation officielle AWS liée ci-dessus.
Reproduit le 2026-07-26 avec boto3 1.43.56 / botocore 1.43.56 — la sortie ci-dessus est reproduite telle quelle.