direnv環境下でpipenv利用時のAWS_PROFILE指定でハマったこと

Pythonの仮想環境下で、各設定ファイルに異なるAWS_PROFILEを指定した場合の、読み込まれるタイミングと気をつけるべきことについて触れました。
2020.02.29

はじめに

普段AWS_PROFILEの指定は、コマンド実行時に以下のように指定していました。

export AWS_PROFILE=xxxxxxx
# any command

pipenv run時に事前export指定したAWS_PROFILEが適用されずに困ったことがありました。順を追って考えればすぐ判ることだったのですが、コマンド自体を定形化して特に都度の思考を必要としなかったことが原因でした。

AWS_PROFILEに関わらず今後もやってしまいそうなため、自戒含めてまとめてみました。

今回の環境変数の読み込み

direnv 環境にて、pipenv runを実行する際に、コマンド実行前にAWS_PROFILEをexportするという流れでした。

なお、各設定ファイルで夫々別の AWS_PROFILE を指定しつつ、コマンド実行時のexportもまた違うAWS_PROFILEでした。

.envrc

比較的ポリシーを多く許可して、aws-cliを動作させることが目的の設定です。

export AWS_PROFILE=<project_name>

.env

ReadOnlyのポリシーにしぼり、ローカル環境で外部に影響を及ぼさない前提にてバッチを動かすことが目的の設定です。

AWS_PROFILE=test

export on terminal

プロファイルを明示してhistoryに残すことが目的の設定です。指定するプロファイルは都度変わります。

export AWS_PROFILE=cicd_profile

尚、今回意図したとおりに読み取らせたかったのは terminal で設定したプロファイルであり、実際に動作したのは .env でした。

それぞれのファイルに設定した環境変数が作用するタイミング

設定した場所によっては状況次第で動作しないケースがありえます。作用するのはおおよそ以下の操作前提になります。

.envrc

direnv環境下で他にAWS_PROFILEの指定がない場合。

.env

pipenv runpipenv shell実行時。

気をつけるべき事

.env にAWS_PROFILE を設定した場合、pipenv経由では事前にexportしても無意味となります。実行するバッチファイル側に引数として渡すような設計にするか、都度.envの中身を一時的に書き換える必要があります。可能であればプロファイル毎にディレクトリを用意すべきかもしれません。

ここまでの変則的なやり方自体が稀かもしれませんが、類似した構成の場合に同じ様なトラブルが発生した際の参考になれば幸いです。