AWSumeを使ってAWS CLIをIAM Identity Center(SSO)で認証する

AWSumeでSSO認証すると幸せになれました。現状必ずエラーを経由するような挙動をするので、AWSumeの「credential_process」対応に期待です。
2023.10.12

みなさん、こんにちは。

明るい笑顔がトレードマーク、ルイボスティーが大好きな芦沢(@ashi_ssan)です。

IAM Identity CenterのSSO認証を使ってローカル環境でAWS CLIを実行したいな〜〜

と思ったこと、誰しもありますよね?

以下ブログのようにSSO認証でAWS CLIを実行する方法はあります。

ただ、この方法だと以下のようなCLIコマンド実行時に--profile YOUR_AWS_ACCOUNTのように毎回アカウントのプロファイルを指定しなければならず、私は大変手間に感じます。

> aws s3 ls --profile YOUR_AWS_ACCOUNT

SSOを使わない環境では、AWS CLIのスイッチロール時に役に立つ便利なツールAWSumeが有名です。

AWSumeを利用すると、以下のような簡潔なコマンドで任意のアカウントのIAMロールへスイッチでき、以降のコマンド入力でプロファイルの指定が不要になります。

> awsume YOUR_AWS_ACCOUNT

少し前まで知らなかったのですが、何とこのツールSSOで認証するケースにも対応していました。ただ、利用するために多少の工夫が必要が必要だったので、このブログで利用開始までの手順を紹介します。

前提作業

こちらのブログを参考に、通常のSSOしないケースでAWSumeを利用できる状態にしておいてください。

作業の前提となるAWsumeのバージョンはこちらです。

> awsume --version
4.5.3

AWsumeを使ってSSO認証してAWS CLIを実行するためには、後述するcredential_processというパラメータの取得が必要になります。

ただし、執筆時現在のIAM Identity CenterのAPI(aws sso 〜など)では取得できないため、何かしらのツールを導入します。

今回はaws-sso-utilというツールを導入します。

まずは、どちらかのコマンドでaws-sso-utilをインストールしてください。

> brew install aws-sso-util
> pipx install aws-sso-util

やってみた

AWSumeをSSO認証で利用できるようになる、~/.aws/configのサンプルは以下です。

[profile test-profile]
sso_start_url = https://d-xxxxxxxx.awsapps.com/start
sso_region = ap-northeast-1
sso_account_id = 123456789012
sso_role_name = AWSAdministratorAccess
credential_process = aws-sso-util credential-process --profile test-profile
region = ap-northeast-1
output = json

sso_start_urlには、IAM Identity CenterのログインポータルのURLを入力してください。

sso_regionには、IAM Identity Centerが有効化されているAWSリージョンを指定してください。試しに誤ったリージョンを指定すると途中までうまく行きますがSSOの認証画面でエラーになりました。

sso_account_idにはスイッチロールする対象のアカウントID、sso_role_nameにはスイッチロールするIAMロールの名称を入力してください。

credential_processは、記載の通りのコマンドを入力してください。test-profileの箇所は~/.aws/configのプロファイル名を指定しています。

ここまでで~/.aws/configの準備ができました。

以下のawsume プロファイル名コマンドを実行してスイッチロールしましょう。

> awsume test-profile

実行すると、以下のようなエラーが出ると思われます。

Awsume error: credential_process error: Login required. Use `aws-sso-util login --profile test-profile` or `aws sso login --profile test-profile` and try again.

このエラーは、2023年10月6日現在credential_processに記載するコマンドがAWSume内でネイティブに組み込まれないことが原因です。

以下AWSumeのGitHub ISSUEにも上がっています。

現状回避できないようなので、エラー文にあるコマンドを別途手動で入力する必要があります。

コマンドを実行すると以下のような出力があり、同時にAWSのコンソールが開きます。

> aws-sso-util login --profile test-profile

Logging in https://d-xxxxxxxx.awsapps.com/start
Login with IAM Identity Center required.
Attempting to open the 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://d-xxxxxxxx.awsapps.com/start

Then enter the code:

XXXX-XXXX

Confirm and continueをクリックすると、IAM Identity Centerの認証画面になります。ログインしてください。

認証が完了すると、こちらの画面に遷移するのでAllowをクリックします。

以下のように表示されたら認証は成功です。

コマンドラインにも以下の出力があれば、ログインが成功しています。

Login succeeded, valid until YYYY-MM-DD HH:mm JST

AWS CLIを実行すると、設定したIAMロールにスイッチできていることが確認できます。

> aws sts get-caller-identity
{
    "UserId": "AROAQHDUQX34OODF66MB5:ashisan@sample.jp",
    "Account": "123456789012",
    "Arn": "arn:aws:sts::123456789012:assumed-role/AWSReservedSSO_AWSAdministratorAccess_xxxxxxxxxxxx/ashisan@sample.jp"
}

最後に

以上、AWSumeを使ってAWS CLIをIAM Identity Center(SSO)で認証する方法をご紹介しました。

IAM Identity CenterによるSSOを目的に、OrganizationsやControl Towerを使っている方・使いたい方も少なくないと思っています。

たくさんのアカウントを日々扱っていると、SSOを使っていたとしてもスイッチロールやCLIの実行などに手間がかかると思います。AWSumeによってその手間が少しでも省けるはずです。

私はこのツールがないともうマルチアカウント環境をCLIで触れない体になってしまいました。皆さんも早くこちらの世界に来てください。

以上、芦沢(@ashi_ssan)でした。