AWS CLI と aws-vault の基本的な使い方

# はじめに
[ポート株式会社 サービス開発部 Advent Calendar 2023](https://adventar.org/calendars/9156) 19日目の記事です。

![スクリーンショット 2023-12-18 20.56.16.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676301/bf2dbd93-d96d-e8f5-f4d6-efaf01086150.png)

[ポート株式会社](https://www.theport.jp/) サービス開発部でバックエンド〜インフラ周りの開発をしている井上です。

今回は AWS をコマンドラインから操作する際によく使用する AWS CLI と aws-vault について、初めて使用する方を対象に基本的な使い方をまとめようと思います！

# 前提
IAM ユーザーのアクセスキーとシークレットキーを使用するので、作成してない方は AWS マネジメントコンソールから IAM ユーザーのセキュリティ認証情報にアクセスし、キーの作成を行なってください。

# AWS CLI
AWS CLI は AWS のサービスをコマンドラインから操作するためのツールで、開発者はターミナルやスクリプトから直接 AWS のリソースを管理することができます。

AWS はマネジメントコンソールから GUI で操作することもできますが、CLI を利用することで、繰り返し操作をスクリプトとしてまとめて自動化したり、手作業による人的ミスを減らしたりすることができます。

## インストール
まず、AWS CLI を利用するために awscli をインストールします。

```shell-session
$ brew install awscli
$ aws --version
aws-cli/2.13.17 Python/3.11.5 Darwin/21.6.0 exe/x86_64 prompt/off
```

## 使い方
### キーの保存
インストールが終わったら実際に使っていきます。

AWS CLI ではプロファイルという単位ごとに設定や認証情報を保存します。プロファイルを複数作成すると、異なる設定情報を切り替えて使うこともできるようになります。

今回は IAM のアクセスキーを任意のプロファイル名 (developer) で登録してみます。
Default output format は何も入力せず Enter でも大丈夫です。

```shell-session
$ aws configure --profile developer
AWS Access Key ID [None]: *********************
AWS Secret Access Key [None]: *********************
Default region name [None]: ap-northeast-1
Default output format [None]:
```

登録後はホームディレクトリに .aws ディレクトリが作成され、その中に config, credentials という2つのファイルが作成されます。

```shell-session
$ cd ~/.aws
$ ls
config		credentials
```

上で入力した情報のうちアクセスキー, シークレットキーなどの機密情報は credentials、それ以外のリージョンなどは config ファイルに保存されます。

ファイルには、設定した情報がプロファイルごとに分かれて保存されます。今回は developer プロファイルを設定したので、developer プロファイルの情報のみが保存されてます。

```:credentials
[developer]
aws_access_key_id = *********************
aws_secret_access_key = *********************
```

```:config
[profile developer]
region = ap-northeast-1
```

### 確認
ここまでできたらプロファイル名 developer を指定してキーが設定されてるかを確認します。

```shell-session
$ aws configure list --profile developer
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                developer           manual    --profile
access_key    ********************* shared-credentials-file    
secret_key    ********************* shared-credentials-file    
    region           ap-northeast-1      config-file    ~/.aws/config
```

また、以下のコマンドで認証情報が返って来れば OK です。

```shell-session
$ aws sts get-caller-identity --profile developer
{
    "UserId": "*********************",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/name"
}
```

### AWS にアクセス
上記で保存したアクセスキーを使って実際に AWS に CLI でアクセスできるか確認します。以下は developer プロファイルのキーを使って S3 バケットの一覧を表示するコマンドです。
```shell-session
$ aws s3 ls --profile developer
2023-12-19 12:00:00 〜S3の情報〜
```

# aws-vault
次に aws-vault を導入します。

aws-vault は、AWS のクレデンシャル情報を OS のキーチェーンなどに保存しておき、コマンド実行時に必要な情報を取得して認証する CLI ツールです。
aws-vault を利用することで認証情報を安全に管理することができます。

aws-vault でも AWS CLI 同様にプロファイルごとに認証情報を保存することができます。

## インストール
まずは aws-vault をインストールします。

```shell-session
$ brew install --cask aws-vault
$ aws-vault --version
v7.2.0
```

## 使い方
### キーの保存
インストールが終わったら以下のコマンドで登録されたキーの一覧を確認してみます。
Profile には developer が存在しますが、現時点では Credentials には何も保存されてませんね。


```shell-session
$ aws-vault ls
Profile                  Credentials              Sessions                       
=======                  ===========              ========                       
developer                -                        -                              
```

次に AWS CLI で設定した developer プロファイルを aws-vault でも登録してみます。

以下のコマンドを入力して developer のアクセスキーとシークレットキーを設定していきます。

```shell-session
$ aws-vault add developer
Enter Access Key ID: *********************
Enter Secret Access Key: *********************
Added credentials to profile "developer" in vault
```

途中で以下の画面が出てきたらパスワードの入力または設定をしてください。

<img width=500 src=https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/676301/d557d56e-a5dd-2f94-797f-de1a0c8e8b0b.png>


登録されたキーの一覧を確認すると、developer の Credentials に値が入ってることがわかります。

```shell-session
$ aws-vault ls
Profile                  Credentials              Sessions                       
=======                  ===========              ========                       
developer                developer                -                              
```

### 確認
aws-vault でのキーの設定が終わったら、developer プロファイルのキーが保存されてることを確認します。

```shell-session
$ aws-vault exec developer --no-session -- env | grep -i AWS_
AWS_VAULT=developer
AWS_REGION=ap-northeast-1
AWS_DEFAULT_REGION=ap-northeast-1
AWS_ACCESS_KEY_ID=*********************
AWS_SECRET_ACCESS_KEY=*********************
```

また、以下のコマンドで認証情報が返って来れば OK です。

```shell-session
$ aws-vault exec developer aws sts get-caller-identity
{
    "UserId": "*********************",
    "Account": "123456789012",
    "Arn": "arn:aws:iam::123456789012:user/name"
}
```

### AWS にアクセス
aws-vault で保存したアクセスキーを使って AWS にアクセスできるか確認します。以下は aws-vault を使って S3 バケットの一覧を表示するコマンドです。

```shell-session
$ aws-vault exec developer -- aws s3 ls
2023-12-19 12:00:00 〜S3の情報〜
```

### 削除
aws-vault に追加したキーは削除することも可能です。
以下のコマンドで先ほど追加した developer のキーを削除します。

```shell-session
$ aws-vault remove developer
Delete credentials for profile "developer"? (y|N) y
Deleted credentials.
```

削除したので developer プロファイルは使えなくなります。

```shell-session
$ aws-vault exec developer aws sts get-caller-identity
aws-vault: error: exec: Error getting temporary credentials: profile developer: credentials missing
```
```shell-session
$ aws-vault exec developer -- aws s3 ls
aws-vault: error: exec: Error getting temporary credentials: profile developer: credentials missing
```

# 最後に
今回は AWS CLI と aws-vault について初めて使用する方でもわかるように基本的な使い方をまとめました。
プロファイルが増えてきたり AWS CLI と aws-vault が混ざったりすると初めは少し混乱しますが、どのプロファイルでどちらのコマンドを打ってるのかを意識して使うと整理できると思います！