【小ネタ】MFA認証ユーザーでのAWSCLIアクセス設定

## はじめに
本記事はMFA認証のあるユーザーでAWSCLIを利用する際の手順を整理しています。同様の記事は多いとは思いますが自身の記録用として記載します。CLIを利用するたびに手順確認するのが面倒な方向けです。（私を含む）では〜！

## 前提条件

- AWS CLIがインストール済み
- IAMユーザーアカウントが作成済み
- MFAデバイスが設定済み
- [任意]jqコマンド（JSONを扱うのに便利なツール）がインストール済み

## 参考情報
先んじて公式より展開されている認証方法をご共有。

https://repost.aws/ja/knowledge-center/authenticate-mfa-cli

## 設定方法

### 0.アクセスキーの設定

まず、アクセスキーを発行します。
AWSマネジメントコンソールにて、発行可能です。
IAM > ユーザー > 確認したいIAMユーザー > セキュリティ認証情報 > アクセスキー > アクセスキーを作成

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1827273/c2c32607-2e1a-4e7b-a933-4170c4dfd0ae.png)

:::note warn
アクセスキーは一度しか表示されないため、`.csv`ファイルをダウンロードするなど忘れずに管理してください。
:::

```bash
$ aws configure
AWS Access Key ID [None]: 取得したID
AWS Secret Access Key [None]: 取得したシークレットキー
Default region name [None]: 任意のリージョン（東京ならap-northeast-1）
Default output format [None]: 任意の出力方法（json[デフォルト],yaml,yaml-stream,text,tableなど。未入力でデフォルト設定）
```
対話形式で先ほど取得したアクセスキーを保存します。紐付け時、プロファイル名の指定がない場合は`default`という名前で保存されます。

### 1.現在の認証情報の確認

現在のAWS認証情報を確認します。

```bash
$ cat ~/.aws/credentials
[default]
aws_access_key_id = hoge
aws_secret_access_key = fuga
```

### 2.MFAデバイスの確認

次に設定されているMFAデバイスを確認します。

```bash
$ aws iam list-mfa-devices --profile default
{
    "MFADevices": [
        {
            "UserName": "{IAMユーザー名}", # IAMユーザー
            "SerialNumber": "arn:aws:iam::{AWSアカウントID}:{MFADevice名}", # MFAデバイスのARN
            "EnableDate": "2024-08-16T01:11:11+00:00" # 作成日
        }
    ]
}
```

`SerialNumber`の値を次のステップで利用します。

AWSコンソール上からも同様に確認が可能です。
IAM > ユーザー > 確認したいIAMユーザー > セキュリティ認証情報 > 多要素認証

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1827273/6e816efe-e9c3-46df-8215-c1c992a795f7.png)


### 3.一時的なセッショントークンの取得

MFAデバイスから取得した認証コードを使って、一時的なセッショントークンを取得します。

```bash
$ aws sts get-session-token \
 --serial-number arn:aws:iam::{AWSアカウントID}:{MFADevice名} \ # MFAデバイスのARN
 --token-code {6桁コード} \ # MFAデバイスに表示されている6桁のコード
 --profile default \ # 使用するプロファイル
 --output json # 出力形式
 --duration-seconds 129600 # 有効期限
```

こんな感じで表示されている6桁の数字です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1827273/298d7eb9-24df-4bd2-bbca-f900733da316.png)

:::note warn
一時セッションはデフォルト43,200秒（＝12時間）有効です。
最大129,600秒（＝36時間）まで指定可能です。
:::


### 4.取得したクレデンシャルの設定

取得した一時的なクレデンシャルを`mfa`プロファイルに新規設定します。すでに作成済みファイルの場合は上書き更新されます。

```bash
$ aws configure set aws_access_key_id {hoge} --profile mfa
$ aws configure set aws_secret_access_key {huga} --profile mfa
$ aws configure set aws_session_token {piyo} --profile mfa
```

これにより、`mfa`プロファイルを使用するとMFA認証された状態でAWS CLIコマンドを実行できます。

### 5.更新後の認証情報の確認

AWS認証情報を確認します。`mfa`という認証情報が登録できていればOK!

```bash
$ cat ~/.aws/credentials
[default]
aws_access_key_id = hoge
aws_secret_access_key = fuga
[mfa]
aws_access_key_id = hoge
aws_secret_access_key = fuga
aws_session_token = piyo
```

## 簡単1コマンド実行方法

上記のステップをすべて1つのコマンドで実行できます。

```bash
OUTPUT=$(aws sts get-session-token --serial-number arn:aws:iam::{AWSアカウントID}:{MFADevice名} --token-code {6桁コード} --profile default --output json) && \
aws configure set aws_access_key_id $(echo $OUTPUT | jq -r '.Credentials.AccessKeyId') --profile mfa && \
aws configure set aws_secret_access_key $(echo $OUTPUT | jq -r '.Credentials.SecretAccessKey') --profile mfa && \
aws configure set aws_session_token $(echo $OUTPUT | jq -r '.Credentials.SessionToken') --profile mfa
```

このコマンドでは、`jq`コマンドを使用して JSON 出力から値を抽出しています。

## 使用方法

設定後は、以下のように`--profile mfa`オプションを付けてコマンドを実行します：

```bash
aws s3 ls --profile mfa
```

これで、MFA認証された状態でAWSリソースにアクセスできます！

## まとめ
今回はAWSCLI利用時に、作業開始前に行う設定方法をまとめました。複数の認証情報を管理できることを学んだので、複数のAWSアカウントごとに適切に管理したり、正しく認証情報を扱えるようもっと理解を深めていきたいと思います。引き続き取り組んでいきます〜！


## その他参考情報

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

https://zenn.dev/akkie1030/articles/aws-cli-mfa-account