LoginSignup
1
2

More than 1 year has passed since last update.

【Python×AWS】DockerでBoto3を使ったら「botocore.exceptions.NoCredentialsError: Unable to locate credentials」と表示された場合

Posted at

エラー概要(NoCredentialsError

  • ローカル環境からdockerコンテナで起動したdjangoアプリで、Pythonのboto3を利用してAWSのリソースへアクセスする実装を行ったら、以下のエラーメッセージが返ってきました。
raise NoCredentialsError
botocore.exceptions.NoCredentialsError: Unable to locate credentials
  • 本記事では、上記エラーの原因と解決方法について記載します。

原因の追求: dockerを利用している場合は...

  • 上記のエラーは、AWS SDK for Python(Boto3)を使用してAWSサービスにアクセスしようとした際に、クレデンシャル情報が見つからなかった場合に発生するエラーです。
  • クレデンシャル情報=アクセスキーIDとシークレットアクセスキーであり、これらを設定する必要がありますが、自分の場合は以前既にしていました。まだの方は、以前以下にも整理したのでご参考ください。
  • クレデンシャル情報の記載間違いという記事が多かったので、\.aws\config\.aws\credentialsを確認しましたが、間違いはありませんでした。
  • そんな中、以下の記事を見つけました。
  • そうか、ローカル環境から実施していましたが、、、Dockerを使っている、という点を忘れていました!!

解決策

  • 上記の記事の通り、ローカル環境でクレデンシャル情報を設定していても、dockerコンテナはホストマシンをみに行っているわけではありません。Dockerコンテナ内でAWS SDKを使用する場合は、認証情報を直接コンテナに設定する必要があります。
  • 以下、どちらでも解決できます。dockerイメージを作成する時か、コンテナを起動する時か、の違いです。

Dockerfileで設定する場合

ENV AWS_ACCESS_KEY_ID <アクセスキーID>
ENV AWS_SECRET_ACCESS_KEY <シークレットアクセスキー>

docker-compose.ymlで設定する場合

environment:
- AWS_ACCESS_KEY_ID=<アクセスキーID>
- AWS_SECRET_ACCESS_KEY=<シークレットアクセスキー>
  • 上記どちらでも、設定した状態で再度コンテナを起動すると、エラーメッセージが表示されなくなります。
  • dockerを利用している今回の場合のエラー内容は、「Docker service is」Unable to locate credentialsという意味だったんですね。今回はローカル環境から実施するだけの用途ですが、本番運用する際には環境変数で利用するようにしてください。.envファイルを使えば簡単にできます。Do not hardcode credentials!!
1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2