Unable to locate credentials (boto3 / DynamoDB)
TL;DR — boto3/botocore は認証情報プロバイダーチェーン全体 — 環境変数、共有の ~/.aws/credentials、config のプロファイル、コンテナ/インスタンスのロール — を辿りましたが、何も見つかりませんでした。認証情報がなければ DynamoDB のリクエストに署名できません。チェーンが見つけられる認証情報のソースを与えてください: aws configure、環境変数、プロファイル、または IAM ロールです。
意味
botocore.exceptions.NoCredentialsError: Unable to locate credentialsDynamoDB を呼び出す前に、SDK は SigV4 で署名するためのアクセスキーとシークレットを解決しなければなりません。このエラーはその段階で発生します — どの認証情報プロバイダーも何も返さなかった のです。リクエストが送信される前に起こります。これは権限の拒否(それは AccessDeniedException です)ではなく、アイデンティティがまったく存在しないということです。
発生する理由
- 認証情報が未設定 —
aws configureを一度も実行しておらず、~/.aws/credentialsも存在しない。 - 環境変数の欠落 — プロセスの環境に
AWS_ACCESS_KEY_ID/AWS_SECRET_ACCESS_KEYが設定されていない(cron ジョブ、コンテナ、CI でよくあります)。 - 誤ったプロファイル、またはプロファイルの欠落 —
--profile foo(またはAWS_PROFILE=foo)を指定したのに、そのプロファイルが credentials/config ファイルにない。 - インスタンス/コンテナのロールがない — IAM ロールをアタッチしていない EC2/ECS/Lambda では、メタデータのプロバイダーが何も返しません。
- 別ユーザーのホーム — サービスアカウントとして実行しており、その
~/.awsに編集したファイルがない。 - 一時認証情報の構成で セッショントークンが期限切れ、または存在しない。
修正方法
- ローカル開発向けに プロファイルを設定します:
aws configure # writes ~/.aws/credentials + ~/.aws/config - またはプロセスに環境変数を設定します:
export AWS_ACCESS_KEY_ID=... export AWS_SECRET_ACCESS_KEY=... export AWS_DEFAULT_REGION=us-east-1 - EC2/ECS/Lambda では IAM ロールをアタッチします — SDK がインスタンス/コンテナのメタデータから自動で拾います。キーを埋め込まないでください。
- コードを実行する前に アイデンティティが解決することを確認します:
aws sts get-caller-identity - 正しいプロファイルを指します —
boto3.Session(...)にprofile_nameを渡すか、AWS_PROFILEを設定します。 - DynamoDB Local に対しては どんなプレースホルダーのキーでも動きます — チェーンが空にならないよう、ダミーの
aws_access_key_id/aws_secret_access_keyを渡してください。
コードの外で手早く確認する方法もあります: DynoTable は同じ AWS のプロファイルで接続します — DynoTable がテーブルを一覧できるなら認証情報は存在しており、問題はプロセスがどのソースを読んでいるかです。
DynoTable + Local
DynoTable は CLI と同じやり方で認証情報を解決します — DynoTable は接続できるのに boto3 が接続できないなら、プロセスが別のホームディレクトリを読んでいるか、AWS_PROFILE が抜けています。Settings → Profiles でプロファイルを設定して Test Connection を実行し、切り替えは ⌘P で行ってください。
Local の場合は、ダミーのキーとエンドポイント http://localhost:8000 でプロファイルを追加します。AWS に接続するとインストールを参照してください。確認はクエリビルダーのテストクエリで行いましょう。
出典
- Credentials — Boto3 documentation (2026-07-13 時点で検証)
- Error handling — Boto3 documentation (2026-07-13 時点で検証)
よくある質問
boto3 の「Unable to locate credentials」はどう直せばよいですか?
認証情報プロバイダーチェーンが見つけられるものを与えてください。aws configure を実行して ~/.aws/credentials を書き出す、プロセスの環境に AWS_ACCESS_KEY_ID と AWS_SECRET_ACCESS_KEY を設定する、あるいは EC2/ECS/Lambda で IAM ロールをアタッチする、のいずれかです。その後 aws sts get-caller-identity で確認しましょう。
「Unable to locate credentials」は AccessDeniedException と同じですか? いいえ。NoCredentialsError は、どの認証情報プロバイダーも何も返さなかったために、リクエストが送信される前にローカルで発生します。AccessDeniedException は認証の後に AWS から返るもので、有効なアイデンティティにそのアクションの IAM 権限がない場合です。
再現方法
チェーンのどこからも認証情報を解決できない状態で DynamoDB を呼び出します — 環境変数なし、共有の認証情報ファイルなし、プロファイルなし、インスタンスロールなしです。
import boto3
boto3.client('dynamodb', region_name='us-east-1').list_tables()実際の出力:
NoCredentialsError: Unable to locate credentialsこのメッセージはそっけないことで有名です。boto3 が探した場所を1つも挙げてくれません。それがこのエラーの難しさのすべてであり、だからこそ推測するより、チェーンを順番に — 環境変数、次に共有ファイル、次にプロファイル、次にロール — 潰していく方が勝ります。
関連するエラー
- The security token included in the request is invalid — 認証情報は見つかったが、AWS がそれを拒否した。
- AccessDeniedException — 有効なアイデンティティだが、そのアクションの IAM 権限がない。
- 設定にリージョンがない
- Learn: Running DynamoDB Local — ローカルエンドポイントに対するダミーの認証情報。
参考資料
- Credentials — Boto3 documentation
- Error handling — Boto3 documentation
- Error handling with DynamoDB — Amazon DynamoDB Developer Guide
最終検証日 2026-07-13、上記にリンクした公式 AWS ドキュメントに照らして確認しました。
2026-07-26 に boto3 1.43.56 / botocore 1.43.56 で再現しました — 上記の出力はそのままの逐語です。