🆔

AWS Organizationsを0から始める -CLI編-

2024/04/04に公開

1. 目的

AWS Indentitiy Centerを使用してOrganaizations組織のアカウントにSSOが可能になった後、SSOでログインした状態でAWS CLIを使用するための準備をします。

本ドキュメントは下記の続編となります。

AWSとMicrosoft Entra ID の連携

2. 実現したいこと

青色の経路がIAMユーザ認証を使用する経路(As-is)、黄色の経路がSSOを使用する経路(To-be)です。

  • ポイントとして、ローカル環境のターミナルでAWS CLIを使用可能な状態にするために下記を実施します。
    • SSOユーザはアクセスキーを持たないため、CLIを使用するためにトークンプロバイダーを使用して認証
    • SSOコマンドを使用して接続プロファイルを作成

3. 実現方法

認証ルートは次の通りです。

  1. ユーザがMicrosoft365にサインイン
  2. ユーザがAWS CLIからログインURLを指定してSSOコマンドを実行
  3. AWSから認証コードが表示されて、Microsoft365にサインイン済みのブラウザに入力
  4. Entra IDからSAML認証でIAM Identityセンターを経由してAWSに認証
  5. 認証情報がIAMロールにマッピングされ、AWS CLIコマンドが使用可能になる

前提条件

  • 接続先のAWSアカウントにIAM Identity Centerを使用してSSOが可能な状態であること
  • ブラウザでIdentity Centerへアクセスが確立されていること
    • 今回の場合、Office365にユーザとしてサインイン済みであればIAM Identity Centerへのアクセスが可能となっている
  • ローカル環境や仮想マシンにAWS CLI v2がインストールされていること
    • AWS CLI v1はIAM Identity Centerをサポートしていないため、v1の場合はアップグレードを実施する

4. 手順

はじめに

ブラウザ端末でコンソール画面にSSOする場合、IAM Identity CenterにアクセスするためのSAMLトークンはブラウザ自身に保存されていますが

ターミナルクライアントでCLIを利用する場合は、トークンプロバイダー設定を使用します。

この認証トークンはSSOセッションが切断されるたびに認証が必要になります。

事前作業

まずは、AWS CLI v2がインストールされていることを確認します。

sato@local:~$ aws --version
aws-cli/2.15.24 Python/3.11.6 Linux/5.15.133.1-microsoft-standard-WSL2 exe/x86_64.ubuntu.22 prompt/off

v1であれば最新バージョンをインストールしてください。

AWS CLI の最新バージョンを使用してインストールまたは更新を行う - AWS Command Line Interface

設定手順

~/.aws/configの確認

AWS CLIがIAM Identity Centerで認証するためのプロファイルをssoコマンドで作成します。

プロファイルは*~/.aws/config*に保存され、次回のセッションに使用します。

まずローカルクライアントで保存されている情報を確認してみましょう。

すでにアクセスキーでプロファイルを作成済みの場合はこのように表示されます。

ToccaSato@local:~$ cat ~/.aws/config
[profile test]
region = ap-northeast-1
output = json
[profile hoge]
region = ap-northeast-1
output = json
[profile cli]
region = ap-northeast-1
output = json

アクセスキーを使用する場合はさらに*~/.aws/credentialsに認証情報が保存されますが、SSOでセッションの場合は~/.aws/config*にのみ認証情報が保存されます。

aws configure ssoコマンドの実行

profileの設定はアクセスキーと同じようにaws configureコマンドで保存ができます。

SSOで認証する場合はaws configure ssoを実行します。

対話形式で入力が求められるので、必要な情報を入力していきます。

SSO session name (Recommended): my-sso # ssoセッションに対する任意の名称
SSO start URL [None]: https://d-12345xxxxx.awsapps.com/start  # AWSアクセスポータルのURL
SSO region [None]: ap-northeast-1 # Identity Centerのリージョン
SSO registration scopes [sso:account:access]: # 特に入力しなくてよい(デフォルト)

ここまで入力すると、次のような画面が表示されます。

ここに記載されているhttps://device.sso.ap-northeast-1.amazonaws.com/が認証コードを入力するURLです。

認証コードはアルファベット大文字XXXX-XXXXの形式で表示されています。

アクセスすると次のようなページに遷移しますので、認証コードを入力して [ Sumit and continue ]を押下します。

コードが認証されるとIdentitycenterにリダイレクトされ、アクセス許可への同意を求める画面になります。

[ Allow ]を押下します。

認証が完了すると次の画面が表示されます。

ローカルクライアントの画面に戻ると、アクセス可能なアカウントが表示されています。

プロファイルを作成したいアカウントを選択してEnterキーを押下します。


利用可能なロールを選択します。


ここまではアクセス先のIAM Identity CenterでSSOをして、任意のアカウントに接続するための設定です。

次にCLIの設定を入力します。

CLI profile nameを入力しない場合、デフォルトの [ ロール名-アカウントID ] が設定されますのでわかりやすい名称を入力してください。

CLI default client Region [None]: ap-northeast-1 # CLIコマンドを実行するデフォルトのリージョン
CLI default output format [None]: json # データを出力するフォーマット
CLI profile name [AdministratorAccess-123456789xxx]: my-sso # profileに使う名称

To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile my-sso

これで設定は完了です。/.aws/configに格納された情報を参照すると、先ほど入力した情報が設定されています。

[profile my-sso]
sso_session = my-sso
sso_account_id = 123456789xxx
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
[sso-session my-sso]
sso_start_url = https://d-12345xxxxx.awsapps.com/start
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access

設定した情報でコマンドを実行する

試しにコマンドを実行してみましょう。

ToccaSato@local:~$ aws s3 ls --profile my-sso
2000-11-11 11:11:11 tocca-fizzbuzz-bucket
2000-12-12 12:12:12 tocca-hogefuga-bucket

コマンド結果が表示されてSSO認証が成功していることがわかりました。

この状態で、Identity Centerに設定されているセッション中はCLIを使用することができます。

一定期間が過ぎるとトークンの期限が切れ、更新が必要であるという旨のエラーメッセージが返ってきます。

下記はセッションが切れてから同じコマンドを実行した場合の例です。

ToccaSato@local:~$ aws s3 ls --profile my-sso

Error when retrieving token from sso: Token has expired and refresh failed

エラーが返ってきました。それでは認証トークンを更新してセッションを再開させましょう。

終了したSSOセッションを再開する

終了したSSOセッションを再開する場合、aws sso loginコマンドで認証トークンを更新させます。

再認証の場合も初回と手順は同じですが、引数*—sso-sessionにSSO session nameを入力することで/.aws/configに設定した情報を再利用ができます。*

ToccaSato@local:~$ aws sso login --sso-session my-sso
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:

VJTX-SGZL
gio: https://device.sso.ap-northeast-1.amazonaws.com/?user_code=VJTX-SGZL: Operation not supported

認証トークンを更新することで、再度コマンドが通るようになります。

sato@local:~$ aws s3 ls --profile my-sso
2000-11-11 11:11:11 tocca-fizzbuzz-bucket
2000-12-12 12:12:12 tocca-hogefuga-bucket

5. 参考にさせていただいたドキュメント

AWS CLIをAWS IAM Identity Center(SSO)で認証させるには? | DevelopersIO

Integrating AWS CLI with IAM Identity Center - AWS IAM Identity Center

Discussion