venvを使ってAWS CLI(v1)とAWS CLI v2を使い分ける(Mac, Linux編)
AWS CLI v2がGAされました!
が、気をつけないといけないことがあります。
AWS CLI version 1 と version2 には、一部互換性がありません。詳細は公式ドキュメントを御覧ください。
互換性が無いと言われてしまうと、v1で作ったコマンドはv1の環境で、v2で作ったコマンドはv2の環境で、使い分けて実行したくなります。
と、いうわけでPythonのvenvを利用して、v1とv2の環境を使い分ける方法を紹介します。
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もお試しください。