エラー概要(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!!