この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。
西澤です。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もたくさん上がっているようなので、ぜひフィードバックもしていきましょう。
どこかの誰かのお役に立てば嬉しいです。