AWSのSAML認証でaws cliにログインする方法

はいさい！ちゅらデータぬオースティンやいびーん！

# 概要
AWSのFederated Userシステム、SAML認証でログインした時に、`aws cli`にもその認証情報を反映させる方法を紹介します。

## 参考にした情報

https://qiita.com/hoto17296/items/126352a43e9749d510b5

https://aws.amazon.com/premiumsupport/knowledge-center/aws-cli-call-store-saml-credentials/

https://docs.aws.amazon.com/IAM/latest/UserGuide/troubleshoot_saml_view-saml-response.html

# SAMLResponseを取得する
まず、読者さんのAWS・SAMLログイン画面を開いてください。

筆者の場合、Googleアカウントを使用しておりますので、以下のような画面になります。
![スクリーンショット 2022-07-20 12.20.57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/04aea155-8fb3-5709-27ff-534171e2311c.png)
![スクリーンショット 2022-07-20 12.21.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/c641fc14-c1f5-7a0f-3175-26f8d22757de.png)



そこで以下の順番を踏まえてログインします。
![ezgif.com-gif-maker (9).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/c4a85571-19a1-09bb-107b-9b3a97daaff7.gif)
1. Chrome Dev Toolsを開く
1. Networkのタブを開く
1. Preserve Logにチェックを入れる

![ezgif.com-gif-maker (10).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/023792ef-37d5-48e2-cb80-2c9bdd1d5378.gif)

1. AWSアカウントを選択する
1. 「サインイン」をクリック
1. Chrome Dev ToolsのNetworkタブの履歴の「Name」縦列に、samlのリクエストをクリックする
1. METHODがPOSTであること、Statusが302であることを確認。
1. Payloadのタブをクリックする
1. SAMLResponseの中身をコピーする

このページをそのままにそっとしておきます。まだ必要な情報があります。

## SAMLResponseを.logファイルに保存
上記でコピーしたファイルをローカル・ダイレクトリの`samlresponse.log`というファイルに保存します。

1. （上記の続き） SAMLResponseの中身をコピーする
1. 新規ターミナルを開く
1. 任意のダイレクトリに入る
1. `touch samlresponse.log`を実行し、コピーしているテキストを保存するファイルを作成する
1. `vim samlresponse.log`でVIMを開き、持っているテキストをペーストする
1. `esc :wq`を実行し、`samlresponse.log`を保存する

## ターミナルに`aws sts`のコマンドを準備する
以下のコマンドをターミナルにペーストします。
```
aws sts assume-role-with-saml --role-arn arn:aws:iam::ACCOUNTNUMBER:role/IAM_ROLE --principal-arn arn:aws:iam::ACCOUNTNUMBER:saml-provider/SAML_PROVIDER --saml-assertion file://samlresponse.log
````


| キー | 代入するべき値 | 
| -------- | -------- | 
| ACCOUNTNUMBER    | AWSアカウント番号    |
| IAM_ROLE | 先ほどのSAMLのレスポンスに明記されているので下記にて説明します。 |
| SAML_PROVIDER | Googleであれば、Googleを代入 |


## ACCOUNTNUMBER を代入する
先ほどのsamlのPOSTリクエストの`Payload`の`SAMLResponse`の下に、`roleIndex`という値があります。
![スクリーンショット 2022-07-20 12.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6f8deac7-8a1d-9bea-16d8-d9adc278583b.png)
その中に書かれている数字がACCOUNTNUMBERになります。


こちらのテキストをコピーして代入します。

```
aws sts assume-role-with-saml --role-arn arn:aws:iam::1...0:role/IAM_ROLE --principal-arn arn:aws:iam::1...0:saml-provider/SAML_PROVIDER --saml-assertion file://samlresponse.log
````

## IAM_ROLEを代入する
次は、同じく`roleIndex`からコピーしますが、今回はrole/の末尾の部分を取ります。
![スクリーンショット 2022-07-20 12.28.13.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/6f8deac7-8a1d-9bea-16d8-d9adc278583b.png)
```
aws sts assume-role-with-saml --role-arn arn:aws:iam::1...0:role/Gaaaaaaaaaaaaaaaaaaaar --principal-arn arn:aws:iam::1...0:saml-provider/SAML_PROVIDER --saml-assertion file://samlresponse.log
````

## SAML_PROVIDERを代入する
最後に、SAML＿PROVIDERに、Googleアカウントであれば、単に`Google`を代入します。
```
aws sts assume-role-with-saml --role-arn arn:aws:iam::1...0:role/Gaaaaaaaaaaaaaaaaaaaar --principal-arn arn:aws:iam::1...0:saml-provider/Google --saml-assertion file://samlresponse.log
````

# 代入した値で実行し、`~/.aws/credentials`に保存する
最後に、集めた情報で上記のコマンドを実行し、その結果を持って`~/.aws/credentials`を更新します。

## 認証情報を取得する
```
aws sts assume-role-with-saml --role-arn arn:aws:iam::11...0:role/Gaaaaaaaaaaaaaaaaaaaar --principal-arn arn:aws:iam::1...0:saml-provider/Google --saml-assertion file://samlresponse.log
````

すると、以下のような情報が表示されます。
![スクリーンショット 2022-07-20 12.34.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/2344956/b04de41e-ad4c-a1bc-9198-e956d3094089.png)

このターミナルはそのままにしておきます。

## 新規ターミナルで`~/.aws/credentials`を開き、認証情報を保存
 `vim ~/.aws/credentials`を実行します。
`[別名]`というように、`[]`の中に認証情報のあだ名をつけます。
その下に、以下の項目を入れます。

| STSキー | `camel_case`キー |  
| -------- | -------- | 
| AccessKeyId     | aws_access_key_id     | 
| SecretAccessKey | aws_secret_access_key |
| SessionToken | aws_session_token |

結果、このようになります。
```~/.aws/credentials
[saml]
aws_access_key_id = chura
aws_secret_access_key = tarou
aws_session_token = okinawa
```

# まとめ
ここまで無事に実行できれば、aws cliを通常通りに使えるようになったはず！

SAMLでログインしてから、上記のSTSコマンドを実行するまでに5分以上経つと、アクセスを拒否されますのでご注意ください。