[小ネタ] AWS CloudShellでAWS CLI v1を使い捨てる方法

2022.10.04

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

しばたです。

AWS CLIの機能更新は最新のAWS CLI v2よりAWS CLI v1の方が若干早く、AWSの新機能を検証しようとする際に「現時点ではAWS CLI v1しか対応していない。」ということがそれなりにあります。 *1

この様な事態になった際に備えこれまではAWS CLI v1用のDockerfileを用意していたのですが、正直めんどうになったのでAWS CloudShellに使い捨てでAWS CLI v1をインストールする様に方式を見直しました。

本記事ではその手順を公開します。

キーポイント

今回の手順で重要なのは「使い捨て」できることです。
私自身は普段AWS CLI v2を使っており、AWS CLI v1を使うのはまさに新機能の検証のときしかありません。
このため検証が終わった後にCloudShellを再起動したらAWS CLI v1がきれいさっぱり消えくれている必要があります。

そして割と邪道な手順です。
「使い捨て」なのでその時だけ手早くAWS CLI v1が利用できれば良いと割り切っています。

なお、AWS CLI v2とAWS CLI v1の共存ではないのでご了承ください。
共存させるのは別の手順になります。

手順

まずはCloudShellを起動しAWS CLIのバージョンを確認すると以下の様にv2がインストールされています。
インストールディレクトリは/usr/local/bin/awsです。

# CloudShell起動直後の状態
$ which aws
/usr/local/bin/aws

# 本日時点ではVer.2.7.35がインストール済み
$ aws --version
aws-cli/2.7.35 Python/3.9.11 Linux/4.14.291-218.527.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

AWS CLI v1はドキュメントにある通りpipコマンドyumコマンドzipファイルからインストールできますが、yumだと最新バージョンが使えない、zipファイルだとPythonのバージョンが合わないので除外します。
というわけでpipからインストールすることになるのですが、

  • sudoしないとホームディレクトリ配下に関連ファイルが保存される
  • 既存のEB CLIが利用しているbotocoreでバージョンの競合が起きる

という問題があるので、一旦EB CLIをアンインストールしてsudo付きでインストールしてやります。

# 邪魔なEB CLIをアンインストール + 敢えて sudo してインストール
sudo pip3 uninstall -y awsebcli && sudo pip3 install --upgrade awscli

実行結果は以下の様になり「Running pip install with root privileges is generally not a good idea.」と怒られますが、どうせ使い捨てる環境なのでお構いなしです。

# 邪魔なEB CLIをアンインストール + 敢えて sudo してインストール
$ sudo pip3 uninstall -y awsebcli && sudo pip3 install --upgrade awscli
Found existing installation: awsebcli 3.20.3
Uninstalling awsebcli-3.20.3:
  Successfully uninstalled awsebcli-3.20.3
WARNING: Running pip install with root privileges is generally not a good idea. Try `pip3 install --user` instead.
Collecting awscli
  Downloading awscli-1.25.86-py3-none-any.whl (3.9 MB)
     |████████████████████████████████| 3.9 MB 25.0 MB/s 
Requirement already satisfied, skipping upgrade: s3transfer<0.7.0,>=0.6.0 in /usr/local/lib/python3.7/site-packages (from awscli) (0.6.0)
Collecting docutils<0.17,>=0.10
  Downloading docutils-0.16-py2.py3-none-any.whl (548 kB)
     |████████████████████████████████| 548 kB 66.0 MB/s 
Collecting rsa<4.8,>=3.1.2
  Downloading rsa-4.7.2-py3-none-any.whl (34 kB)
Requirement already satisfied, skipping upgrade: colorama<0.4.5,>=0.2.5 in /usr/local/lib/python3.7/site-packages (from awscli) (0.4.3)
Requirement already satisfied, skipping upgrade: PyYAML<5.5,>=3.10 in /usr/local/lib64/python3.7/site-packages (from awscli) (5.4.1)
Collecting botocore==1.27.85
  Downloading botocore-1.27.85-py3-none-any.whl (9.2 MB)
     |████████████████████████████████| 9.2 MB 61.7 MB/s 
Collecting pyasn1>=0.1.3
  Downloading pyasn1-0.4.8-py2.py3-none-any.whl (77 kB)
     |████████████████████████████████| 77 kB 11.6 MB/s 
