AWSコンソールでスイッチロール時のセッション時間を増やすCLIツールを作った


皆さんはAWSマネジメントコンソールでスイッチロールをして作業をしていたときにログインセッションが切れて、それまでの設定内容が全て消えて最初からやり直すことになった経験はないでしょうか？

テスト目的で何かを手でポチポチ作成している時にこういったことは個人的によくあり、セッション時間を伸ばすことができればなぁと思っていました。

AWSによるとスイッチロールをした場合のセッション時間は最大で1時間[^1]までとしています。
また、AWSマネジメントコンソール上でスイッチロールを行う限り、このセッション時間は変更することは現状できません。


# セッション時間を増やすことはできる

しかしながら、AWSフェデレーションを利用したコンソールURLからログインすると、セッション時間を1時間から最大12時間まで伸ばすことができます[^2]。これは以下の公式ドキュメントで説明されています。

[カスタム ID ブローカーに対する AWS コンソールへのアクセスの許可 - AWS Identity and Access Management](https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html)

このドキュメントによると、AssumeRole APIやGetFederationToken APIから一時的なセキュリティ認証情報を取得し、その情報を使ってさらにAWSフェデレーションエンドポイントからサインイントークンを取得し、そのトークンが入ったコンソールURLを組み立てればOKだよと説明されています。

ただし、このURLを発行するためには簡単なプログラムを書く必要があり、公式ドキュメントでもプログラムの一例が紹介されています[^3]。

そこでこのコンソールURLの発行を1コマンド叩くだけでできるCLIツール [alug](https://github.com/shirakiya/alug) を作成したので紹介します。


# alug
今回作ったもの
https://github.com/shirakiya/alug

インストール方法は[こちら](https://github.com/shirakiya/alug#installation)を参考にしてください。


## 使い方
説明のために仮にログインしたいIAMロールに関するprofileを `hoge` とした場合、基本的な使い方は以下のコマンドです。

```
$ alug -p hoge

https://signin.aws.amazon.com/federation?Action=login&Destination=https%3A%2F%2Fconsole.aws.amazon.com%2F&Issuer=IssuedByAlug&SigninToken=XXXXXXXXXX...
```

※ この `SigninToken` の文字数とても多く、長大なURLが出力されます。

ログイン先のIAMロールにMFAが設定されている場合は以下のどちらかの方法でMFAコードを入力する必要があります。（なお、MFAが設定されている場合は後述する `mfa_serial` がログイン先のprofileに設定されている必要があります）

```
# インタラクティブに入力する場合
$ alug -p hoge
Input MFA Code: XXXXXX

https://signin.aws.amazon.com/federation?...


# オプションで入力する場合
$ alug -p hoge -t XXXXXX

https://signin.aws.amazon.com/federation?...
```

## 設定
alugには二箇所のファイルに設定が記述されている必要があります。

- `~/.aws/config`
- `~/.aws/credentials`

AWSではおなじみのConfigurationファイルたちですね。alugではこれらのAWSの公式設定に準拠する形でデザインしています。


### ~/.aws/config
`~/.aws/config` にはログイン先となるIAMロールに関するprofileを設定します。

```
[profile hoge]
role_arn = arn:aws:iam::000000000000:role/role_name
duration_seconds = 43200
mfa_serial = arn:aws:iam::123456789012:mfa/user
role_session_name = fuga
source_profile = default
```

- `role_arn`
  - ログイン先のIAMロール（設定が必須）
- `duration_seconds`
  - __これが今回の目的であるログインセッション時間の設定。__
  - 最大12時間（秒での設定なので12時間だと`43200`）
- `mfa_serial`
  - 前述したMFAが設定されている場合では必須
- `role_session_name`
  - ログインした時のsession名
- `source_profile`
  - AssumeRole元のprofile名

※これらの項目の説明はalugの文脈での説明です。AWS公式の設定に関しては以下のドキュメントで説明されています。
[設定ファイルと認証情報ファイルの設定 - AWS Command Line Interface](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-files.html)

※`duration_seconds` に関して最大12時間と記述しましたが、最大時間はログインするIAMロールの「最大CLI/APIセッション期間」の値が最大値となり、この「最大CLI/APIセッション期間」が最大12時間まで、ということに注意です。以下のようにAWSマネジメントコンソールのIAMロール詳細画面から設定値を見ることができます。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/41680/4751bcbb-b9e2-f4af-d2e5-74f5c48e5302.png)


### ~/.aws/credentials
上記に `source_profile` で指定しているprofileには正しいcredentialが設定されている必要があります。

前述の通り、今回のコンソールURLの発行に際して、AssumeRole APIを使って一時的に認証情報を取得する必要があり、当然APIを叩くためのcredentialを必要とします。なので、このprofileにはログイン先のIAMロールにAssumeRole可能なIAMポリシーがアタッチされたものである必要があります。

```
[default]
aws_access_key_id = XXX...
aws_secret_access_key = YYY...
```


# 締め
今回はAWSマネジメントコンソールのスイッチロール時のログインセッション時間を増やすためのCLIツール「alug」を紹介しました。
これで途中で消えてやり直すことをほぼ回避できるようになるので、よければご利用くださいませ。

なにかあれば shirakiya831 か issue を上げていただけますと。
それでは。

[^1]: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use_switch-role-console.html
[^2]: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_use.html#id_roles_use_view-role-max-session
[^3]: https://docs.aws.amazon.com/ja_jp/IAM/latest/UserGuide/id_roles_providers_enable-console-custom-url.html#STSConsoleLink_programPython