venvを使ってAWS CLI(v1)とAWS CLI v2を使い分ける(Mac, Linux編)

AWS CLI v2がGAされました!

が、気をつけないといけないことがあります。

AWS CLI version 1 と version2 には、一部互換性がありません。詳細は公式ドキュメントを御覧ください。

互換性が無いと言われてしまうと、v1で作ったコマンドはv1の環境で、v2で作ったコマンドはv2の環境で、使い分けて実行したくなります。

と、いうわけでPythonvenvを利用して、v1v2の環境を使い分ける方法を紹介します。

venvとは

venvは、Python公式の仮想環境作成モジュールです。

AWS CLI(v1)は、pip を使ってインストールしているので、その環境を分けるためにvenvを利用します。

AWS CLI v2については、 pip でインストールするわけではないので、必ずしもvenvを使う必要はありません。 v1のインストールにvenvを利用しているので、両方ともvenvで管理した方がわかりやすいだろうという考えのもと、苦肉の策で利用しています。

前提条件

venvはPython 3.3以降、awscliはPython 2.7またはPython 3.4以降のバージョンが必要です。
そのため、Pythonは3.4以上のバージョンを使用してください。

Pythonのバージョンは次のコマンドで確認できます。

$ python --version
Python 3.7.4

venvでAWS CLI(v1)実行環境を作成する

venvでAWS CLI(v1)の実行環境を作成します。

ちなみに公式ドキュメントにvirtualenvを利用したAWS CLIのインストール方法が載っています。手順はほぼ同じです。

Pythonの仮想環境を作成して、activateします。

$ python -m venv ~/awscli-v1
$ source ~/awscli-v1/bin/activate

そうすると、プロンプトが変わり、仮想環境がアクティブになったことがわかります。

(awscli-v1)~$

その状態で pip を使って awscli をインストールします。

(awscli-v1)~$ pip install --upgrade awscli

AWS CLI(v1)が正しくインストールされたことを確認します。

(awscli-v1)~$ which aws
~/awscli-v1/bin/aws
(awscli-v1)~$ aws --version
aws-cli/1.17.15 Python/3.7.4 Linux/4.14.154-128.181.amzn2.x86_64 botocore/1.14.15

deactivateすれば、元の環境に戻ります。

(awscli-v1)~$ deactivate
$ aws --version
bash: aws: command not found

venvでAWS CLI v2実行環境を作成する

Linuxの場合

まずはPythonの仮想環境を作成します。

$ python -m venv ~/awscli-v2

公式ドキュメントを参考にAWS CLI v2をインストールしますが、このときにインストール先を変えます。

$ curl "https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip" -o "awscliv2.zip"
$ unzip awscliv2.zip
$ ./aws/install \
  --install-dir ~/awscli-v2/aws-cli \
  --bin-dir ~/awscli-v2/bin

AWS CLI v2用の仮想環境をactivateします。

$ source ~/awscli-v2/bin/activate

AWS CLI v2が正しくインストールされたことを確認します。

(awscli-v2)~$ which aws
~/awscli-v2/bin/aws
(awscli-v2)~$ aws --version
aws-cli/2.0.0 Python/3.7.3 Linux/4.14.154-128.181.amzn2.x86_64 botocore/2.0.0dev4

deactivateすれば、元の環境に戻ります。

(awscli-v2)~$ deactivate
$ aws --version
bash: aws: command not found

Macの場合

公式ドキュメントを参考にAWS CLI v2をインストールします。

Macではインストール先が変更できないので、AWS CLI v2をデフォルトで使用し、AWS CLI(v1)を使いたい時だけvenvで切り替える方が良さそうです。

$ curl "https://awscli.amazonaws.com/AWSCLIV2.pkg" -o "AWSCLIV2.pkg"
$ sudo installer -pkg AWSCLIV2.pkg -target /

一応、venvで切り替える方法も記載しておきます。


AWS CLI v2用にPythonの仮想環境を作成します。

$ python -m venv ~/awscli-v2

awsコマンドがシンボリックリンクであり、実体は /usr/local/aws-cli/aws にあることを確認します。

$ ls -al $(which aws)
lrwxr-xr-x  1 root  admin  22  2 12 19:11 /usr/local/bin/aws -> /usr/local/aws-cli/aws
$ ls -al $(which aws_completer)
lrwxr-xr-x  1 root  admin  32  2 12 19:11 /usr/local/bin/aws_completer -> /usr/local/aws-cli/aws_completer

先程作成した仮想環境のbinフォルダにシンボリックを作ります。

$ ln -s /usr/local/aws-cli/aws ~/awscli-v2/bin/aws
$ ln -s /usr/local/aws-cli/aws_completer ~/awscli-v2/bin/aws_completer

(デフォルト環境で不要であれば)元々あったシンボリックリンクは削除します。

$ sudo rm /usr/local/bin/aws
$ sudo rm /usr/local/bin/aws_completer

AWS CLI v2用の仮想環境をactivateします。

$ source ~/awscli-v2/bin/activate

AWS CLI v2が正しくインストールされたことを確認します。

(awscli-v2)~$ which aws
~/awscli-v2/bin/aws
(awscli-v2)~$ aws --version
aws-cli/2.0.0 Python/3.7.4 Darwin/19.3.0 botocore/2.0.0dev4

deactivateすれば、元の環境に戻ります。

(awscli-v2)~$ deactivate
$ aws --version
bash: aws: command not found

venv環境でAWS CLIのタブ補完を有効にする

AWS CLIのタブ補完では、aws_completer を利用します。

aws_completer は、仮想環境へAWS CLIをインストールした際に合わせてインストールされています。

(awscli-v2)~$ which aws_completer
~/awscli-v2/bin/aws_completer

よって、仮想環境内で次のコマンドを実行すればタブ補完機能が利用できます。

(awscli-v2)~$ complete -C $(which aws_completer) aws

仮想環境をactivateするたびにコマンド実行するのも面倒くさいので、次のコマンドを実行してvenvのactivateスクリプト内で補完を有効化しておくと、activateした瞬間から補完が効いて便利です。

$ echo complete -C \"\$VIRTUAL_ENV/bin/aws_completer\" aws >> ~/awscli-v2/bin/activate

終わりに

AWS CLI(v1)とAWS CLI v2をvenvで使い分ける方法を紹介いたしました。

並用できることがわかれば、今まで作ったスクリプトはAWS CLI(v1)で実行しつつ、これから作るスクリプトはAWS CLI v2を試してみるといったこともできると思います。

ぜひAWS CLI v2もお試しください。