【2020年末】AWS CLI(Version 2)を使い始めるためのメモ

数年ぶりにAWSを利用するプロジェクトに参加することになりました。AWS CLIのVersion2がリリースされているなど情報の更新が必要でしたのでメモとして。

AWS CLI Version2については[こちら](https://aws.amazon.com/jp/blogs/news/aws-cli-v2-is-now-generally-available/)などを参照してください。

# この記事で説明する内容

- AWS CLI Version2のインストールと設定
- 認証用csvファイルのインポート方法と既存の問題点の説明
- その他
 - 2021年に更新される大阪リージョンについて
 - AWSの認証用csvの列構成について
 - pyenvの個別環境にAWS CLI Version2をインストールする方法 

# 作業環境

```sh
cat /etc/issue
> Ubuntu 18.04.5 LTS

python -V
> Python 3.8.6

pip --version
> pip 20.2.1 from /home/dev-user/.pyenv/versions/3.8.6/envs/sandbox-awscli/lib/python3.8/site-packages/pip (python 3.8)
```

### (参考:Pyenvでの構築手順)

Ubuntu18.04に上記環境を作るために実施したpyenvでの作業は次のとおりです。

```sh
# Python3.8環境を取得
pyenv install 3.8.6

# 作業用に3.8環境のコピーを作成
pyenv virtualenv 3.8.6 sandbox-awscli

# カレントディレクトリにコピーした環境を適用
pyenv local sandbox-awscli
```

# AWS CLI(Version 2)インストール

素朴にpip install awscliを実行すると古いVersion 1がインストールされます。[公式の方法](https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/install-cliv2-linux.html)でインストールします。


```sh
# インストーラをダウンロード
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"

# インストーラを解答
unzip awscliv2.zip

# インストールを実行
# (/usr/local/binにインストールされます)
sudo ./aws/install

# 確認
aws --version
> aws-cli/2.1.14 Python/3.7.3 Linux/5.4.0-58-generic exe/x86_64.ubuntu.18 prompt/off
```

### (参考)一般ユーザの場合など、コピー先を指定してインストール

READMEにsudoを使わない例として次のコマンドでインストールしてパス(~/.local/bin)を環境変数へ追加する方法が記載されています。

```sh
# (オプションの説明)
#   -i, --install-dir <path> 実行ファイルのコピー先ディレクトリを指定します。(default: /usr/local/aws-cli
#   -b, --bin-dir <path> 実行ファイルへのsymlinkを作成するディレクトリを指定します。(default: /usr/loca/bin)
./install -i ~/.local/aws-cli -b ~/.local/bin
```

### (参考)pyenvの個別環境へインストール

pyenvの個別環境(ここではsandbox-awscli)にインストールする場合は次のようになります。

```sh
./aws/install -i ~/.pyenv/versions/sandbox-awscli/bin/aws-cli -b ~/.pyenv/versions/sandbox-awscli/bin
```

私の環境では実行後にsourceでパスを読み直さないとawsコマンドが効きませんでした。

## AWSユーザの確認

利用するユーザの情報をAWSコンソールで確認しておきます。
・グループポリシーは目的にあっているかなど

## リージョンの確認

最近の状況を確認しておきます。

### リージョン一覧
https://docs.aws.amazon.com/ja_jp/AWSEC2/latest/UserGuide/using-regions-availability-zones.html#concepts-regions

### 東京リージョン
基本はこれ

|地域|リージョン名|
|---|---|
|アジアパシフィック (東京)| ap-northeast-1 |

### 大阪リージョン(ap-northeast-3)について

[AWS 大阪ローカルリージョンをフルリージョンへ拡張中](https://aws.amazon.com/jp/blogs/news/in-the-works-aws-osaka-local-region-expansion-to-full-region/)

> 大阪のローカルリージョンが 2021 年初頭までに 3 つのアベイラビリティーゾーンを持つ完全な AWS リージョンに拡大することになりました。他のすべての AWS リージョンと同様、アベイラビリティーゾーンはそれぞれ独自の電源、冷却システム、物理的セキュリティにより分離されます。
> (2020/12/28日現在)

# 設定用の認証ファイル(.csv)を準備する

AWS CLI Version2からの新機能として、認証情報をcsvファイルから読み込んで設定することができます（GCPユーザにはお馴染みのワークフローなので、プライベートがGCPメインの身としては嬉しい更新です）

けれど、ユーザを新規に作成して利用する場合はよいのですが、既存ユーザを利用する場合は一手間必要でしたので追って解説します。

## 新規ユーザの場合

普通に作成完了画面に表示されるcsvダウンロードボタンからダウンロードすればよいです。

csvファイルは次のような列構成になっています。

|User name|Password|Access key ID|Secret access key|Console login link|
|---|---|---|---|---|
|USERNAME||XXX|YYY|https://ZZZ.signin.aws.amazon.com/console

ファイル(new_user_credentials.csv)の内容は次のとおりです。

```sh
User name,Password,Access key ID,Secret access key,Console login link
USER NAME,,ACCESS KEY,SECRET KEY,https://USER ID.signin.aws.amazon.com/console
```
## 既存ユーザの場合

***既存ユーザで「アクセスキーの作成」完了画面からダウンロードしたcsvファイルにはimport時に要求されるUser Nameなどの列が含まれません。***

ですので、次の手順でダウンロードした後、手動で追加する必要があります。

### 認証用csvのダウンロード

***「AWSコンソール」->「IAM」->「認証」->「アクセスキーの作成」***
と進み、作成完了画面に表示されている
***「.csvファイルをダウンロード」***
からダウンロードしてください。

csvファイルは次のような列構成になっています。

|Access key ID|Secret access key|
|---|---|
|XXX|YYY|

このままimportを行おうとすると次のようにエラーとなります。

```sh
aws configure import --csv file://yuuki-sandbox_accessKeys.csv --profile-prefix prof-
> Expected header "User Name" not found
```

### 列の追加

良い方法が見つからなかったので、既存ユーザでimportを使いたい場合は前出の新規ユーザのcsvの内容をコピーして必要箇所を書き換えることにしました。

***良い方法をご存知でしたら教えていただけるとありがたいです！***


# AWS CLIの設定

## 認証用csvをインポートします。

***オプション無しでインポートすると、csvのUser Name列に格納されたユーザ名でプロファイルが自動的に作成されて認証情報が付与されます。***

--profileはインポートコマンドにも設定出来ますが、上記が優先されて無視されるので注意が必要です。

--profile-prefix <文字列> というオプションが用意されており、<文字列><USER NAME>という名前のプロファイルにすることができます。

```sh
# --profile-prefixオプションに従い、prof-<USER NAME>という名前のプロファイルが作成され、ここに認証情報がインポートされます。
aws configure import --csv file://new_credentials.csv --profile-prefix prof-
> Successfully imported 1 profile(s)

# profile追加の確認
aws configure list-profiles
> <プロファイル名>
```

# その他の設定

お定まりを設定しておきます。

## リージョン設定

```sh
aws configure set region ap-northeast-1 --profile <プロファイル名>
```
## 出力タイプ設定

```sh
aws configure set output <出力タイプ> --profile <プロファイル名>
```
選択可能な出力タイプは次のとおりです(2020年12月28日現在)

|出力タイプ|説明|
|---|---|
|json|JSON 文字列形式で出力されます。|
|yaml|YAML 文字列形式で出力されます。（AWS CLI バージョン 2 でのみ利用できます。）|
|yaml-stream|出力はストリーミングされ、YAML 文字列としてフォーマットされます。ストリーミングにより、大きなデータ型の処理を高速化できます。（AWS CLI バージョン 2 でのみ利用できます。）|
|text|複数行のタブ区切り文字列値の形式で出力されます。これは、grep、sed、または awk などのテキストプロセッサに出力を渡すのに役立ちます。|
|table|セルの罫線を形成する文字列 +&#124;- を使用して表形式で出力されます。通常、情報は他の形式よりも読みやすい「わかりやすい」形式で表示されますが、プログラムとしては役立ちません。|

## デフォルトプロファイルの変更

```sh
# Bシェルの場合
export AWS_DEFAULT_PROFILE=<プロファイル名>

# fishシェルの場合
set -x AWS_DEFAULT_PROFILE <プロファイル名>
```
必要な場合は.bashrcなどに追記します。

# 確認

認証が通っているかの確認のため簡単に情報表示してみます。

## s3のバケットリストを表示してみる

必要なアクセスポリシー例：AmazonS3ReadOnlyAccess

```sh
aws s3 ls
> 2020-12-28 17:36:44 yuuki-sample-bucket
```

## IAMユーザ一覧を表示してみる

必要なアクセスポリシー例：IAMReadOnlyAccess

```sh
aws iam list-users
> ~~
> - Arn: arn:aws:iam::XXX:user/yuuki-sandbox
>   CreateDate: '2020-12-28T02:16:22+00:00'
>   Path: /
>   UserId: YYY
>   UserName: yuuki-sandbox
```

# 最後に

誤りや足りない作業などありましたらご指摘ください。