Amazon Linux 2でaws cli v2を試してみた #reinvent
西澤です。re:Invent初参戦です。みんな大好きAWS CLIにv2が出たとのことなので、遅ればせながらやってみました。
Developers.IOでも既に速報記事が多数上がっていますが、他にも試せることがないものか調べてみました。
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もたくさん上がっているようなので、ぜひフィードバックもしていきましょう。
どこかの誰かのお役に立てば嬉しいです。