AWS CLI v2をpipからインストールしてみた

AWS CLI v2がGAされました!

早速使い込みたいところですが、Mac/Windows/AMD64 Linux 向けのビルド済みインストーラーしか提供されておらず

などが不便です。

今回は AWS CLI v2 をソースコードからインストールして、上記課題を解決する方法を紹介します。

AWS CLI V2をソースコードからインストールする

EC2にはARMベースの AWS Gravitonプロセッサーを搭載したEC2 A1インスタンスがあります。

$ uname -r
4.14.154-128.181.amzn2.aarch64

AWS CLI V2 は、諸々がバンドルされたビルド済みバイナリが用意されていますが、残念ながらARM(AArch64)向けのバイナリは現時点では提供されていません。

利用環境向けのバイナリが提供されていないときは、GitHub をターゲットにしてインストールしましょう。

AWS CLI の実態である botocore(低レベルAPI) と aws-cli(CLI向け高レベルAPI) の v2 ブランチを pip 経由で GitHub からインストールします。

$ python3 -mpip install https://github.com/boto/botocore/archive/v2.tar.gz
$ python3 -mpip install https://github.com/aws/aws-cli/archive/v2.tar.gz
$ aws --version
aws-cli/2.0.0 Python/3.7.4 Linux/4.14.154-128.181.amzn2.aarch64 botocore/2.0.0dev4

非常に重要な点として、botocoreと aws-cli のインストール順を逆にすると、インストールに失敗します。ご注意ください。

ビルドに必要なパッケージをインストール

AWS CLI v2のビルドにはいくつかの開発系パッケージが必要です。

Amazon Linux 2のまっさら環境では、以下のパッケージをインストールすると、ビルドできます。

$ sudo yum install -y python3 python3-devel gcc libffi-devel openssl-devel

ディストリビューション・OSに合わせて読み替えてください。

AWS CLI V2 はPyPIに登録されていない

GitHub 経由でインストールする必要がある理由について説明します。

AWS CLI V2 向けのパッケージ(aws-cli,botocore)は Python のパッケージインデックスである PyPI に登録されていません

そのため pip で v2 用のバージョン(2.0.0)を指定して AWS CLI をインストールしようとしても、失敗します。

$ python3 -m pip install awscli==2.0.0
Collecting awscli==2.0.0
  Could not find a version that satisfies the requirement awscli==2.0.0 (from versions: 0.4.1,
  ...
No matching distribution found for awscli==2.0.0

しかたなしに AWS CLI を GitHub からインストールしようとすると、aws-cli が 依存している botocore のV2向けバージョン(2.0.0dev4)が PyPI に登録されていないので、インストールに失敗します。

$ python3 -m pip install https://github.com/aws/aws-cli/archive/v2.tar.gz
  ...
Collecting botocore==2.0.0dev4 (from awscli==2.0.0)
  Could not find a version that satisfies the requirement botocore==2.0.0dev4 (from awscli==2.0.0) (from versions: 0.4.1,
  ...
No matching distribution found for botocore==2.0.0dev4 (from awscli==2.0.0)

解決方法

本体(aws-cli)よりも先に依存ライブラリ(botocore)をインストールして解決します。

botocore のv2 ブランチの最新バージョンが 2.0.0dev4 です。

$ python3 -m pip install https://github.com/boto/botocore/archive/v2.tar.gz
...
$ python3 -c 'import botocore;print(botocore.__version__)'
2.0.0dev4

botocore@v2 をインストールした状態で aws-cli@v2 をインストールすれば、エラーにはなりません。

$ python3 -mpip install https://github.com/aws/aws-cli/archive/v2.tar.gz
...
Successfully installed awscli-2.0.0 cffi-1.14.0 colorama-0.4.3 cryptography-2.8 prompt-toolkit-2.0.10 pycparser-2.19 ruamel.yaml-0.15.100 s3transfer-0.3.3 wcwidth-0.1.8
$ aws --version
aws-cli/2.0.0 Python/3.7.4 Linux/4.14.154-128.181.amzn2.aarch64 botocore/2.0.0dev4

そもそもなんで PyPI にアップロードされていないの?

V1 系は PyPI にアップロードされていますが、V2 系は意識的にPyPI にアップロードされていません。

開発チームがユーザーの質問に GitHub で回答しています。

Not publishing CLI v2 to PyPI has been a conscious decision and for the time being we have no plans to publish to PyPI. In the long term we want the fact that the AWS CLI is written in Python to be more of an implementation detail than a feature.

publish v2 to PyPI · Issue #4947 · aws/aws-cli

AWS CLI の PyPI 経由のインストールが PyPI に想像以上の負荷をかけているとのことなので(1日約100万回のダウンロード)、そのあたりが関係しているのかもしれません。

というわけで AWS CLI V1/V2 によらず、バンドルインストーラーを積極的に活用しましょう!