とことんDevOps | 日本仮想化技術のDevOps技術情報メディア

DevOpsに関連する技術情報を幅広く提供していきます。

日本仮想化技術がお届けする「とことんDevOps」では、DevOpsに関する技術情報や、日々のDevOps業務の中での検証結果、TipsなどDevOpsのお役立ち情報をお届けします。
主なテーマ: DevOps、CI/CD、コンテナ開発、IaCなど
各種SNSのフォローもよろしくお願いいたします。

direnvでディレクトリ毎に環境をわける

結構昔からあるツールなので、ご存知な方、すでに使ってる方が多いかもしれません。私も7〜8年くらいは使ってる気がします。最近色々な*rcを整理していて、direnvrcも触る機会があったので紹介します。

direnv

direnv.net

ディレクトリ毎に環境変数を切り替えられるツールです。.envrc.envで環境変数をexportしておくことで、ディレクトリに移動したらこの環境変数をロード、ディレクトリから出たらアンロードします。

インストール

direnv.net

それぞれのOS毎にパッケージを用意してくれています。macOSだとHomebrewからインストールするのが簡単そうです。インストールが完了すると、自分が使ってるシェルに合わせてhookを仕込む必要があるかもしれません。

direnv.net

ちなみに、私は以前紹介したasdfからインストールしています。

github.com

asdf plugin add direnv
asdf install direnv latest
asdf global direnv latest

使ってみる

とりあえず、実験用のディレクトリを作ります。

mkdir test
cd test

.envrcに環境変数を記述していきます。

echo 'export AWS_PROFILE=test' >> .envrc

もし、うまくセットアップができているとdirenv: error /path/to/.envrc is blocked. Run `direnv allow` to approve its contentのようなメッセージがでてきます。このままで.envrcは読み込まれないのでdirenv allowを実行して、.envrcを有効化してください。無事に読み込まれると以下のようなメッセージが出力されます。

direnv: loading ~/test/.envrc
direnv: export +AWS_PROFILE

echo $AWS_PROFILEをして、正しく読み込まれているか確認してみてください。

こんな感じで簡単に使い始めることができます。

少し凝った使い方をしてみる

direnvは~/.config/direnv/direnvrcに記述された関数を使うことができます。私の設定をいくつか紹介します。

# {{{ AWS

use_aws() {
    export AWS_PROFILE="$1"
    export AWS_ACCESS_KEY_ID=$(aws configure get aws_access_key_id)
    export AWS_SECRET_ACCESS_KEY=$(aws configure get aws_secret_access_key)
}

use_local_aws_config() {
    local dir="$PWD/.aws"
    install -Ddvm0700 "$dir"

    export AWS_CONFIG_FILE="$dir/config"
    [[ -f "$AWS_CONFIG_FILE" ]] \
        || install -m0600 /dev/null "$AWS_CONFIG_FILE"

    export AWS_SHARED_CREDENTIALS_FILE="$dir/credentials"
    [[ -f "$AWS_SHARED_CREDENTIALS_FILE" ]] \
        || install -m0600 /dev/null "$AWS_SHARED_CREDENTIALS_FILE"

    use_aws default
}

# }}}

# {{{ GCP

use_gcp() {
    export CLOUDSDK_ACTIVE_CONFIG_NAME="$1"
    export USE_GKE_GCLOUD_AUTH_PLUGIN=True
}

# }}}

# {{{ K8s

use_local_kubeconfig() {
    local dir="$PWD/.kube"
    install -Ddv "$dir"
    export KUBECONFIG="$dir/config"
}

# }}}

~/.config/direnv/direnvrcにこのように定義しておいて、作業ディレクトリの.envrcでは、定義された関数を読み込んで使っています。

# そのプロジェクトがAWSを使う場合
use_aws <profile-name>

# そのプロジェクトがGCPを使う場合
use_gcp <config-name>

# そのプロジェクトがK8sを使う場合
use_local_kubeconfig

use_local_*は作業ディレクトリに.awsを作ったり、.kubeを作ったりしてそこからロードします。

まとめ

ディレクトリ毎に環境をわけたい時はdirenvが便利だと思います。関数を定義しておくことで、決まった処理を他の環境でも同じように記述できるようになります。もし、この機能を使っていない方は、ぜひ使ってみてください。