Amazon Linux 2でaws cli v2を試してみた #reinvent

西澤です。re:Invent初参戦です。みんな大好きAWS CLIにv2が出たとのことなので、遅ればせながらやってみました。

Developers.IOでも既に速報記事が多数上がっていますが、他にも試せることがないものか調べてみました。

[レポート] DEV322: What’s New with the AWS CLI #reinvent

AWS CLI v2のconfigure Importを使ってみた #reinvent

AWS CLI v2のWizardを使ってLambdaをデプロイした #reinvent

Amazon Linux 2環境でのAWS CLI v2へのアップグレード

今回はまっさらなAmazon Linux 2を用意して試してみることにしました。

[ec2-user@ip-10-200-1-140 ~]$ aws --version
aws-cli/1.15.80 Python/2.7.14 Linux/4.14.77-81.59.amzn2.x86_64 botocore/1.10.79

[ec2-user@ip-10-200-1-140 ~]$ cat /etc/os-release
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"

[ec2-user@ip-10-200-1-140 ~]$ uname -a
Linux ip-10-200-1-140.us-west-2.compute.internal 4.14.77-81.59.amzn2.x86_64 #1 SMP Mon Nov 12 21:32:48 UTC 2018 x86_64 x86_64 x86_64 GNU/Linux

まず、前提となるgitとpipコマンドを用意します。今回はユーザ単位で使うことを想定して、"--user"で試しました。

[ec2-user@ip-10-200-1-140 ~]$ sudo yum install git -y[ec2-user@ip-10-200-1-140 ~]$ curl -O https://bootstrap.pypa.io/get-pip.py
[ec2-user@ip-10-200-1-140 ~]$ python get-pip.py --user
[ec2-user@ip-10-200-1-140 ~]$ echo 'export PATH=~/.local/bin:$PATH' >> ~/.bash_profile
[ec2-user@ip-10-200-1-140 ~]$ source .bash_profile

直接v2へのアップデートをやろうとしたところ、依存関係の問題でアップグレードが上手くいかなかったので、一旦AWS CLI v1のバージョンを最新まで上げておきます(他に原因があるかもしれませんが、試行錯誤してこうなりました)。

[ec2-user@ip-10-200-1-140 ~]$ pip install -U awscli --user
Collecting awscli
  Using cached https://files.pythonhosted.org/packages/6c/3f/abd77c55336e00f208caac085f0ba5a6e711c78675abcec562fc4ebd6c30/awscli-1.16.63-py2.py3-none-any.whl
Collecting botocore==1.12.53 (from awscli)
  Using cached https://files.pythonhosted.org/packages/1a/f6/1b481cef9ad9978b8c8e57713416af5b041d7742912087188fc46a638480/botocore-1.12.53-py2.py3-none-any.whl
Requirement already satisfied, skipping upgrade: docutils>=0.10 in /usr/lib/python2.7/site-packages (from awscli) (0.12)
Requirement already satisfied, skipping upgrade: colorama<=0.3.9,>=0.2.5 in /usr/lib/python2.7/site-packages (from awscli) (0.3.2)
Requirement already satisfied, skipping upgrade: rsa<=3.5.0,>=3.1.2 in /usr/lib/python2.7/site-packages (from awscli) (3.4.1)
Requirement already satisfied, skipping upgrade: PyYAML<=3.13,>=3.10 in /usr/lib64/python2.7/site-packages (from awscli) (3.10)
Requirement already satisfied, skipping upgrade: s3transfer<0.2.0,>=0.1.12 in /usr/lib/python2.7/site-packages (from awscli) (0.1.12)
Requirement already satisfied, skipping upgrade: urllib3<1.25,>=1.20; python_version == "2.7" in ./.local/lib/python2.7/site-packages (from botocore==1.12.53->awscli) (1.24.1)
Requirement already satisfied, skipping upgrade: python-dateutil<3.0.0,>=2.1; python_version >= "2.7" in /usr/lib/python2.7/site-packages (from botocore==1.12.53->awscli) (2.6.0)
Requirement already satisfied, skipping upgrade: jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/site-packages (from botocore==1.12.53->awscli) (0.9.3)
Requirement already satisfied, skipping upgrade: pyasn1>=0.1.3 in /usr/lib/python2.7/site-packages (from rsa<=3.5.0,>=3.1.2->awscli) (0.1.9)
Requirement already satisfied, skipping upgrade: futures<4.0.0,>=2.2.0 in /usr/lib/python2.7/site-packages (from s3transfer<0.2.0,>=0.1.12->awscli) (3.0.5)
Requirement already satisfied, skipping upgrade: six>=1.5 in /usr/lib/python2.7/site-packages (from python-dateutil<3.0.0,>=2.1; python_version >= "2.7"->botocore==1.12.53->awscli) (1.9.0)
Installing collected packages: botocore, awscli
  Found existing installation: botocore 1.12.48
    Uninstalling botocore-1.12.48:
      Successfully uninstalled botocore-1.12.48
