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 credentials

Avant 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 configure n'a jamais été lancé et aucun ~/.aws/credentials n'existe.
  • Variables d'environnement manquantesAWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY ne 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 (ou AWS_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 ~/.aws ne contient pas le fichier que tu as édité.
  • Jeton de session expiré/absent pour une configuration à identifiants temporaires.

Comment le corriger

  1. Configure un profil pour le développement local :
    aws configure     # writes ~/.aws/credentials + ~/.aws/config
  2. 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
  3. 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.
  4. Vérifie que l'identité se résout avant de lancer ton code :
    aws sts get-caller-identity
  5. Pointe vers le bon profil — passe profile_name à boto3.Session(...) ou définis AWS_PROFILE.
  6. Contre DynamoDB Local, n'importe quelles clés fictives fonctionnent — passe des aws_access_key_id/aws_secret_access_key bidon 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

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 credentials

Le 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

Références

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.

Travaille avec DynamoDB sans la Console

Un client de bureau rapide pour DynamoDB qui exécute le vrai SQL que DynamoDB ne peut pas — JOINs, GROUP BY, agrégations — avec édition visuelle et un agent IA sur tes propres clés Bedrock.

Essai gratuit de 30 jours, sans carte bancaire — ensuite la formule Gratuit, sans limite de durée.