【AWS CLI】IAMユーザーではなく、IAM Identity Centerを利用しよう

# はじめに
本記事では、AWS summit 2024にて講演のあった「[20分間で分かるIAM全機能](https://speakerdeck.com/opelab/20240621-aws-summit-iam)」を参考に、AWS CLIの認証に**IAMユーザー**を用いることの問題点、その代替として**IAM Identity Center**を用いる方法について纏めます。

# IAM ユーザーを用いた認証とその問題点
IAMユーザーを用いた認証は、IAMコンソールから取得したIAMユーザー情報を、認証情報として設定することで行われ、その情報は`~/.aws/credentials`および、`~/.aws/config`に保存される。
問題点は、IAMユーザーのこれらの情報には**有効期限が存在せず**、この情報が漏洩するとIAM Userに付与されたポリシーを誰でもいつでもどこからでも利用できてしまう点であり、IAM公式ガイドでも「**IAMユーザーの利用は非推奨**」と表明されている。

::: note alert
恒常的なCredentialsが常にAWSの外に存在する
:::

<details><summary>参考1（IAMユーザーを用いたAWS CLIの認証設定）</summary><div>

```zsh
$ aws configure --profile userprod
AWS Access Key ID [None]: AKIAIOSFODNN7EXAMPLE
AWS Secret Access Key [None]: wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY
Default region name [None]: us-west-2
Default output format [None]: json
```
</div></details>

<details><summary>参考2（公式ドキュメントでもIAMユーザーを使うことは推奨されていない）</summary><div>

### [Authentication and access credentials Page](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-authentication.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/b3aeef3d-3413-fb45-7324-726b55e334e3.png)
### [Authenticate with IAM user credentials Page](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-authentication-user.html)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/8249f6d7-a15b-c7fb-d6d2-e23e47bbfaa8.png)


</div></details>

# IAM Identity Centerを用いたSSO認証によるログイン
IAMユーザーを用いた認証の代わりに、IAM Identity Centerを用いた手法が挙げられる。
IAM Identity Centerを用いた認証は、IAMユーザーによる手法と同様の種類の情報を用いるが、それらの情報は最大12時間で無効となるため、IAMユーザーによる認証よりもセキュリティ的に強固である。
以下では実際にIAM Identity Centerを用いた手法の、セットアップと使用法を示す。
## セットアップ
### 1. 許可セットの作成
管理者アカウントのIAM Identity Centerにて、マルチアカウント設定/許可セットより、IAM ポリシーを設定した許可セットを作成する。
![スライド1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/63493e04-11b9-d005-9d87-2652a178e346.png)

### 2. 作成した許可セットの割り当て
作成した許可セットを利用するアカウントに紐づける。
![スライド2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/cb2f77be-21ca-3b00-d492-e85d7207f878.png)

### 3. sessionの作成と認証①
AWS access portalより、当該アカウントの利用したい許可セットのAccess keysを選択する。
![スライド3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/a6e25d22-cbbe-01a1-81f8-def2e2bd5641.png)
### 4. sessionの作成と認証②
AWS access portalでAccess keysをクリックした際に出てくる情報（下の写真参考）を基に、CLIでのサインインを行う。登録した情報は`~/.aws/config`に保存される。
```zsh
$ aws configure sso
SSO session name (Recommended): my-sso
SSO start URL [None]: {SSO start URL}
SSO region [None]: {SSO Region}
SSO registration scopes [None]: sso:account:access

There are 2 AWS accounts available to you.
{使用するアカウントを選択}

Using the account ID XXXXXXXXXXXX
There are 2 roles available to you.
{使用する許可セットを選択}

CLI default client Region [None]: ap-northeast-1
CLI default output format [None]: json
CLI profile name [AWSAdministratorAccess-XXXXXXXXXXXX]: my-sso-name
```
![スライド4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3761396/8ce0daaf-870e-6385-371b-4f4952a9f4ef.png)

## 使用法
作成した認証でcliコマンドを実行する際は、以下の例ように`--profile my-sso-name`をオプションとして記載し利用する。
```zsh
npx ampx sandbox --profile my-sso-name
aws s3 ls --profile my-sso-name
```
セッションの有効期限が切れた場合は以下のコマンドで再度サインインする。
```zsh
$ aws sso login --profile my-sso-name
```
# まとめ
AWS CLIの使用に際して、IAMユーザーを用いることはセキュリティ的にあまりよろしくないのでIAM Identity Centerを用いよう。

# 参考
https://zenn.dev/akeru/articles/3ac143a8bf933a#%E3%81%AF%E3%81%98%E3%82%81%E3%81%AB

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/sso-configure-profile-token.html

https://speakerdeck.com/opelab/20240621-aws-summit-iam

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-authentication.html

https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-authentication-user.html