🔖

AWSクレデンシャルをフォルダ毎に割り当てたい(VSCode)

2023/03/27に公開

はじめに

VSCodeで開発をするときにソースコードやターミナルからAWS環境へアクセスするケースはよくあります。そんな時の困りごととしては

  • 1台のPCで複数のAWSアカウントを扱う際に、クレデンシャルの取り違えが怖い。(開発環境を触っているつもりが本番環境にデプロイしてしまった、など)
  • 複数の顧客やシステムのAWSクレデンシャル(プロファイル含む)が混在してしまって収集がつかなくなる。
  • 後で消そうと思ってソースコードにクレデンシャルを直書きしたものの、これを忘れてGitリポジトリに上げてしまう(絶対ダメ)

などなど様々あると思います。今回はこの辺を解決するための対応方法を考えてみました。
色々調べましたが今回ご紹介する設定方法に言及している記事は今のところ見つかっていないので、同じように困っている人がいれば参考にしてみてもらえればと思います。(探し足りてないだけかもしれませんが。。)

今回のポイント

今回実現する内容は以下の通りです。

  • AWSの名前付きプロファイルを使って複数のAWSアカウントのクレデンシャルを管理する。
  • VSCodeのプロジェクトフォルダ(作業フォルダ)毎に個別のクレデンシャルを設定できるようにする。
  • クレデンシャル自体の管理には標準の「~/.aws/credentials」を使用する。ソースコードにクレデンシャルは絶対に載せない。

これにより フォルダ単位で自動的にクレデンシャル情報、つまりは接続先のAWSアカウントが固定化されるので、環境の取り違えや常時付きまとう不安感、焦りなどから解放されます。

名前付きプロファイルについて

具体的な内容に入る前に名前付きプロファイルについて解説します。
名前付きプロファイルはAWS CLIやSDKを使用してAWSリソースにアクセスするための資格情報を管理する方法の1つで、クレデンシャルの設定ファイル(~/.aws/credentials)に定義します。AWS CLIやSDKなどのコマンドはこの設定ファイルから任意のプロファイルを読み込んで、必要に応じ任意のクレデンシャルを取得することができます。設定ファイルの記載方法はこんな感じです。

[default]
aws_access_key_id = AAAAA
aws_secret_access_key = BBBBB
[profile2]
aws_access_key_id = CCCCC
aws_secret_access_key = DDDDD
[profile2]
aws_access_key_id = EEEEE
aws_secret_access_key = FFFFF

ここでいうと[profile1]と[profile2]がプロファイル名ですね。
このプロファイルの中にアクセスキー&シークレットアクセスキーを定義することで、AWS CLI上で

$ aws s3 ls --profile profile2

といった感じでプロファイル名を指定して実行することで、事前定義したクレデンシャル(アクセスキーとシークレットアクセスキーの組み合わせ)を使ってコマンド実行することができます。

さらに、プロファイルはコマンドライン引数だけでなく環境変数でも指定できます。例えばLinux環境であれば

$ export AWS_PROFILE=user1

のように設定することで、当該コンソール上で実行する全てのコマンドにこのプロファイル情報を適用することができます。こプロファイルの詳細については以下のページに詳しく書かれていますが、今回はこのプロファイルと環境変数の組合せでやりたいことを実現します。

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html

設定方法

それでは具体的な設定方法について記載していきます。

設定ファイルへのプロファイルの指定

前述の名前付きプロファイルを使用します。AWSアカウント毎に分かりやすい名前を付けましょう。今回はこんな感じにしました。

# デフォルトのプロファイル
[default]
aws_access_key_id = AAAAA
aws_secret_access_key = AAAAA

# (1)ECシステムの本番アカウント用プロファイル
[ec-system-production]
aws_access_key_id = BBBBB
aws_secret_access_key = BBBBB

# (2)ECシステムの検証アカウント用プロファイル
[ec-system-staging]
aws_access_key_id = CCCCC
aws_secret_access_key = CCCCC

# (3)ECシステムの開発アカウント用プロファイル
[ec-system-develop]
aws_access_key_id = CCCCC
aws_secret_access_key = CCCCC

