概要
ローカルで起動したコンテナ内からboto3を使用しようとしたら、表題のようにプロファイルが存在しないエラーが出て、少しハマったので、記録として残しておく。
ハマった流れ
ローカル環境でDynamodbローカルを使用しようと思い、Dockerを構築した。
コンテナの起動がうまくいき、Dynamodb Adminなどにもアクセスできたから、「よし、boto3でDynamodbにCreateTableしてみよう」と思い、boto3のsessionを下記のとおり作成した。
session = boto3.session.Session(profile_name=settings.AWS_PROFILE)
そしたら、Dockerに怒られてしまった。
raise ProfileNotFound(profile=profile_name) botocore.exceptions.ProfileNotFound: The config profile (xxxxx) could not be found
エラー内容を見ると、 .aws/credentials
に、指定されたプロファイル名が無いみたいなエラーだったため、ちゃんと環境変数に登録したプロファイル名と同等のプロファイル名がcredentialsファイルの中に記載されているかを確認した。
すると環境変数に記載してあったプロファイル名が記載されていた。。。
解決
imageをbuildしなおしたりコード変えたり色々試したけど一向にエラーが変わらない、、、ってなったのでもうDockerの中からホストマシーンに登録されたファイルが参照できてないのでは??っていう仮説に辿り着きました。
そして色々調べてみると、やはり仮説は当たっており、コンテナのボリューム内にホストマシーンのcredentialsファイルをマウントしてあげる必要があることがわかりました(よく考えればそうだような、、、って思いました)
この方の記事が参考になります。
volumes:
- $HOME/.aws/credentials:/root/.aws/credentials:ro
- $HOME/.aws/config:/root/.aws/config:ro
上記の通り、composeファイル内に記載して、コンテナを起動したら、プロファイルが存在しないエラーが消え、無事boto3のセッションを作ることができました。
まとめ
自身が使用しているツールの基礎知識をしっかり理解しておけば、調査に必要以上に時間を取られることがなかったなぁと反省しているのと、Dockerが勝手に認証情報などを参照できないようになっていることを知り、改めて独立した実行環境なんだなぁと実感しました。
あとこの記事を記載した理由は、表題のエラー内容で検索したら添付している方のリンクに全然辿りつかず、時間を要したため、同じような方がいた際に一助になるかと思い書きました。誰かのためになれば幸いです。