AWS CLI v2 が GA(General Availability) になったので早速使ってみました。

みんな大好き AWS CLI の v2 が 2020年2月11日日本時間早朝に GA(General Availability) となりました！
わーい。
https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-is-now-generally-available/

筆者はAWS CLI の薄い本を書くくらい AWS CLI が好きだったりします。
というわけで、早速使ってみました。

## インストール
公式ガイドには Linux、 macOS、 Windows 向けのインストール手順が載っています。
今回は、 AmazonLinux2 で試したので、 Linux の手順に則ってみました。

公式ガイド：https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2.html

### インストールする
公式ガイドには以下の記載があります。
https://docs.aws.amazon.com/cli/latest/userguide/install-cliv2-linux.html#cliv2-linux-install

```sh
curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
unzip awscliv2.zip
sudo ./aws/install
```


実際に試すとこんな感じ。

```sh
ec2-user@test ~]$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
                                 Dload  Upload   Total   Spent    Left  Speed
100 30.6M  100 30.6M    0     0  64.1M      0 --:--:-- --:--:-- --:--:-- 64.0M
[ec2-user@test ~]$ ls
awscliv2.zip
[ec2-user@test ~]$
[ec2-user@test ~]$ unzip awscliv2.zip
Archive:  awscliv2.zip
   creating: aws/
   creating: aws/dist/
(中略)
  inflating: aws/dist/zlib/cpython-37m-x86_64-linux-gnu/soib.cpython-37m-x86_64-linux-gnu.so
[ec2-user@test ~]$
[ec2-user@test ~]$ sudo ./aws/install
You can now run: /usr/local/bin/aws --version
[ec2-user@test ~]$
[ec2-user@test ~]$ /usr/local/bin/aws --version
aws-cli/2.0.0 Python/3.7.3 Linux/4.14.154-128.181.amzn2.x86_64 botocore/2.0.0dev4
[ec2-user@test ~]$
```

## 早速試してみます。
本稿執筆時点での新機能は以下の通りです。

- インストーラ
 - これは上記で試し済み。今までの差異としては、ビルド済みパッケージでの提供かつ前提を満たすバージョンの Python を事前にインストールする必要がなくなりました。
- 設定手順
 - これまで AWS CLI に IAM ユーザーの認証情報を設定するのには、IAM ユーザー作成時に表示される情報もしくは作成時にダウンロードできる csv ファイルを参照して設定を行っていました。 v2 ではその csv ファイルをインポートして設定が可能になりました。
 - また、認証方法として SSO も利用可能になりました。
- リソース名の自動補完
 - すでに AWS アカウント上に存在するリソース名を補完して CLI のパラメータにしてができるようになりました。地味にすごい。 
- 自動プロンプト
 - 必要なパラメータ指定をアシストしてくれるようになりました。これで必須パラメータ漏れで怒られることも減ります。
- ウィザード
 - いわゆる、対話型のコマンドとして動作するモードです。本稿執筆時点では一部のサービスのみに対応しています。 
- yaml での出力
 - 実行結果の出力形式に yaml が追加されました。  

本稿では、リソース名の自動補完と自動プロンプト、ウィザード、yaml での出力について試してみます。
SSO は可能なら試行後に更新します。

## リソース名の自動補完
現時点では全部のサービスには対応しきっていないようです。
例えば、試行した中では Amazon EC2 や Amazon S3 のバケット名、 RDS などは対応していないようです。
今後この辺りの拡充が期待されます。

というわけで、後述のウィザードに対応しているサービス(Amazon DynamoDB や AWS IAM、AWS Lambda)は対応しているようだったので、試してみました。

```sh
[ec2-user@test ~]$ aws dynamodb describe-table --table-name <TABキーを押す>
12234            table-us-east-1
[ec2-user@test ~]$
[ec2-user@test ~]$ aws iam get-user --user-name <TABキーを押す>
cli         codecommit  hirosys
[ec2-user@test ~]$
[ec2-user@test ~]$ aws lambda get-function --function-name <TABキーを押す>
AWS-DeepRacer-Test-Reward-Function              aws-deepracer-reward-fn-********-****-****-****-************
```

## 自動プロンプト
自動プロンプト機能を使って、 Amazon VPC を作成してみました。

```sh
[ec2-user@test ~]$ aws ec2 create-vpc --cli-auto-prompt
--cidr-block: 10.20.0.0/16
```

必須パラメータである --cidr-block の指定の後、任意パラメータのリストが表示されました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/65b7c773-b74e-d87e-fa20-91f97741914c.png)

