[AWS] CLI での SSO ログインを簡単にする(プロファイル名自動補完付き)

[AWS] CLI での SSO ログインを簡単にする(プロファイル名自動補完付き)

はじめに

こんにちは、 kenzauros です。

AWS (Amazon Web Services) で管理対象アカウントが多い場合、それぞれのアカウント設定や IAM ユーザーの管理が負担になってきます。

そこで AWS OrganizationsIAM Identity Center を設定すれば、メインアカウントのユーザーで SSO (シングルサインオン) できるようになり、とても便利です。 ここでは SSO の導入方法は割愛しますが、まだの方はぜひ設定ください。

SSO 導入後は aws sso login という CLI コマンドが使えるようになります。ただ、そのあとは資格情報を環境変数に展開する必要がありますし、複数のプロファイルを切り替えて使う場合などはコマンドを実行するのも面倒です。

ということで、今回は「SSO ログイン」と「資格情報の展開」を 1 コマンドで行えるようにしたうえで、プロファイル名の自動補完ができるようにします。内容的にはただの Shell Script なので難しいところはありません。

細かいことを省きたい方は最後の「まとめ」をご覧ください。

前提条件

~/.aws/config
[sso-session hogehoge]
sso_start_url = https://example-hogehoge.awsapps.com/start#
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

[profile example-hogehoge]
sso_start_url = https://example-hogehoge.awsapps.com/start#
sso_region = ap-northeast-1
sso_account_id = 123456789012
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
sso_session = hogehoge

[profile example-fugafuga]
~以下略~

セットアップ

ログインコマンドの準備

.bashrc をエディターで開き、下記のように追記して、 awsexportawslogin を定義します。

.bashrc
# AWS 資格情報を環境変数にエクスポート
function awsexport() {
  eval "$(aws configure export-credentials --profile $1 --format env)"
}
# AWS SSO ログイン
function awslogin() {
  aws sso login --profile $1 && awsexport $1 && echo "export AWS_PROFILE=$1"
}

.bashrc をリロードします。

.bashrcを再読み込み
$ source ~/.bashrc

ログインしてみる

これで下記のように awslogin を呼び出し、ブラウザー側で Authorize すれば、ログインできます。

awsloginコマンドでログインしてみる
$ awslogin example-hogehoge

Attempting to automatically open the SSO authorization page in your default browser.
If the browser does not open or you wish to use a different device to authorize this request, open the following URL:

https://device.sso.ap-northeast-1.amazonaws.com/

Then enter the code:

CSBB-FBDX
tcgetpgrp failed: Not a tty
Successfully logged into Start URL: https://example-hogehoge.awsapps.com/start#
export AWS_PROFILE=example-hogehoge

※このスクリプトは環境変数 AWS_PROFILE の設定は行いませんので、必要に応じて実行してください。

試しに環境変数を表示してみると AWS_ACCESS_KEY_ID などの値が設定されているはずです。

環境変数の確認
$ env | grep AWS_
AWS_SECRET_ACCESS_KEY=890YAXg7upMVV5m3Fr24U+GqUrqGSLPXWTx9qPPc
AWS_ACCESS_KEY_ID=ASIAVIYAJWGPUHSSA2O3
AWS_CREDENTIAL_EXPIRATION=2023-10-16T04:53:12+00:00
AWS_SESSION_TOKEN=IQoJb3JpZ2luX2VjEFMaDmFwLW5vcn.....................

これで SSO ログインがずいぶん簡単になりました。

プロファイル名を入力補完する

さて、これでログインは簡単になりましたが、複数のプロファイルがあるときに、プロファイル名を間違わずに覚えておくのは困難です。

ファイル名やディレクトリ名を補完するような感じでプロファイル名を補完できるようにしましょう。いわゆるオートコンプリートですね。

.bashrc の設定

下記の内容を .bashrcawslogin の後)に追記します。

.bashrc
# awslogin に AWS プロファイル名の自動補完を設定
_awslogin_bash_completion()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep -oP '\[profile \K[^]]*' ~/.aws/config | sort)

    if [[ ${cur} == * ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _awslogin_bash_completion awslogin

プロファイル名の補完を試す

あとは .bashrc をリロードすれば OK です。

.bashrcを再読み込み
$ source ~/.bashrc

これで awslogin のスペースのあとに文字を入力して Tab キーを押せば、プロファイル名が補完されます。 候補が複数ある場合は Tab Tab で一覧を表示できます。

プロファイル名の候補が複数の場合はリストが表示される
$ awslogin example-<Tab><Tab>
example-hogehoge        example-fugafuga       example-muramura 

補足:bash-completion のインストール

補完のために bash-completion を使いますので、 complete コマンドを叩いてみて、もしコマンドがない場合はインストールしましょう。

bash-completionのインストール
$ sudo yum install bash-completion # Red Hat 系 (または dnf install)
$ sudo apt-get install bash-completion # Debian, Ubuntu

まとめ

要するに ~/.bashrc に下記のスクリプトを追加するだけです。

.bashrc
# AWS 資格情報を環境変数にエクスポート
function awsexport() {
  eval "$(aws configure export-credentials --profile $1 --format env)"
}
# AWS SSO ログイン
function awslogin() {
  aws sso login --profile $1 && awsexport $1 && echo "export AWS_PROFILE=$1"
}
# awslogin に AWS プロファイル名の自動補完を設定
_awslogin_bash_completion()
{
    local cur prev opts
    COMPREPLY=()
    cur="${COMP_WORDS[COMP_CWORD]}"
    prev="${COMP_WORDS[COMP_CWORD-1]}"
    opts=$(grep -oP '\[profile \K[^]]*' ~/.aws/config | sort)

    if [[ ${cur} == * ]] ; then
        COMPREPLY=( $(compgen -W "${opts}" -- ${cur}) )
        return 0
    fi
}
complete -F _awslogin_bash_completion awslogin

どなたかのお役に立てれば幸いです。

kenzauros