Successfully installed awscli-1.16.63 botocore-1.12.53

[ec2-user@ip-10-200-1-140 ~]$ aws --version
aws-cli/1.16.63 Python/2.7.14 Linux/4.14.77-81.59.amzn2.x86_64 botocore/1.12.53

この状態で、v2へのバージョンアップを試したら上手く行きました。

[ec2-user@ip-10-200-1-140 ~]$ pip install -e git://github.com/aws/aws-cli.git@v2#egg=awscli --user
Obtaining awscli from git+git://github.com/aws/aws-cli.git@v2#egg=awscli
  Updating ./src/awscli clone (to revision v2)
Collecting botocore==1.12.48 (from awscli)
  Using cached https://files.pythonhosted.org/packages/b0/ff/eae3b8e2c6ee63ea8451af78ff31d3fe0749fbc01bc498334a4893e58b80/botocore-1.12.48-py2.py3-none-any.whl
Requirement already satisfied: colorama<=0.3.9,>=0.2.5 in /usr/lib/python2.7/site-packages (from awscli) (0.3.2)
Requirement already satisfied: docutils>=0.10 in /usr/lib/python2.7/site-packages (from awscli) (0.12)
Requirement already satisfied: rsa<=3.5.0,>=3.1.2 in /usr/lib/python2.7/site-packages (from awscli) (3.4.1)
Requirement already satisfied: s3transfer<0.2.0,>=0.1.12 in /usr/lib/python2.7/site-packages (from awscli) (0.1.12)
Requirement already satisfied: ruamel.yaml<0.16.0,>=0.15.0 in ./.local/lib/python2.7/site-packages (from awscli) (0.15.80)
Requirement already satisfied: prompt-toolkit<3.0.0,>=2.0.0 in ./.local/lib/python2.7/site-packages (from awscli) (2.0.7)
Requirement already satisfied: urllib3<1.25,>=1.20; python_version == "2.7" in ./.local/lib/python2.7/site-packages (from botocore==1.12.48->awscli) (1.24.1)
Requirement already satisfied: python-dateutil<3.0.0,>=2.1; python_version >= "2.7" in /usr/lib/python2.7/site-packages (from botocore==1.12.48->awscli) (2.6.0)
Requirement already satisfied: jmespath<1.0.0,>=0.7.1 in /usr/lib/python2.7/site-packages (from botocore==1.12.48->awscli) (0.9.3)
Requirement already satisfied: pyasn1>=0.1.3 in /usr/lib/python2.7/site-packages (from rsa<=3.5.0,>=3.1.2->awscli) (0.1.9)
Requirement already satisfied: futures<4.0.0,>=2.2.0 in /usr/lib/python2.7/site-packages (from s3transfer<0.2.0,>=0.1.12->awscli) (3.0.5)
Requirement already satisfied: ruamel.ordereddict; platform_python_implementation == "CPython" and python_version <= "2.7" in ./.local/lib/python2.7/site-packages (from ruamel.yaml<0.16.0,>=0.15.0->awscli) (0.4.13)
Requirement already satisfied: wcwidth in ./.local/lib/python2.7/site-packages (from prompt-toolkit<3.0.0,>=2.0.0->awscli) (0.1.7)
Requirement already satisfied: six>=1.9.0 in /usr/lib/python2.7/site-packages (from prompt-toolkit<3.0.0,>=2.0.0->awscli) (1.9.0)
Installing collected packages: botocore, awscli
  Found existing installation: botocore 1.12.53
    Uninstalling botocore-1.12.53:
      Successfully uninstalled botocore-1.12.53
  Found existing installation: awscli 1.16.63
    Uninstalling awscli-1.16.63:
      Successfully uninstalled awscli-1.16.63
  Running setup.py develop for awscli
