🔋

【AWS CLIでアカウント切り替えできない】TerraformでAWSアカウント別に構築する時に躓いた話

2022/09/23に公開

問題

  • いつもは個人の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でサポートされている環境変数名です。

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

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

上記のようにprofiletestに切り替わっていれば成功です。

あとは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