AWSCLIv2を運用するにあたり注意点、パッケージマネージャがない=バージョンアップ毎にストレージを消費する

AWSCLI

AWSCLIv2を運用するにあたり注意点、パッケージマネージャがない=バージョンアップ毎にストレージを消費する

詳細は後述しますが、AWSCLIv2を導入すると運用にpipが使えなくなったり、v1のプラグインが使えなくなったりS3互換ストレージに影響があるなど困った事が多発したので、備忘録として情報を残します。


なぜAWSCLIv2への更新が必要になったのか

AWSCLIv2がリリースされたばかりの頃は、不具合が多数報告されていて導入を見合わせていた。2022年末辺りからAWSCLIv1でIAM認証周りでのエラーが発生するようになってきたので、2023年2月頃にUnixシステム全般のAWSCLIをAWSCLIv2へ更新した。


AWSCLIv2はインストールと更新でpipが使えない

AWSCLIv1はPythonのpipコマンドで気軽に導入できていたのだが、
AWS側のコメントでは
「Pythonのコミュニティ側からアクセス負荷が大きすぎるのでpipに置くなと言われた」
とのことで、Pythonと別にインストールする必要がある。


AWSCLIv2のインストール手順

AWSCLIv2のインストール手順自体は簡単で、配布されているZipを解凍して指定のコマンドを実行すればよい。

ERROR: The request could not be satisfied

root権限のインストール

root権限のインストールは展開したZipのAWSディレクトリの installをsudoで実行する
sudo ./aws/install 
上のコマンドは下記と同等のデフォルトオプションが適用される。
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli 
アップデートも "--update"のオプションをつけていれば適用される。
sudo ./aws/install --update
sudo ./aws/install --bin-dir /usr/local/bin --install-dir /usr/local/aws-cli --update
--bin-dir

/usr/local/bin
のディレクトリへ実行ファイルのエイリアスが配置される

--install-dir

実体ファイルは以下のようなディレクトリへ展開される。
/usr/local/aws-cli/v2/2.xx.xx/~
※ 2.xx.xxはバージョン番号

user権限のインストール

user権限でインストールしたい場合、良くある環境として例えば、
"$HOME/.local/bin"
にPATHが設定されている場合は下記のように指定すればよい。

./aws/install -b $HOME/.local/bin -i $HOME/.local/aws-cli --update
--bin-dir

$HOME/.local/bin
のディレクトリへ実行ファイルのエイリアスが配置される

--install-dir

実体ファイルは以下のようなディレクトリへ展開される。
$HOME/.local/aws-cli/v2/2.xx.xx/~
※ 2.xx.xxはバージョン番号

ユーザー権限で配置する場合は当然ながらsudoを付与してはいけない。


S3コマンドでの影響

AWSCLIv1までのプラグインが使えなくなっているものがあるようで、
awscli_plugin_endpoint
が使えなくなっていて困った。

対策として、CLIのコマンドオプションで"--endpoint-url"を指定できるのでプラグインで指定していたエイリアスをコマンドに毎回付与すればいい。

※AWSCLIv1のヘルプコマンドには掲載されていないが、v1でも最近のバージョンであれば機能する

頻繁にアップデートが発生する(ストレージを圧迫)

ここまでは些細な問題なのだが、
AWSCLIv2はPythonのコンポーネントも含まれるので最新版2.11.12で209MBの容量がある。(インストーラも209MBある)
そして実績値として2月から4月まで2ヵ月で20バージョンのアップデートが発生していた。
更にrootとユーザー権限用のパッケージを分けて管理していると、インストール対象のストレージが消費される。

2ヵ月で20バージョンのアップデートが発生した場合、root権限だけでAWSCLIv2をインストールしていた場合でもストレージを4GBを消費する。pyenvやvenvと併用してユーザー権限でAWSCLIv2をインストールしていると更に4GBずつストレージを消費する。
AWSのインスタンスやVPSで運用していると、ストレージの消費はコストの増加に繋がるため極力無駄を抑えたい。かといって、都度手作業で古いファイルを削除するのも手間が掛かる。


具体的な対策

AWSCLIv2をインストールしたディレクトリを指定することで、そのディレクトリ配下の古いバージョンを削除して最新版だけを残すシェルスクリプトを作成した。

root権限の場合

AWSCLIv2のインストーラを使ってインストール or アップデートをすると指定のディレクトリ、

/usr/local/aws-cli/v2

配下に各バージョンが格納されるので、ディレクトリを引数にバージョンをソートして削除するようにした。

簡単なシェルスクリプトをgithubに公開しているので、需要があれば自己責任でご利用ください。

GitHub - kichijoji-cloud/autoremove-oldawscli2
Contribute to kichijoji-cloud/autoremove-oldawscli2 development by creating an account on GitHub.

使い方は日本語READMEを参照

autoremove-oldawscli2/README-J.md at main · kichijoji-cloud/autoremove-oldawscli2
Contribute to kichijoji-cloud/autoremove-oldawscli2 development by creating an account on GitHub.

追記

「CLIツールなのだからPythonで作成すれば簡単ではないか?」という意見が出てくると思うのですが。
Pythonだと「バージョン依存」だとか「Python自体のバグ」だとか「pipしないと動かない場合がある」とか、
安定運用を阻害する要因になるのであえてbashスクリプトで作成しています。

以上、雑多な備忘録ですが役に立てば幸いです。