Successfully installed awscli botocore-1.12.48

[ec2-user@ip-10-200-1-140 ~]$ aws --version
aws-cli/2.0.0dev0 Python/2.7.14 Linux/4.14.77-81.59.amzn2.x86_64 botocore/1.12.48

AWS CLI v2の変更点のおさらい

改めて大きな変更点をGithub上の情報から拝借してみると、こんな感じになるようです。

  • auto-completionの性能改善
  • リソース名の自動補完(DynamoDBテーブル名、IAMユーザ名、等)
  • ウィザードによるインタラクティブな操作のサポート
  • ハイレベルddbコマンド(selectおよびputを含む)の追加
  • "aws logs tail"コマンドの追加(直近のログをCloudWatch Logsグループから参照できる)
  • インスタンスメタデータからのリージョン自動取得
  • "aws confiugre import"コマンドによるCSVクレデンシャルファイルのインポート
  • yaml形式のアウトプット
  • "aws configure list-profiles"コマンド(クレデンシャル情報の一覧化)の追加

望月からのセッションレポートにもある通り、後方互換の無い変更もあるようなので、要注意です。

  • python2.6、3.3、3.4の非サポート
  • デフォルトタイムスタンプをiso8601形式に統一
  • httpおよびhttpsからの値取得

AWS CLI v2を試してみた

先に挙げた変更点の中から、Developers.IOでは試されていなそうなものについて、いくつか動作確認してみました。

例えば、以下のコマンドでIAMユーザ名のリストが自動的にtabから補完されることを確認できます。

[ec2-user@ip-10-200-1-140 awscli]$ aws iam get-user --user-name ###ここでtabを連打しました
cm-nishizawa.tetsunori        user-readonly              ses-smtp-user

ddbハイレベルコマンドもとても便利そうですが、それぞれのオプションについてはここでは割愛しておきます。

[ec2-user@ip-10-200-1-140 awscli]$ aws ddb help
DDB()                                                                    DDB()



NAME
       ddb -

DESCRIPTION
       High level DynamoDB commands.

       See 'aws help' for descriptions of global parameters.

SYNOPSIS
          aws ddb <Command> [<Arg> ...]

OPTIONS
       None

       See 'aws help' for descriptions of global parameters.

AVAILABLE COMMANDS
       o put

       o select



                                                                         DDB()
(END)

EC2インスタンスの場合には、環境変数や設定ファイルで、Region指定をしていなくても、自動でメタデータからRegionが指定されていました。これは便利!

[ec2-user@ip-10-200-1-140 awscli]$ aws configure list
      Name                    Value             Type    Location
      ----                    -----             ----    --------
   profile                <not set>             None    None
access_key     ****************INBZ         iam-role
secret_key     ****************DqIa         iam-role
    region                us-west-2             imds

[ec2-user@ip-10-200-1-140 awscli]$ aws ec2 describe-availability-zones
{
    "AvailabilityZones": [
        {
            "State": "available",
            "ZoneName": "us-west-2a",
            "Messages": [],
            "ZoneId": "usw2-az1",
            "RegionName": "us-west-2"
        },
        {
            "State": "available",
            "ZoneName": "us-west-2b",
            "Messages": [],
            "ZoneId": "usw2-az2",
            "RegionName": "us-west-2"
        },
        {
            "State": "available",
            "ZoneName": "us-west-2c",
            "Messages": [],
            "ZoneId": "usw2-az3",
            "RegionName": "us-west-2"
        }
    ]
}

yaml形式での出力もできました!

[ec2-user@ip-10-200-1-140 awscli]$ aws ec2 describe-availability-zones --output yaml
AvailabilityZones:
- Messages: []
  RegionName: us-west-2
  State: available
  ZoneId: usw2-az1
  ZoneName: us-west-2a
- Messages: []
  RegionName: us-west-2
  State: available
  ZoneId: usw2-az2
  ZoneName: us-west-2b
- Messages: []
  RegionName: us-west-2
  State: available
  ZoneId: usw2-az3
  ZoneName: us-west-2c

まとめ

個人的にはTab補完がすごく早くなったのが一番嬉しいです。AWS CLI v2オススメなのでぜひ試してみてください!Issueもたくさん上がっているようなので、ぜひフィードバックもしていきましょう。

どこかの誰かのお役に立てば嬉しいです。