🌀

[AWS] AWS SSO configureがうまくいかないとき実は環境変数の設定だったりする

2024/03/31に公開

初心者にAWS SSOは難しかった...

めちゃくちゃハマった割にとてもしょーもないミスだったので短いです。

最近、AWS SSOでログインしたあと、スイッチロールしつつAWS CLIを使って、ローカルのMacからECRにDockerイメージをプッシュすることがあったんですが、どうもうまくいきませんでした。

結論からいうと、.zshrc内でAWS_PROFILEを環境変数に定義してしまっていたせいで、知らん間に別プロファイル指定してaws ssoコマンドでログインしてたみたいなんですね。

起こったこと

本来であればaws sso configureで設定していく中で、以下のような感じでプロファイル名を聞かれるはずなんですよ。

CLI profile name [123456789011_ReadOnly]: 

でも自分が設定しているとき、なぜか聞かれないのでおかしいなーと思ってたんですね。

ちなみにこれについては、公式のドキュメントも参照してみてください。

しかもaws sso loginするときに、勝手にprofileがついてログインされるんですよ。
そこで、unset AWS_PROFILEしてからaws sso loginしたらうまくいきまして。

そのときは、なんでAWS_PROFILEに値が勝手に入ってるのかわからなかったんですけど、別日にシェルの設定をいじろうと思って、.zshrc眺めてたらexport AWS_PROFILE=hogehogeという一文がありまして、超初心者時代の自分を恨みました。

コマンドで設定したものは直接いじらないほうが良いですね

思ったんですけど、aws sso configureで設定したときにできるconfigファイルのprofile名とかは、あんまりいじらないほうが良いですね。
ややこしくなって、何が問題でうまくいかないのかわからなくなるので。
aws sso configureで設定したのち、自分でいじってみたものの、うまくいかなかくなったっていうのは僕だけかな...
もし同じ人いれば、一旦configは全部消して、もう一回コマンド実行して設定しましょう。

そして一旦触らない。

スイッチロールできるようにする

aws sso configureで、まず以下のように設定します。

SSO session name (Recommended): my-sso # 自分で決める
SSO start URL [None]: https://my-sso-portal.awsapps.com/start # 自分のSSO環境のURL
SSO region [None]: us-east-1 # 自分のSSO環境指定のリージョン
SSO registration scopes [sso:account:access]: # 何も入れずエンターでいい

複数アカウントがある場合、一つ選べと言われるので使いたいアカウントを選びます。
アカウントid: 123456789011を選んだとします。

複数ロールがある場合、一つ選べと言われるので使いたいロールを選びます。
SwitchRoleAccessというの選んだとします。# ロール名は皆さんの環境によって色々とあると思います。

CLI default client Region [None]: us-west-2 # デフォルトのリージョンを自分で決める
CLI default output format [None]: json # 特段理由がなければjsonで良いと思う
CLI profile name [123456789011_ReadOnly]: my-dev-profile # 自分で決める

ここまでいくと、以下のような設定がconfigファイルに追記されます。

[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = SwitchRoleAccess
region = us-west-2
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access

ちなみに環境変数AWS_PROFILEを設定してたらCLI profile nameは聞かれなくて、勝手に変数の値になります。

でここから、Switch Roleの設定をするのですが、以下を追記するだけで問題ないはずです。
Developerというroleにスイッチする想定で書きます。

[profile my-dev-developer] # profile名は自分で決めれます。
source_profile = my-dev-profile # 上で作成したprofile名
role_arn = arn:aws:iam::123456789011:role/Developer # スイッチロールする先のアカウントにあるroleのarn

aws sso loginでログイン後、Docker ImageをECRにプッシュする場合はこんな感じでprofileを指定してdockerログインします。

aws ecr get-login-password --region us-west-1 --profile my-dev-developer | docker login --username AWS --password-stdin 123456789011.dkr.ecr.us-west-1.amazonaws.com

このprofileの位置大事なので、気をつけてください。
一番最後につけたら、それはdockerコマンドにprofileを指定していることになるので。

これでいけると思います。

最後に

ハマることって大事ですよね。
自分の先入観とかが原因でハマってたりするので、ハマって直すこの工程を何回も経験していくことでエンジニアとして強くなってくのかなと思ってます。

ちなみにconfigファイルの全文はこんな感じになります。

[profile my-dev-profile]
sso_session = my-sso
sso_account_id = 123456789011
sso_role_name = SwitchRoleAccess
region = us-west-2
output = json

[sso-session my-sso]
sso_region = us-east-1
sso_start_url = https://my-sso-portal.awsapps.com/start
sso_registration_scopes = sso:account:access

[profile my-dev-developer] 
source_profile = my-dev-profile 
role_arn = arn:aws:iam::123456789011:role/Developer

おつかれさまでした。

Discussion