マルチアカウント構成で、1つのシステムに本番アカウント、検証アカウント、開発アカウントの3つを割り当てている状態ですね。よくある話かと思います。
ついでにconfigファイルも定義します。ここにはデフォルトリージョンと出力フォーマットを指定します。

# デフォルトのプロファイル
[default]
region=ap-northeast-1
output=json

# (1)ECシステムの本番アカウント用プロファイル
[profile ec-system-production]
region=ap-northeast-1
output=text

# (2)ECシステムの検証アカウント用プロファイル
[profile ec-system-staging]
region=ap-northeast-1
output=text

# (3)ECシステムの開発アカウント用プロファイル
[profile ec-system-develop]
region=ap-northeast-1
output=text

configファイルにはリージョンとAWS CLIの出力形式を設定できます。デフォルトプロファイルだけでOKなら設定する必要はないので、この辺は任意で対応してください。

VSCode上での設定 - setting.json -

setting.jsonはVSCodeの設定を記述するファイルです。VSCode起動時にはまずこのファイルが読み込まれ、記載されている全ての設定が適用されます。またsetting.jsonには「ユーザ設定」と「ワークスペース設定」の2種類があります。

  • ユーザ設定:全てのワークスペースに共通で適用される設定
  • ワークスペース設定:特定のワークスペース(ないしはプロジェクトフォルダ)に対して適用される設定

今回はこのうち「ワークスペース設定」を使用します。
プロジェクトフォルダの最上位に「.vscode」フォルダを作成し、この中に「setting.json」ファイルを用意することで当該プロジェクトフォルダだけに適用される定義を記述することができます。中身はこんな感じです。

{
  // ターミナル起動時に付与する環境変数(全ターミナルで有効になる)
  "terminal.integrated.env.windows": {
    // PowerShellの起動時にRemoteSignedへ変更(PS上でコマンドを実行できるように)
    "PSExecutionPolicyPreference": "RemoteSigned",

    // AWSクレデンシャルのプロファイル定義
    // ここでは「(3)ECシステムの開発アカウント用プロファイル」を設定
    "AWS_PROFILE": "ec-system-develop",
  }
}

ポイントは後半の"AWS_PROFILE"の部分ですね。このように設定することで、VSCode上でターミナルを開いたとき時に自動的に環境変数「AWS_PROFILE」が適用されます。この例ではプロジェクトフォルダに対して必ず「(3)ECシステムの開発アカウント用プロファイル」が適用されることになります。
なおこのsetting.jsonはWindows用のファイルなので、LinuxやMacOSの場合は「terminal.integrated.env.windows」のあたりを適宜見直してください。

VSCode上での設定 - launch.json -

launch.jsonはVSCodeでデバッグ実行する際の設定を記述するためのファイルです。デバック時にはまずこのファイルに記載された内容が読み込まれ、適用後にプログラムが実行されることになります。
ここではsetting.jsonと同様、名前付きプロファイル定義(環境変数)を埋め込みたいと思います。

{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Python: 現在のファイル",
      "type": "python",
      "request": "launch",
      "program": "${file}",
      "console": "integratedTerminal",
      "justMyCode": true,
      "env": {
        // AWSクレデンシャルのプロファイル定義
        // ここでは「(3)ECシステムの開発アカウント用プロファイル」を設定
        "AWS_PROFILE": "ec-system-develop",
      }
    }
  ]
}

上記はPythonのデバッグ設定の例ですね。env.AWS_PROFILEを指定することで環境変数の埋め込みが行えます。
設定は以上で完了です。これ以降VSCode上でターミナルを開いた際には、事前に定義したプロファイルが自動的に適用されることになります。設定してみたけど上手くいかないよ、という方がいらっしゃる場合はVSCodeの再起動をお試しください。

おわりに

今回はVSCode上でAWSクレデンシャルをプロジェクトフォルダ毎に割り当てる方法についてご紹介しました。今のところこの設定だけで作業に支障はない状態ですが、もし他にここに設定入れた方がいいよ、などの情報があれば共有頂けると助かります。
この記事が誰かのお役に立てると幸いです。

Discussion