プロファイルがたくさん書いている ~/.aws/config を薄くする

AWS アカウントを複数使っていると~/.aws/config が大きくなりがちで、複数の組織に跨ったプロファイルが書かれている場合、プロファイル名の重複や誤編集などあります。組織ごとに分離できたら若干安全になる気がします。 今回、任意のプロファイルを ~/.aws/config から分離することができたので、その方法について書きます。

AWS CLI は環境変数 AWS_CONFIG_FILE を参照するため、この仕組みを利用してラッパーコマンドを作成すれば、任意の設定ファイルを指定して aws コマンドを実行できます。以下では、homebrew formula を活用した実装例を示します。

aws/config

[profile XXX]
sso_start_url=https://d-XXX.awsapps.com/start/
sso_account_id=XXX
sso_region=us-east-1
sso_role_name=AWSAdministratorAccess
output=json
region=us-east-1

[profile YYY]
sso_start_url=https://d-XXX.awsapps.com/start/
sso_account_id=XXX
sso_region=us-east-1
sso_role_name=AWSAdministratorAccess
output=json
region=us-east-1

実行ファイル hoge

#!/bin/bash

SUBCOMMAND=$1
shift

case "$SUBCOMMAND" in
  aws)
    AWS_CONFIG_FILE="$HOGE_AWS_CONFIG_FILE" aws "$@"
    ;;
  aws_config_file_path)
    echo "$HOGE_AWS_CONFIG_FILE"
    ;;
  *)
    # TODO: extract as help function
    echo "Usage: hoge-cli <subcommand> [options]"
    echo "Available subcommands:"
    echo "  aws     Run AWS commands with hoge configuration"
    ;;
esac

Formula/hoge-cli.rb

class HogeCli < Formula
  desc "hoge-cli is a command line tool for hoge' developers."
  homepage 'https://github.com/hoge/hoge-cli'

  version '0.1.2'
  url 'git@github.com:hoge/hoge-cli.git', using: :git, tag: 'v0.1.2'
  head 'git@github.com:hoge/hoge-cli.git', using: :git, branch: 'master'

  depends_on 'awscli'

  def install
    libexec.install 'hoge', 'aws/config' => 'aws_config'
    (bin / 'hoge').write_env_script libexec / 'hoge', HOGE_AWS_CONFIG_FILE: "#{libexec}/aws_config"
  end
end

リポジトリは非公開のままで、homebrew でインストールできるようにするためには、以下のようにします。

brew tap hoge/hoge-cli git@github.com:hoge/hoge-cli.git
brew install hoge-cli

これで hogeのサブコマンドとして aws コマンドを実行すると homebrew formula 内で抱えた aws config を参照して aws コマンドが実行されます。

ex: hoge aws s3 ls --profile XXX

まとめ

homebrew formula を使って aws コマンドのプロファイルを切り替える方法を紹介しました。
この方法を使うことで、~/.aws/config が肥大化することを防ぎつつ、特定の組織に閉じたプロファイルに限定した複数の AWS アカウントを使い分けることができます。また、homebrew formula を使うことで、他のユーザーにも簡単に共有できます。

以上。