【CLI,CDK】アクセスキーを用いたIAMユーザー認証について簡単にまとめた

# 経緯
CDKを使用する際に、CLIの認証情報を使用していることを知りました。普段アクセスキーを用いてCLIを叩いていて、その辺周辺の知識がふわふわしていたので復習、備忘録がてら記事を書きました。


https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/configure-access.html


# 前提条件
記事を書くために調査をしていると、この記事でまとめている手法については本番環境などでは非推奨であることがわかりました。
あくまで開発環境や砂場環境などでの使用を前提とします。

>警告
セキュリティリスクを避けるため、専用ソフトウェアの開発や実際のデータを扱うときは、IAM ユーザーを認証に使用しないでください。代わりに、AWS IAM Identity Center などの ID プロバイダーとのフェデレーションを使用してください。


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


# AWSを使用するにあたっての認証の種類をざっくり確認
AWSサービスを利用するにあたって、ユーザーは複数の認証方法を用いて認証することができます。

  
### 1. IAMユーザーによる認証(パスワード)
これはマネジメントコンソールでの開発の際に利用している認証方法

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3480176/4e6d3746-f40c-7a1e-883a-6fb80cecfd96.png)
この画面からパスワード入力などを行うことによって、認証が行われ、ユーザーはマネジメントコンソール上で権限を持って作業することができます。


### 2. IAMユーザーによる認証(アクセスキー)
今回まとめる手法。CLI（CDK）、SDKなどの開発の際に利用される認証方法。

### 3. IAMロールによる認証
Lambdaなどでの開発の際に使用する方法。リソースやサービスに一時的な権限を付与します。

<pr>

### 3. AWS Security Token Service (STS)による一時的な認証
AWS STSを使用して、IAMユーザーやIAMロールに一時的な認証情報（トークン）を発行します。これらの一時的な認証情報には有効期限があり、通常は数分から数時間。


### 4.フェデレーション認証
AWS以外の外部アイデンティティプロバイダー（例: SAML、Active Directory、Google、Facebookなど）を使用してAWSにアクセスするための認証方式。これにより、ユーザーはAWSアカウントにIAMユーザーを作成せずにアクセスできます。

<br>
このような認証方法があるなかで、今回は「IAMユーザーによる認証(アクセスキー)」について調べてみます。



# IAMユーザー認証情報を使用してCLIを使用するための手順
公式ドキュメント

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

上記の記事では
- IAMユーザーの作成
- アクセスキーの取得
- CLIの設定
を行っています。
今回の記事では
**CLIの設定の部分=ローカルでの認証情報の取り扱い**
についてもう少し深掘りしたいと思います。


# ローカルでのIAMユーザー認証情報を確認
自分のローカルでのAWSの認証情報はホームディレクトリ配下の隠しディレクトリ~/.awsの
**credentials ファイルとconfig ファイル**
を確認することで把握することができます。


この記事が非常に参考になりました

https://qiita.com/minorun365/items/7ee8bb1478bfbceb1d1b


## credentialsファイルの確認とプロファイルについて

IAMユーザーによる認証(アクセスキー)を使用して、CLIを使用する時に ~/.aws/credentialsファイルに必要な認証情報を格納しています。ここに入っている認証情報のことを**クレデンシャル**といいます。




クレデンシャルの中身を確認してみます。
```
cat ~/.aws/credentials
```

```
[hogehoge-development]
aws_access_key_id = HOGE45464HOGWHOGE
aws_secret_access_key = hogeHogEhogehogehogeho
[default]
aws_access_key_id = HOgehohgoeho979464
aws_secret_access_key = hogehoge343hohohgege
```

出力するとこのように表示されました。
この[hogehoge-development]や[default]のことを**プロファイル**と呼びます。
このプロファイルはAWSアカウントの認証情報そのもので、
簡単にいうと、**今の私のPCではCLIを通じて２つのアカウントに対して作業を行える状況にあります**

CLIコマンドやCDKコマンドを使用するときは、--profileオプションを使用することで、指定したAWSアカウントを対象にコマンドを実行できるようになります。


https://qiita.com/crossroad0201/items/f84b3e2fece41750755b

例えば、
```
aws s3 ls --profile hogehoge-development
```
というコマンドの場合はhogehoge-developmentアカウントのS3の一覧を取得でき、
<br>
```
aws s3 ls
```
とした場合はdefaultの方のアカウントのS3の一覧を取得することになります。





## configファイルの確認
こちらの確認もしてみます
```
cat ~/.aws/config
```

```
[profile hogehoge-development]
region = ap-northeast-1
[default]
region = ap-northeast-1
output = json
```

前述のcredentialsファイルで定義した各プロファイルについて、デフォルトで利用するAWSリージョンなどを定義しています。


# よく使うコマンドメモ

 ローカルでのIAMユーザー認証情報周りでよく使うコマンドを備忘録代わりに置いておきます。
 <br>

 現在のAWS CLIで認証されているIAMユーザーやロールの情報を取得
 現在使用しているクレデンシャルの詳細な情報（UserID、Account、Arn）
 ```
 aws sts get-caller-identity
 ```
 <br>
 
 

アクセスキーの一覧を確認(credentials）
```
cat ~/.aws/credentials
```
<br>

 リージョンの一覧などの設定を確認(config)
```
cat ~/.aws/config
```
<br>

今使用しているプロファイルの確認
```
aws configure list
```

<br>
プロファイルを指定してcliの実行（オプションを消すとdefault)

```
aws s3 ls --profile hogehoge-development
```

<br>
プロファイルを指定してcdkコマンドの実行（オプションを消すとdefault)

```
cdk diff --profile hogehoge-development
```



<br>
プロファイルを指定してクレデンシャルを追加

```
aws configure --profile hugahuga

AWS Access Key ID [None]: AKIAIOhogehoge
AWS Secret Access Key [None]: wJalrXUthogehoge
Default region name [None]: ap-northeast-1
Default output format [None]: json
```

# 参考記事まとめ

https://docs.aws.amazon.com/ja_jp/cdk/v2/guide/configure-access.html

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

https://qiita.com/minorun365/items/7ee8bb1478bfbceb1d1b

https://qiita.com/crossroad0201/items/f84b3e2fece41750755b