🖥️

AWS CLIのSSO設定

2024/04/23に公開

本記事は、2022年12月9日に公開済みの記事を移行して再掲載したものです。

はじめに

Qiita - フェズ Advent Calendar 2022 の9日目。サーバーサイド担当の中川です。

最近、急に寒くなって布団の吸引力がやばいです。

今回は AWS CLI で SSO する時の aws configure sso の使い方と、個人的に「おっ」と思った割りとどーでもいい(しかし、もしかしたらお役立ちかもしれない) Tipsを書いていこうと思います。

手元の環境

  • OS: Windows 11 (WSL2 + Ubuntu)
    • ※手がThinkpadに最適化されてしまっている為、Macも使いますが、メインはWin(聞かれてない)
  • Tool: aws-cli/2.9.4

SSOでログインする

AWS へログインするにあたり Google Workspaces 等と連携して SSO する環境が増えていると思います。

アカウント管理が簡潔になるので非常に便利なのですが、ターミナル利用時は、基本的に一度ブラウザを経由してログインセッション(あるいはクレデンシャル)を取得する事になるかと思います。

Webコンソールにログイン

まずは普通にWebコンソールにログインする場合、
https://XXXXX.awsapps.com/start な感じのURLからログインしてして、

対象のアカウント+ロールを探し、「Management console」のリンクからログインするかと思います。

AWS CLI でログイン

問題は CLI 側です。CLI であっても、SSOを使う場合はブラウザを経由する必要があり、例えば、上記URLの「Command line or programmatic access」から、下記のような CLI 用の環境変数を確認する事ができます。

この情報を元に ~/.aws/credentials を編集すれば aws コマンドを使えるようになりますが、ブラウザ開いて環境変数確認してコピーしてターミナルでクレデンシャル開いてペーストして…という作業を毎回するのも、いささか面倒です。

AWS CLI の SSO 設定

そこで登場するのが AWS CLI の SSO 設定。
以下のコマンドで今後の作業が色々と簡略化できます。

$ aws configure sso

いくつか設定項目がありますが、例えば、以下のように設定します。

  • SSO session name:
    • 最近追加された項目のようですが、セッション名を自由に付けられるようです。どういった用途なのかドキュメントを見つけることが出来なかったのですが、直前に作ったセッション名と同じセッション名を使うと、ブラウザを起動してのSSOをスキップでき、アカウントとロールを選択し直すところから作業できたので、スイッチロールなんかをよくするケースなどで大活躍なのかもしれません。
    • アカウントやロール、スタートURLを変えたりしない場合は、テキトーに名前を付けて、同じ名前を使いまわせば良いのかもしれません。
    • ちなみに、この項目を未入力にすると、configファイルの生成が旧来のフォーマットになります。※ ~/.aws/config への出力内容が変わるので良かったら試してみてください
  • SSO start URL:
    • AWS アクセスポータルの URL。SSOログインする時のURLです。
  • SSO region:
    • SSO用のリージョン。東京リージョンであれば ap-northeast-1 になります。
  • SSO registration scopes:
    • こちらもドキュメントがすぐに見当たらなかったので、デフォルトの値 ”sso:account:access” のままにしてしまっていますが、現状、特に困っていません。
      ただ、こちらのRedditの投稿 を見た感じ Terraform 周りで不便が生じているようで、公式にお問合せしている最中のようです。
  • CLI default client Region:
    • この辺は適宜。東京リージョンであれば ap-northeast-1
  • CLI default output format:
    • この辺は適宜。jsonにしちゃってます。
  • CLI profile name:
    • AWS CLI を利用する際に必要となるプロフィール名。指定しなければ、 <SSO Role Name>-<SSO Account ID> な感じで命名されます。
    • このプロフィール名は、AWS CLI でコマンド打つ時に都度必要になるので、頻繁にコマンド操作する時は、ちょっと工夫が必要になってきます。その辺は後述します。

AWS CLIで引き続き、SSOログイン

設定完了後、しばらくは作業が出来ますが、時間が経つとセッションの有効期限が切れるので、再度SSOログインが必要になります。

$ aws sso login --profile prof-x

--profile でプロフィール名を指定して再度ログインする事で、SSO設定時に指定した値(ロール、アカウント、リージョン等)は引き継がれた状態で作業が継続できます。

