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

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

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

AWSプロファイルを環境変数で切り替える

AWS環境を操作する場合、省力化や自動化のためにawsコマンドをターミナルから叩くのは日常的ですよね。操作する環境がひとつだけであればよいのですが、テスト環境と本番環境でアカウントが分かれていたり、また複数のプロジェクトに参画している場合に問題となるのがプロファイルの管理です。特に環境を取り違えるような事故がないよう、十分に気をつけなければなりません。

基本的には以下のコマンドを実行し、環境ごとに別のプロファイルを作成して使い分けますよね。

$ aws configure --profile PROFILE_NAME

コマンドを実行する際には、--profileオプションで使用するプロファイルを指定すればOKです。

$ aws subcommand option --p PROFILE_NAME

しかしコマンドを実行する度に、都度プロファイルを指定するのは面倒です。またコマンドラインオプションにプロファイル名が含まれてしまうと、異なる環境でコマンド履歴を使い回せなくなってしまいます。そのため使用するプロファイルは、環境変数で指定するのが便利です。

$ export AWS_PROFILE=PROFILE_NAME

ここでのポイントはdefaultという名前のプロファイルを作成しない点です。defaultプロファイルは、プロファイルを明示的に指定しなかった際に、暗黙的に使われるプロファイルです。いちいちプロファイル名を指定せずに使えるため便利ではあるものの、言いかえると「プロファイルを指定し忘れた時に、意図しない環境をいじってしまう」可能性があります。よくあるのが「新規に立ち上げたターミナルで手クセでコマンドを実行し、意図しない環境をいじってしまった」的なうっかりミスでしょう。特にコマンドが問題なく成功してしまうと、ミスに気づかない可能性も出てきます。そこで筆者は暗黙的に使われるプロファイルを敢えて作らず、プロファイルを指定しない限りコマンドが失敗するようにすることで、この問題を防いでいます。

また設定されているプロファイル一覧を簡単に切り替えられるよう、以下のような簡単なシェル関数を利用しています。なお環境変数AWS_ACCESS_KEY_IDはプロファイル設定よりも優先されるため、この環境変数が設定されていることに気づかないとハマる可能性があります。そこで同時にunsetするようにしています。

function switch_aws() {
    config=$(aws configure list-profiles | sort | fzf --reverse)
    unset AWS_ACCESS_KEY_ID
    unset AWS_SECRET_ACCESS_KEY
    export AWS_PROFILE=$config
}

現在プロファイルが設定済みか、それはどのプロファイルなのかを簡単に目視確認できるよう、シェルのプロンプトに環境変数を常に表示するようにも設定しています。

f:id:h-mizuno:20220121162836g:plain

筆者はKubernetesをkubectlコマンドから操作することも多いのですが、これも同様にkubeconfigファイルをクラスターごとに分割し、KUBECONFIG環境変数で都度指定するようにしています。デフォルトのkubeconfigファイルである「~/.kube/config」は敢えて作成せず、明示的にkubeconfigを指定しない限りkubectlが動作しないようにしている点も同様です。

というわけで、複数環境を使い分ける際に筆者はこうしている、という小ネタでした。

ちなみにここまで書いて、AWS Profile Switcherというツールが存在することを知りました。実現していることは大体同じかと思いますので、こうしたツールを利用してみてもよいのではないでしょうか。