Requirement already satisfied, skipping upgrade: python-dateutil<3.0.0,>=2.1 in /usr/local/lib/python3.7/site-packages (from botocore==1.27.85->awscli) (2.8.2)
Requirement already satisfied, skipping upgrade: jmespath<2.0.0,>=0.7.1 in /usr/local/lib/python3.7/site-packages (from botocore==1.27.85->awscli) (0.10.0)
Requirement already satisfied, skipping upgrade: urllib3<1.27,>=1.25.4 in /usr/local/lib/python3.7/site-packages (from botocore==1.27.85->awscli) (1.26.11)
Requirement already satisfied, skipping upgrade: six>=1.5 in /usr/local/lib/python3.7/site-packages (from python-dateutil<3.0.0,>=2.1->botocore==1.27.85->awscli) (1.14.0)
Installing collected packages: docutils, pyasn1, rsa, botocore, awscli
  WARNING: The scripts pyrsa-decrypt, pyrsa-encrypt, pyrsa-keygen, pyrsa-priv2pub, pyrsa-sign and pyrsa-verify are installed in '/usr/local/bin' which is not on PATH.
  Consider adding this directory to PATH or, if you prefer to suppress this warning, use --no-warn-script-location.
  Attempting uninstall: botocore
    Found existing installation: botocore 1.23.54
    Uninstalling botocore-1.23.54:
      Successfully uninstalled botocore-1.23.54
Successfully installed awscli-1.25.86 botocore-1.27.85 docutils-0.16 pyasn1-0.4.8 rsa-4.7.2

これでAWS CLI v1が上書きインストールされます。

# awsコマンドは上書きされる
$ which aws
/usr/local/bin/aws

# 本日時点で最新の Ver.1.25.86 がインストールされた
$ aws --version 
aws-cli/1.25.86 Python/3.7.10 Linux/4.14.291-218.527.amzn2.x86_64 exec-env/CloudShell botocore/1.27.85

AWS CLI v1の利用が終わったら「CloudShellを再起動」して環境を捨ててしまえば元通りです。

余談 : 他のAWS関連ツールについて

ちなみにCloudShellのPython環境にはEB CLIの他にもいくつかAWS関連のツールがインストールずみですが、それらはboto3に依存しておりbotocoreに直接依存するのはEB CLIとAWS CLI v1だけの模様です。

$ pip3 show botocore | grep Required-by
Required-by: s3transfer, git-remote-codecommit, boto3, awsebcli

$ pip3 show boto3 | grep -e Requires -e Required-by
Requires: botocore, jmespath, s3transfer
Required-by: serverlessrepo, aws-sam-translator, aws-sam-cli

おまけ : AWS CLI v2 と AWS CLI v1 を共存させる場合

AWS CLI v2 と AWS CLI v1を共存させたい場合はvenvで仮想環境を作ってそこにAWS CLI v1をインストールするのが一番正当であり楽でもあります。
ホームディレクトリ配下に仮想環境を作れば永続化も可能です。

# venvで仮想環境を作る
python3 -m venv ~/aws-cli-v1

# 仮想環境内でAWS CLI v1をインストール
source ~/aws-cli-v1/bin/activate
pip3 install --upgrade awscli

# 作業が終わったらディアクティベート
deactivate

実行例としてはこんな感じになります。

# 通常はAWS CLI v2
$ which aws
/usr/local/bin/aws
$ aws --version 
aws-cli/2.7.35 Python/3.9.11 Linux/4.14.291-218.527.amzn2.x86_64 exec-env/CloudShell exe/x86_64.amzn.2 prompt/off

# 仮想環境をアクティベートすればAWS CLI v1に
$ source ~/aws-cli-v1/bin/activate
(aws-cli-v1) $ which aws
~/aws-cli-v1/bin/aws
(aws-cli-v1) $ aws --version 
aws-cli/1.25.86 Python/3.7.10 Linux/4.14.291-218.527.amzn2.x86_64 exec-env/CloudShell botocore/1.27.85

# 最後はディアクティベート
(aws-cli-v1) $ deactivate

最後に

簡単ですが以上となります。

環境の使い捨てを前提にしており邪道な手順ではありますが大きな問題にはならないでしょう。
ちゃんとやりたい場合はおまけにある様に仮想環境を作って使い分けてください。

脚注

  1. なお、少しまてばAWS CLI v2も対応してくれます。