【AWS CLIでアカウント切り替えできない】TerraformでAWSアカウント別に構築する時に躓いた話
問題
- いつもは個人のAWSアカウントを持っていて、AWS CLIのAWS ConfigureではデフォルトのIAMアクセスキーとシークレットアクセスキーを使って構築している
- しかし、今回は諸事情で自分のPCから別のAWSアカウントにAWS CLIを使って構築したい
解決策
問題に対する解決策は以下の通り
- 別のAWSアカウントで作成されたIAMユーザーのアクセスキー/シークレットアクセスキーをAWS Configureでプロファイル登録
- そのConfigure設定で現在使われているユーザーがどのユーザーなのかを調べる
- AWS CLI でサポートされている環境変数
AWS_DEFAULT_PROFILE
で、切り替えたいプロファイルを設定する - もしその際、設定が切り替わらない場合、bashやzshrcでアクセスキーや/シークレットアクセスキーが設定されてないか確認してみる
アカウント登録
別のアカウントで作成されたIAMユーザーのプロファイルを作成します。
※今回はtestユーザーで入力
aws configure --profile test
コマンド入力後、以下の順に設定
AWS Access Key ID [None]: アクセスキーを入力
AWS Secret Access Key [None]: シークレットアクセスキーを入力
Default region name [None]: リージョン入力を入力(ap-northeast-1など)
Default output format [None]: json
設定内容を確認
cat ~/.aws/credentials
すると以下の表示になります。
$ cat ~/.aws/credentials
[default]
aws_access_key_id = AKIXXXXXXXXXXXXXXX
aws_secret_access_key = XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
[test]
aws_access_key_id = AKIYYYYYYYYYYYYYYY
aws_secret_access_key = YYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYY
上記のようにtestユーザーのプロファイルが登録されていることを確認します。
一旦ここで、
aws s3 ls
と入力してみてください。
入力結果が意図するAWSアカウント上のS3バケット一覧が表示されるか確認します。
AWS CLIで正しくAWSコンソールを操作できているか確認するためによく使われます。
aws s3 ls --profile test
とプロファイル指定で入力すれば、testユーザーが存在するAWSアカウント上のS3バケットが表示されるはずです。
(credentials上でtest
でアクセスキーなどをプロファイル登録しているため)
バケット一覧が問題なく表示されれば、設定は成功しています。
ではここからアカウントの切り替えをおこないます。
アカウント切り替え
以下のコマンドを入力
aws configure list
すると以下のような表示になります。
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile <not set> None None
access_key ****************XXXX shared-credentials-file
secret_key ****************XXXX shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config
今現在、使用されているAWS CLIのアカウント情報が出力されます。
プロファイルは<not set>
となっているので~/.credentials
のデフォルトでのプロファイルが使用されるはずです。
ではここからアカウントの切り替えをおこないます。
以下のコマンドを入力
export AWS_DEFAULT_PROFILE=test
AWS_DEFAULT_PROFILE
はAWS CLIでサポートされている環境変数名です。
exportで環境変数を設定後、もう一度確認します。
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile test env ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key ****************YYYY shared-credentials-file
secret_key ****************YYYY shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config
上記のようにprofile
がtest
に切り替わっていれば成功です。
あとはTerraformで通常通り、コマンドを入力すれば構築可能です。
問題
しかし、exportでアカウント切り替えを試みても変更しない場合があります。
設定したはずなのに、aws configureのリストを確認すると以下のような表示になることがあります。
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile test env ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key ****************XXXX env
secret_key ****************XXXX env
region ap-northeast-1 config-file ~/.aws/config
ここで注意したいのはaccess_keyとsecret_keyのTypeがenv
になっているかです。
envになっているとローカルPCで設定された環境変数が、Configureで設定されたプロファイル設定よりも優先されてしまいます。
AWS CLI は次の環境変数をサポートしています。
AWS_ACCESS_KEY_ID
IAM ユーザーまたはロールに関連付けられる AWS アクセスキーを指定します。
定義されている場合、この環境変数はプロファイル設定 aws_access_key_id の値よりも優先されます。アクセスキー ID をコマンドラインオプションを使用して指定することはできません。
https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-envvars.html
macだとzshrc
で環境変数が登録されている可能性が高いので、
cat ~/.zshrc
で、export AWS_ACCESS_KEY_ID=AKIXXXXXXXXXXXX
などと設定されていないかを確認してみてください。
下記のコマンドでも設定されているか確認できます。
echo $AWS_ACCESS_KEY_ID
echo $AWS_SECRET_ACCESS_KEY
zshrcを変更した後は
source ~/.zshrc
で再読み込みを行なって反映させます。
その後にもう一度、
export AWS_DEFAULT_PROFILE=test
を入力して、credentialsからアクセスキーとシークレットアクセスキーを読み込ませます。
$ aws configure list
Name Value Type Location
---- ----- ---- --------
profile test env ['AWS_PROFILE', 'AWS_DEFAULT_PROFILE']
access_key ****************YYYY shared-credentials-file
secret_key ****************YYYY shared-credentials-file
region ap-northeast-1 config-file ~/.aws/config
Typeの値がshared-credentials-file
に変わりました。
aws s3 lsコマンドで意図するアカウントのバケット表示できれば成功です!
お疲れ様でした。
Discussion