Tips的な何か

プロフィール名の指定

SSOで無事ログインできましたが、AWSコマンド打つたびに --profile でプロフィール名を手打ちするのも手間なので、「環境変数に入れる」「Bash aliasにする」などの対応をする事になるかと思います。

  • 環境変数 [AWS_PROFILE](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-profiles.html) を設定する

    $ export AWS_PROFILE=prof-x
    

    こうやって AWS_PROFILE にSSO時に定義したプロファイル名を指定すれば、以後 --profile オプションは不要です。
    切り替えることがほぼ無ければ .bashrc 等に書いてしまっても良いですし、ディレクトリ毎に環境変数が切り替えられる direnv なんかと組み合わせるのも良いかもです。

  • Bash alias にする
    ~/.bashrc

    alias aws-x="aws --profile prof-x"
    

    みたいなBash aliasを ~/.bashrc 辺りに仕込んでおけば、

    $ aws-x s3 ls
    

    な感じで、 --profile 指定なしでコマンドが叩けます。

    ただまぁ、これだと AWS_PROFILE の方がどう考えても筋が良いので、

    alias aws-login="aws sso login --profile prof-x"
    alias aws-s3="aws s3 --profile prof-x"
    

    みたいによく使うコマンドと1セットにするのが良いかもしれません。

  • プロフィール名を default にする

    複数のプロフィールを切り替えて使うワケでもない場合、これが一番手っ取り早く --profile hogehoge な指定が不要にできます。

    もしかすると、なんとなく違和感を覚えるやり方かもしれませんが、 .aws/config に書き出される設定も [profile default] ではなく [default] として書き出されるので、そういう使い方も想定されているものだと思われます。
    ※名前ではなく設定として出力されるように組まれている

タブ補完しまくる

SSO設定時のタブ補完

SSO設定をする際も、入力項目によってはタブ補完が可能な項目があります。タブキー押しまくりましょう。

命名済みのセッションがあれば、その内容と共に候補が出ます。タブキーの連打か、矢印の上下で選択項目を切り替えられます。確定は Enter。

Start URL も ~/.aws/config に設定値があれば、候補に出ます。

SSO region や output format は、設定なしでも候補が出る

client Region はなぜか、どうやっても補完してくれない・・・

AWS CLI 自体のコマンド補完

もちろん AWS CLI 自体のコマンド補完も用意されていて、サクッと導入できます。

コマンド補完 - AWS Command Line Interface

導入方法(例)

$ complete -C '/usr/local/bin/aws_completer' aws

使用例

$ aws s<TAB>
s3                              schemas                         shield                          sso
s3api                           sdb                             signer                          sso-admin
..snip..

環境変数 AWS_CLI_AUTO_PROMPT

AWS CLI バージョン 2 の自動プロンプト

この環境変数は強力で、awsコマンドを叩くと、AWS CLI ver.2専用の自動プロンプトに入ります。

この自動プロンプトを導入する際の環境変数の値は、以下の2つで

$ export AWS_CLI_AUTO_PROMPT=on
    or
$ export AWS_CLI_AUTO_PROMPT=on-partial

on にすると必ず自動プロンプトに入り、 on-partial にすると必要に応じて自動プロンプトに入ります。

$ export AWS_CLI_AUTO_PROMPT=on
$ 
$ aws s3 ls
> aws s3 ls
 ↑
コマンドが成立していてもプロンプトに入るため、プロンプト内で再度Enterする必要がある
$ export AWS_CLI_AUTO_PROMPT=on-partial
$ 
$ aws s3 ls
2020-01-12 10:10:00 logs.hogehoge
..snip..
$
 ↑
コマンドが成立していればプロンプトには入らない

試してイマイチだったら unset AWS_CLI_AUTO_PROMPT で解除。

まとめ

以上、AWS CLI の SSO 設定例と、知ってるとちょっと便利かもしれないTipsでした。

セッション名やScopeなど、まだよく分かっていない点も多いので、誤り等ありましたらどこかでご指摘頂けますと幸いです。

あと、いつからか AWS IAM Identity Center に名称が変わったようですが、たぶんしばらくは AWS の SSO って言っちゃう気がします。

フェズ開発ブログ

Discussion