今となっては昔である 2018 年に AWS からリリースされた Amazon Linux 2 は、サポート期間の延長を経て、2026 年 6 月にサポート終了 (End of Life, EOL) を迎えます。
Amazon Linux 2 には AWS CLI v1 がプリインストールされていますが、これを AWS CLI v2 にアップデートする場合の手順と注意点についてまとめました。
Amazon Linux 2 の AWS CLI
より新しい Amazon Linux 2023 がすでにリリースされていますが、個人的にはまだ Amazon Linux 2 で稼働し続けている環境もよく使っています。末期にはかなり古さの目立ってきていた Amazon Linux 1 に比べると、Amazon Linux 2 はさまざまな用途でまだ問題なく運用できるのですが、初期状態でプリインストールされている AWS CLI は依然として v1 のままになっています。
$ aws --version
aws-cli/1.18.147 Python/2.7.18 Linux/5.10.213-201.855.amzn2.aarch64 botocore/1.18.6
Amazon Linux 2 で AWS CLI v2 を使いたい場合は、自分でインストールする必要があります。インプレースでアップデート(バージョンアップ)を行うことはできないので、一度 AWS CLI v1 をアンインストールした後で、あらためて AWS CLI v2 をインストールするという手順が必要です。
AWS CLI v1 のアンインストール
最初に、プリインストールされている AWS CLI v1 をアンインストールします。これは yum remove で行えます。
$ sudo yum remove awscli
AWS CLI v2 のインストール
次に AWS CLI v2 をインストールします。AWS のドキュメントにも書かれていますが、AWS CLI v2 はパッケージ マネージャーを通じてインストールすることができません。
- インストーラーをダウンロードする
- ダウンロードしたインストーラーを展開する
- インストールを実行する
最初にインストーラーをダウンロードします。アーキテクチャ(x86_64 または aarch64)によってダウンロードするファイルが異なるため、注意が必要です。
以下は x86_64 アーキテクチャの場合です。
$ wget https://awscli.amazonaws.com/awscli-exe-linux-x86_64.zip
以下は aarch64(または arm64)アーキテクチャの場合です。
$ wget https://awscli.amazonaws.com/awscli-exe-linux-aarch64.zip
続いて、ダウンロードしたファイルを unzip します。インストール後は unzip したファイルは使用しないので、一時的なパスにダウンロード・展開して、インストール後には削除しても問題ありません。
x86_64 の場合:
$ unzip awscli-exe-linux-x86_64.zip
aarch64 (arm64) の場合:
$ unzip awscli-exe-linux-aarch64.zip
展開後に、インストールを実行します。
$ sudo aws/install
You can now run: /usr/local/bin/aws --version
ほとんど待ち時間もなく、インストールはすぐに完了します。インストール後に表示されるコマンドでバージョン番号を確認すると、AWS CLI v2 がインストールされたことを確認できます。
$ /usr/local/bin/aws --version
aws-cli/2.15.36 Python/3.11.8 Linux/5.10.213-201.855.amzn2.aarch64 exe/aarch64.amzn.2 prompt/off
インストール後にコマンドが見つからない場合
インストール直後に aws コマンドを実行すると、コマンドが見つからないというエラーが表示されることがあります。
$ aws --version
-bash: /usr/bin/aws: No such file or directory
このエラーが発生するのは、bash がコマンドのパスをキャッシュしているためです。
古い AWS CLI v1 は /usr/bin にインストールされているのですが、インストール後のメッセージにも表示されていたように、AWS CLI v2 はインストール先を指定しなかった場合はデフォルトで /usr/local/bin にインストールされるようになっています。(インストール時に --bin-dir または -b オプションを指定すれば、インストール先を指定できます。この場合、インストール先を v1 と同じ /usr/bin に変えることも可能です)
アンインストール前に現在のログイン セッションで AWS CLI v1 を 1 回でも実行していた場合は、bash が aws コマンドの場所を /usr/bin/aws だと記憶しているので、上記のエラーが発生します。
キャッシュの状況は hash コマンドで確認できます。
$ hash
hits command
1 /usr/bin/wget
1 /usr/bin/sudo
1 /usr/bin/unzip
2 /usr/bin/aws
AWS CLI v2 のインストールで使用したため、aws コマンド以外に wget, sudo, unzip の場所もキャッシュされていますが、aws の場所が /usr/bin/aws としてキャッシュされていることが分かります。
キャッシュをクリアしてから再実行すると、今度は aws コマンドが見つかります。
$ hash -r
$ aws --version
aws-cli/2.15.36 Python/3.11.8 Linux/5.10.213-201.855.amzn2.aarch64 exe/aarch64.amzn.2 prompt/off
もちろんもっと単純に、現在のログイン セッションから一度 exit してログインし直すだけでも、エラーは出なくなります。
cron で aws コマンドを実行している場合
AWS CLI v1 を使用して cron から aws コマンドの実行をスケジュールしている場合は、AWS CLI v2 への入れ替え後に注意が必要です。手動でインストールした場合、AWS CLI v2 はデフォルトで /usr/local/bin にインストールされますが、この場所は通常、cron 実行時のコマンド検索パスに含まれないためです。
# Error - /usr/local/bin/aws は見つからない
#
5 18 * * * aws ec2 stop-instances --region ap-northeast-1 --instance-ids i-01a23b45c67d89e01
AWS CLI v2 の aws コマンドを cron から実行できるようにするには、crontab 上でコマンドをフルパスで指定するか、または環境変数 PATH を調整します。
コマンドをフルパスで指定する場合は、次のようになります。
# Ok - aws コマンドをフルパスで指定
#
5 18 * * * /use/local/bin/aws ec2 stop-instances --region ap-northeast-1 --instance-ids i-01a23b45c67d89e01
環境変数 PATH を調整する場合は、次のようになります。
# Ok - PATH を調整
#
PATH=/usr/local/sbin:/usr/sbin:/sbin:/usr/local/bin:/usr/bin:/bin
5 18 * * * aws ec2 stop-instances --region ap-northeast-1 --instance-ids i-01a23b45c67d89e01
まとめ
Amazon Linux 2 で AWS CLI v2 を利用するには、デフォルトでインストールされている AWS CLI v1 をアンインストールした後で、AWS CLI v2 のインストーラーをダウンロードし、インストールします。
デフォルトのインストール先が /usr/local/bin になることには注意が必要です。cron などへの影響を考えると、インストール時に --bin-dir を指定して、インストール先を /usr/bin にした方が悩むことは少ないかもしれません。
あるいは Amazon Linux 2023 など、AWS CLI v2 がプリインストールされている環境に移行することです。この場合は、aws コマンドは最初から /usr/bin に入っています。