IAM Identity Centerを使って複数アカウント管理する。（その２：CLIでのアクセスと管理の委任）

# はじめに
前回は`IAM Identity Center`の基本設定とAWSマネジメントコンソールへのログインまで行ったので、今回はCLIでのアクセス方法と`IAM Identity Center`管理の委任についてまとめてみようと思います。

- 【前】[IAM Identity Centerを使って複数アカウント管理する。（その１：IAM Identity Centerでのログイン）](https://qiita.com/sakai00kou/items/086a12caa69a78c18f61)
- 【次】[IAM Identity Centerを使って複数アカウント管理する。（その３：外部AWSアカウントへのSAML）](https://qiita.com/sakai00kou/items/743837701d08b11cb840)

以下目次

- [CLIアクセスについて](#cliアクセスについて)
- [IAM Identity Centerの管理の委任](#iam-identity-centerの管理の委任)

# CLIアクセスについて
`IAM Identity Center`で作成したユーザのCLIアクセスは、期限付きのセッショントークンによる認証方式となります。

CLIアクセスに必要となる情報は`IAM Identity Center`にログインした際に表示される、「**Command line or programmatic access**」を選択すると表示されるため、ユーザごとにクレデンシャル情報を作成して配布したり、クレデンシャル情報の定期的な変更を促す必要がありません。

![Monosnap_20230315_143827.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/a020914d-07a5-2121-9b18-a3707b48c489.png)

各アカウント、各許可セットの「**Command line or programmatic access**」を選択すると、コピーして使用できる以下のような情報が表示されるため、コンソールに貼り付けたり、`~/.aws/credentials`に書き込んでprofile指定してコマンド実行することで、選択したアカウント、権限でコマンドを実行することができます。

![Monosnap_20230315_144130.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/cc987ce1-7249-4d2b-7537-7eecbd48748c.png)

セッショントークンの保持時間は許可セットの「**セッション期間**」から設定を行うことができ、デフォルトで最短となる１時間、最長で12時間まで伸ばすことができます。

保持期間が満了した場合はコマンドが失敗するため、再度ポータル画面にアクセスし、トークン情報をコピーすることでアクセスできるようになります。

ただ、毎回ポータル画面にアクセスしてトークン情報をコピーして使うというのは、アクセスキー＆シークレットアクセスキーでのアクセスと比べると手間であることから、結局IAMユーザによる管理に戻ってしまう可能性もありますが、セッショントークンを使用したCLIアクセスを行う場合に、なるべくユーザビリティを落とさない方法も用意されているため、以下で紹介していきます。

- [前提条件](#前提条件)
- [aws configure ssoによるトークンの更新](#aws-configure-ssoによるトークンの更新)
- [SSOトークンプロバイダ構成](#ssoトークンプロバイダ構成)
    - [他のアカウント用プロファイルへの切り替え方法](#他のアカウント用プロファイルへの切り替え方法)
        - [事前にプロファイルを作成して切り替える方法](#事前にプロファイルを作成して切り替える方法)
        - [既存のプロファイルを書き換える方法](#既存のプロファイルを書き換える方法)
- [セッショントークンの期限が切れた際のアクセス方法](#セッショントークンの期限が切れた際のアクセス方法)

## 前提条件
AWS CLIで`IAM Identity Center`を使うためには`AWS CLI v2`である必要があります。

`AWS CLI v2`ではない場合は以下より更新しておきましょう。

- [Installing or updating the latest version of the AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/getting-started-install.html)

## aws configure ssoによるトークンの更新
上述したポータル画面からトークン情報をコピペする方法もありますが、以下AWSのユーザガイドには`aws configure sso`コマンドを使用した２種類の方法が紹介されております。

- [Configuring the AWS CLI to use AWS IAM Identity Center (successor to AWS Single Sign-On)](https://docs.aws.amazon.com/cli/latest/userguide/cli-configure-sso.html)

紹介されている以下２種類のうち、１つはトークン満了時に手動で更新する方法、もう１つは推奨構成となるトークン満了時に自動で更新する方法となります。

- [SSOトークンプロバイダー構成（推奨）](https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-token.html)
- [従来の更新不可能な構成](https://docs.aws.amazon.com/cli/latest/userguide/sso-configure-profile-legacy.html)

今回は推奨構成となる自動更新を行う方法を紹介します。

## SSOトークンプロバイダ構成
SSOトークンプロバイダ構成の設定を行うため、`aws configure sso`コマンドで設定していきます。

```bash:プロファイルの構成
aws configure sso
```

実行すると、以下のような入力項目が表示されるため、それぞれ入力します。

:::note info
`AWS CLI v2`を使用していても、バージョンが古いと`SSO session name`が表示されなかったりするようです。
表示されない場合は最新版の`AWS CLI v2`に更新してください。
:::

```bash:入力項目
SSO session name (Recommended): [任意のセッション名]
SSO start URL [None]: [SSOスタートURL]
SSO region [None]: [リージョン]
SSO registration scopes [None]: sso:account:access
```

ちなみに私は今回以下のような設定を行いました。

|項目|設定|備考|
|:--|:--|:--|
|SSO session name|AdministratorAccessCLI||
|SSO start URL|https://x-xxxxxxxxxx.awsapps.com/start#|ポータル画面からコピーしたURL|
|SSO region|ap-northeast-1|
|SSO registration scopes|sso:account:access|ユーザガイドの通り固定値で入力|

入力完了後、AWS CLIからインターネットブラウザが開けるようであれば以下のような画面が開くため、「**Allow**」を選択します。

![Monosnap_20230315_163758.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/2fd0521c-7700-e9b6-68ff-03c1fd82fca7.png)

インターネットブラウザが開けない場合は、AWS CLIのコマンド結果で表示されている以下のURLにアクセスし、記載されているコードを入力することで関連付けます。

```bash:インターネットブラウザが開けない場合のアクセス方法
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:

XXXX-XXXX
```

![Monosnap_20230315_163849.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/d4d53bce-376d-685d-8d94-a70736286957.png)

AWS CLIに戻ると関連付けられているアカウントが対話式で選択できるようになるため、上下ボタンでアクセスしたいアカウントを選択して**Enter**を押します。

```bash:対話式によるアカウント選択
There are 2 AWS accounts available to you.
> RootAccount, root@example.com (xxxxxxxxxxxx)
  MemberAccount, member@example.com (yyyyyyyyyyyy)
```

続いて関連付けられている許可セットの選択を行います。

```bash:対話式による許可セット選択
There are 2 roles available to you.
  ReadOnlyAccess
> AdministratorAccess
```

デフォルトリージョン、アウトプットフォーマット、任意のプロファイル名の指定を行い実行。

```bash:デフォルト設定とプロファイル名指定
CLI default client Region [ap-northeast-1]: ap-northeast-1
CLI default output format [yaml]: json
CLI profile name [AdministratorAccess-xxxxxxxxxxxx]: RootAdministratorAccess
```

`aws configure sso`コマンドの設定完了後、`~/.aws/config`に以下のような設定情報が作成されます。

```bash:~/.aws/configに登録される情報
[profile RootAdministratorAccess]
sso_session = AdministratorAccessCLI
sso_account_id = [SSOアカウントID]
sso_role_name = AdministratorAccess
region = ap-northeast-1
output = json
[sso-session AdministratorAccessCLI]
sso_start_url = https://x-xxxxxxxxxx.awsapps.com/start#
sso_region = ap-northeast-1
sso_registration_scopes = sso:account:access
```

上記設定後に表示される実行例のように、`--profile [CLIプロファイル名]`を指定することで、指定したプロファイルの権限でコマンドを実行できます。

```bash:コマンド実行例
To use this profile, specify the profile name using --profile, as shown:

aws s3 ls --profile RootAdministratorAccess
```

### 他のアカウント用プロファイルへの切り替え方法
CLIプロファイルの切替方法は従来のやり方と同様、`--profile`を指定して接続先アカウントのプロファイルを切り替えます。

`IAM Identity Center`で複数プロファイルを作成する場合も`aws configure`コマンドで複数プロファイルを作成する場合と同じように以下のコマンドを実行することで作成出来ます。

```bash:CLIプロファイルの追加
aws configure sso --profile [CLIプロファイル名]
```

コマンドの後ろに`--profile`を追加することで使用するプロファイルを簡単に切り替えられ、もちろん環境変数`AWS_PROFILE`にCLIプロファイル名を指定することで、`--profile`無しでコマンド実行することも出来ます。

### 実運用時のプロファイル構成例
いちいち`--profile`でアカウントを切り替えたり、`export AWS_PROFILE`でプロファイルを指定するのが面倒だという場合、作業用のプロファイルを準備しておくことで運用時の作業を少し効率的に行うことができるので紹介しておこうと思います。

上述したコマンドでのプロファイル登録は、以下のように１対１でCLIプロファイルとAWSアカウントが結びつき、`--profile`や環境変数でプロファイルを切り替えることで接続先アカウントを切り替えることが出来ます。

```plantuml
title 従来の各プロファイルを作成して切り替える方法
rectangle SSOセッション(AdministratorAccessCLI) {

    rectangle AWSアカウント {
        rectangle AWSアカウントA
        rectangle AWSアカウントB
        rectangle AWSアカウントC
    }

    rectangle CLIプロファイル {
        rectangle RootAdministratorAccessA
        rectangle RootAdministratorAccessB
        rectangle RootAdministratorAccessC
    }
}
RootAdministratorAccessA-[hidden]d-RootAdministratorAccessB
RootAdministratorAccessB-[hidden]d-RootAdministratorAccessC

AWSアカウントA-[hidden]d-AWSアカウントB
AWSアカウントB-[hidden]d-AWSアカウントC

RootAdministratorAccessA-r->AWSアカウントA
RootAdministratorAccessB-r->AWSアカウントB
RootAdministratorAccessC-r->AWSアカウントC
```

今回紹介する方法は、CLIプロファイルは１つで、コマンドにより接続アカウントを切り替える方法となります。

手間としては`export AWS_PROFILE`で使用プロファイルを直接指定して、コマンド実行時に`--profile`を指定せずに実行する方法とあまり変わりませんが、こちらはプロンプトを開いて１回目の操作以外は矢印キーとエンターだけでプロファイルを切り替えられるため、複数のアカウントで操作する運用者の方には便利かと思います。

```plantuml
title CLIプロファイルとAWSアカウントの紐付けを切り替える方法
rectangle SSOセッション(AdministratorAccessCLI) {

    rectangle AWSアカウント {
        rectangle AWSアカウントA
        rectangle AWSアカウントB
        rectangle AWSアカウントC
    }

    rectangle CLIプロファイル {
        rectangle RootAdministratorAccessA
    }


}

AWSアカウントA-[hidden]d-AWSアカウントB
AWSアカウントB-[hidden]d-AWSアカウントC

RootAdministratorAccessA-r->AWSアカウントA:コマンドにより切り替え
RootAdministratorAccessA-r~~>AWSアカウントB:コマンドにより切り替え
RootAdministratorAccessA-r~~>AWSアカウントC:コマンドにより切り替え
```

やり方としては先程設定したプロファイルとは別に作業用のプロファイルを準備しておき、切り替えたいときに`aws configure sso`コマンドで接続アカウントを書き換えることで切り替えます。

`aws configure sso`コマンドは実行後プロンプトが閉じられるか、環境変数で`AWS_PROFILE`の値を指定するまでは`aws configure sso`で指定したCLIプロファイルが使われるため、予め作業用CLIプロファイルを作成しておいた上で以下実行すると、プロファイル作成時に設定した内容はエンターで飛ばすことができ、接続先アカウントだけ矢印キーで選択することで切り替えられるため、環境変数`AWS_PROFILE`を書き換えるよりも簡単に切り替えることが出来ます。

```bash:作業用CLIプロファイル指定
aws configure sso --profile [作業用CLIプロファイル名]
```

また、プロンプトが閉じられていなければ２回目以降、`--profile`を指定しなくても良いので、`aws configure sso`のみでOKです。

## セッショントークンの期限が切れた際のアクセス方法
セッショントークンの期間満了となった場合、`aws sso login --profile [プロファイル名]`を実行することで、初期設定と同じようにインターネットブラウザが開き、`IAM Identity Center`の認証を行うことでトークン情報が自動的に更新され、新しいトークンでアクセスすることができます。

```bash:aws sso loginコマンドによるサインイン
aws sso login --profile [プロファイル名]
```

また、セッショントークンの期間満了を待たずに明示的にログアウトしたい場合は以下のコマンドを実行することでログアウトされ、クライアント側にキャッシュされているトークン情報も削除されます。

```bash:aws sso logoutコマンドによるサインアウト
aws sso logout
```

# IAM Identity Centerの管理の委任
`IAM Identity Center`はデフォルトではルートアカウントで管理されています。

そのままルートアカウントで使用しても良いですが、AWSのベストプラクティスではルートアカウントで管理するサービス、タスクは、ルートアカウントでないと実行できないものに限定するほうが良いと記載されているため、ルートアカウントで実行するサービスは必要最低限とするのが良いでしょう。

- [管理アカウントのベストプラクティス](https://docs.aws.amazon.com/ja_jp/organizations/latest/userguide/orgs_best-practices_mgmt-acct.html)

`IAM Identity Center`の管理もルートアカウントから他のメンバーアカウントに管理を委任することができるので、設定してみたいと思います。

- [委任の設定](#委任の設定)

## 委任の設定
委任の設定自体は非常に簡単で、「**IAM Identity Center**」の「**設定**」→「**管理**」タブの「**アカウントを登録**」から行います。

![Monosnap_20230315_153156.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/f297a008-740b-54d4-94e5-f7ee055f1961.png)

委任するメンバーアカウント選択画面が表示されるため、委任するメンバーアカウントを選択して、「**アカウントを登録**」を実行することで`IAM Identity Center`の管理を委任することができます。

![Monosnap_20230315_153423.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/569912/b50043e3-aa94-8278-e0b3-7f16aaaf4c79.png)

上記画面の注意書きにも記載されている通り、ルートアカウントに対する許可セットの管理や`IAM Identity Center`自体の削除などは、今まで通りルートアカウントで行う必要がありますが、委任することでルートアカウントから`IAM Identity Center`の管理を分離することができます。

# おわりに
今回はCLIでのアクセス方法と`IAM Identity Center`管理の委任方法についてまとめました。

セッショントークンの期間満了ごとに再認証を行う手間はありますが、`IAM Identity Center`を使うことでユーザに永続的なアクセスキーを配布すること無くユーザアクセスできるというのはシステム管理者にとってメリットの大きいものかと思います。

`IAM Identity Center`の委任についても、委任することで各アカウントごとの役割が明確になることから、アカウント数が多いシステムの場合はユーザ管理用として１つアカウントを用意してしまうのも良いかと思います。

次回は自組織とは異なる外部AWSアカウントに対して`IAM Identity Center`からSAMLアクセスを行う方法について試してみようと思います。