AWSでAmazon Linux2ではなく、RedhatEnterpriseLinux(RHEL)のEC2インスタンス構築する際にAWS CLIをインストールして利用しようしたらなかなか設定できず、ハマったので備忘録がてら記事にします。きっと体系的に学んでいる方はすんなりと解決できるのでしょうが、私はトライ&エラーで学ぶ人なもので結構時間がかかりました(´・ω・`)
やりたかったこと(今回のゴール)
EC2(RHELv8)でAWS CLIを使いたかった。(AWS CLI でS3からファイルのDLをしたかった)
とりあえず[aws --version]してバージョン情報などが表示されて、インストールおよび動作していることが確認できれば今回はOKとします。
ハマったこと
EC2(Amazon Linux2)は最初からAWS CLIがインストールされていて、使える状態だったが、RHELv8だと初期設定のままだと使えない。勝手が違うらしい...
EC2を起動するときに選択したAMIは以下画像のやつです。
EC2にログインして[aws --version]をしても[command not found]となる。当然 [aws s3 cp "source" "target"]のようなコマンドを打ってもNGでした。
[root@ip-10-0-0-204 ec2-user]# aws --version
bash: python: command not found
原因
AWS CLI の実体ファイルへのパスが通ってなかった。
#####そもそもパスって何?
Linuxでは、コマンドを実行する際には、本来「/usr/bin/passwd」のように、フルパス、すなわちコマンドがあるディレクトリまですべて含めてコマンドを指定してやる必要があります。しかし、よく使うコマンドでいちいちフルパスを指定するのはあまりに面倒ですね。
そこで、Linuxのシェルは、ユーザがコマンドをフルパスで指定しなくても、そのコマンドを、ある特定のディレクトリに対して探しにいくようになっています。このとき、シェルが探しに行くディレクトリを設定する作業を、「パスを通す」と言います。正確には「コマンドサーチパス」、すなわちコマンドを探しにいくパスの設定をする、ということですね。
出典:パスを通す
(https://linuc.org/study/knowledge/349/)
つまり「パスを通す」とは、あるコマンド実行をしようとした際に、実行する実体ファイルをどこから探してくるのか、その捜索範囲を指定してあげると言った感じの設定です。
手順
①pythonをインストールする
yum -y install python38
②pip単体で呼べるようにする
sudo update-alternatives --install /usr/bin/pip pip /usr/bin/pip3 1
/usr/bin/pip でシンボリックリンクの作成先を指定し、/usr/bin/pip3 はファイルの実体(格納場所)を指定
pip --version
上記コマンドで「pip 19.3.1 from /usr/lib/python3.8/site-packages/pip (python 3.8)」と表示が出ればOK
③aws cli をインストールする
pip install awscli --upgrade --user
インストールの最後に以下のような注意書きっぽいものが出ます。
WARNING: The scripts pyrsa-decrypt, pyrsa-encrypt, pyrsa-keygen, pyrsa-priv2pub, pyrsa-sign and pyrsa-verify are installed in '/root/.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.
要約すると「”/root/.local/bin”にインストールしたけど、パスが通ってない」と親切に教えてくれています。
なのでこの時点で「aws --version」をしても、まだ「bash: python: command not found」になります。
ただ以下のように実体ファイルをインストールしたディレクトリまで移動して、実行すれば、コマンド結果がかえってきます。
[root@ip-10-0-0-204 ec2-user]# cd /root/.local/bin
[root@ip-10-0-0-204 bin]# ./aws --version
aws-cli/1.20.48 Python/3.8.6 Linux/4.18.0-305.el8.x86_64 botocore/1.21.48
④PATH(実体ファイルの捜索範囲を指定する環境変数)を設定する
現状のPATHを確認する
printenv PATH
/sbib:/bin:/usr/sbin:/usr/bin
現状は「/sbib」と「/bin」と「/usr/sbin」と「/usr/bin」が設定されています
ここにexportコマンドで「/root/.local/bin」を追記します
export PATH="$PATH:/sbin:/bin:/usr/sbin:/usr/bin:/root/.local/bin"
これで「aws --version」を実行すればコマンド結果がかえってくる(AWSCLIが動く)はず
[root@ip-10-0-0-204 ~]# aws --version
aws-cli/1.20.48 Python/3.8.6 Linux/4.18.0-305.el8.x86_64 botocore/1.21.48
これにて完了!
ただこのままだとログアウト、再起動すると設定が消えてしまうので「~/.bash_profile」のPATHにも追記しましょう。
おまけ(pythonのPATH設定)
AWSCLIのPATHを設定しましたが、実はpythonも同じようにPATHがないためか、実行できないです。
以下のように設定すればpythonも実行できるようになります。
[root@ip-10-0-0-204 ~]# sudo alternatives --config python
There are 3 programs which provide 'python'.
Selection Command
-----------------------------------------------
*+ 1 /usr/libexec/no-python
2 /usr/bin/python3
3 /usr/bin/python3.8
#/usr/binはPATHが既に通っているので、export コマンドは不要
Enter to keep the current selection[+], or type selection number: 3 ←「3」を選択
[root@ip-10-0-0-204 ~]#
[root@ip-10-0-0-204 ~]# python --version
Python 3.8.6
参考にしたサイト
https://linuc.org/study/knowledge/349/
https://qiita.com/Naggi-Goishi/items/2c49ea50602ea80bf015
https://xn--o9j8h1c9hb5756dt0ua226amc1a.com/?p=4038