特に指定せずに一番下にある ** [DONE] Parameter input finished** を選択してEnterキーを押下すると、VPC が作成できました。

```sh
{
    "Vpc": {
        "CidrBlock": "10.20.0.0/16",
        "DhcpOptionsId": "dopt-********",
        "State": "pending",
        "VpcId": "vpc-*****************",
        "OwnerId": "************",
        "InstanceTenancy": "default",
        "Ipv6CidrBlockAssociationSet": [],
        "CidrBlockAssociationSet": [
            {
                "AssociationId": "vpc-cidr-assoc-*****************",
                "CidrBlock": "10.20.0.0/16",
                "CidrBlockState": {
                    "State": "associated"
                }
            }
        ],
        "IsDefault": false,
        "Tags": []
    }
}
```

無事に作成できました。

### 気になった点・・・
aws ec2 describe-instances を自動プロンプトモードで実行した際、 --instance-ids にインスタンスIDを指定しても、以下のメッセージが表示されて実行できませんでした。

```sh
An error occurred (InvalidInstanceID.Malformed) when calling the DescribeInstances operation: Invalid id: "-"
```

しかし、 **Print CLI command.** で出力した CLI を実行する分には意図した通りに動く不思議。。。

## ウィザード

```sh
[ec2-user@test ~]$ aws lambda wizard new-function
```
まずは作成する Lambda 関数の名前を指定します。
次に、使用するランタイムの種類やバージョンをリストから選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/ce559c83-d804-ad7a-6af7-b0675e5c5f01.png)

さらに、どのロールを使用するかをリストで選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/0c21206d-0839-ee38-b2fa-54b7fac06390.png)

そして、 handler と Lambda 関数が入った zip ファイルを指定して、
最終的には以下のような感じになり、実行します。

```sh
[ec2-user@test ~]$ aws lambda wizard new-function
Enter the function name: cliv2
Select the Lambda runtime
Select the role to use
Enter the handler for your function: lambda_function.lambda_handler
Enter the new location of your code zip file: cliv2_test.zip
[ec2-user@test ~]$
```

特にエラーなく実行できれば Lambda 関数の作成に成功しています。
以下は、マネージメントコンソールで確認した結果です。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/548623/055c6a4b-5ab8-c22c-3867-64fe230f35d4.png)

リストから選択したランタイムやロールが表示されると尚良さそうですね。

## yaml での出力

好みの問題もあるかもしれませんが、個人的には yaml は読みやすいと思っているのでこのアップデートはナイスです。

```sh
[ec2-user@test ~]$ aws ec2 describe-instances --output yaml
Reservations:
- Groups: []
  Instances:
  - AmiLaunchIndex: 0
    Architecture: x86_64
    BlockDeviceMappings:
    - DeviceName: /dev/xvda
      Ebs:
        AttachTime: '2020-02-11T14:25:47+00:00'
        DeleteOnTermination: true
        Status: attached
        VolumeId: vol-*****************
    CapacityReservationSpecification:
      CapacityReservationPreference: open
    ClientToken: ''
    CpuOptions:
      CoreCount: 1
      ThreadsPerCore: 1
    EbsOptimized: false
    EnaSupport: true
    HibernationOptions:
      Configured: false
    Hypervisor: xen
    IamInstanceProfile:
      Arn: arn:aws:iam::************:instance-profile/role-tsuyoi
      Id: *********************
    ImageId: ami-*****************
    InstanceId: i-*****************
    InstanceType: t2.micro
    KeyName: ***********
    LaunchTime: '2020-02-11T14:25:46+00:00'
    MetadataOptions:
      HttpEndpoint: enabled
      HttpPutResponseHopLimit: 1
      HttpTokens: optional
      State: applied
    Monitoring:
      State: disabled
    NetworkInterfaces:
    - Association:
        IpOwnerId: amazon
        PublicDnsName: ec2-***-***-***-***.ap-northeast-1.compute.amazonaws.com
        PublicIp: ***.***.***.***
      Attachment:
```

## まとめ
AWS CLI はもともと好きでしたが、今回の v2 でさらにかゆいところに手が届く機能に変身しており、ますます好きな機能になったと感じました。
皆さんもこの機会に AWS CLI に触れてみてはいかがでしょうか。

## 追記
AWS さんが Docker Hub に AWS CLI v2 のイメージを公開してくれました！
さくっとお試しするのにはもってこいです！

https://aws.amazon.com/jp/blogs/developer/aws-cli-v2-docker-image/

早速使ってみた方が Qiita にまとめてくださっています！
https://qiita.com/kai_kou/items/cfb7c1d6a449e0da68d1