CentOS 5.11 で AWS CLI を使ってみた
こんにちは。AWSを触り始めて約半年、入社2年目。プラットフォーム技術部の大畑です。
先日、CentOS 5.11環境でAWS CLIを使う機会があったのですが、主な導入方法として公式で紹介されているpipではインストールすることが出来ず、導入前から若干ハマるという事件が起こりました。
CentOSと言えば、2018年5月現在の最新バージョンは7系ですが、場合によっては古いOSを使い続けなければならないこともあるかと思います。
そこで本記事では、CentOS 5.11におけるAWS CLIの導入方法についてまとめてみたいと思います。
※ CentOS 5系のサポート期限は2017年3月31日で切れています。
今から導入する人はくれぐれも化石バージョンを選ばないようにしましょう。
環境・制約条件
- CentOS 5.11
- なるべく現行システムに変更を加えない
- 最低限のツールのみをインストールする
導入方法
Python 2.6の導入
AWS CLIをインストールするために必要な要件は以下となります。
- Python 2 バージョン 2.6.5+ または Python 3 バージョン 3.3+
- Windows、Linux, macOS or Unix
rpm -Uvh http://vault.centos.org/5.11/extras/x86_64/RPMS/epel-release-5-4.noarch.rpm
yum install python26 python26-devel
下記のように、pythonコマンドでは標準の2.4を、python26コマンドでは新しく導入した2.6を指していることが確認できればOKです。
python -V
Python 2.4.3
python26 -V
Python 2.6.8
get-pip.pyのインストール
公式ページにある通り、LinuxでのAWS CLIの主な導入方法はpipによるインストールとなっています。pipは、インストールスクリプトget-pip.pyを実行することでインストールできます。
ということで、まずはget-pip.pyをダウンロードしようと思います。
curl "https://bootstrap.pypa.io/get-pip.py" -o "get-pip.py"
curl: (35) error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version
あれ・・・いきなりエラー・・・
Google先生に聞いてみたところ、以下内容がヒットしました。
CentOS5/RHEL5に含まれるOpenSSLは0.9.8eのため、curlなどOpenSSLをベースにアウトバウンドのhttps通信を行う場合、SHA-2やTLS1.2には未対応です(SHA-2はOpenSSL 0.9.8o以降、TLS1.2はOpenSSL 1.0.1以降が必要)。
http://fusic-kiban.hatenablog.com/entry/2016/10/03/085827
openssl version
OpenSSL 0.9.8e-fips-rhel5 01 Jul 2008
残念。オンラインでget-pip.pyをゲットすることは難しそうです。
今回は現行システムに手を加えないという制約条件がありますし、そもそも標準パッケージに手を加えるのは怖いので、OpenSSLのバージョンアップ等はせずに他の手を考えます。
get-pip.pyをローカルからCentOSにSCP転送
ならば、ターミナルのSCP転送機能を使い、ローカルからCentOSへファイルを転送すれば良いのではと(安易な考えを)思いつく。
URLからローカルにダウンロードしたget-pip.pyファイルを、TeraTermのSSH SCPを使用して適当なディレクトリ配下(今回は/tmp 配下)に転送後、以下。
まずは、先ほどインストールしたpython26でget-pip.pyを実行します。
python26 /tmp/get-pip.py
(中略)
Installing collected packages: pip, setuptools, wheel
Successfully installed pip-9.0.3 setuptools-36.8.0 wheel-0.30.0
続いて、pipでawscliをインストール!
pip install awscli
(中略)
Traceback (most recent call last):
File "<string>", line 1, in <module>
File "/tmp/pip-build-L6R8_v/PyYAML/setup.py", line 83, in <module>
from wheel.bdist_wheel import bdist_wheel
File "/usr/lib/python2.6/site-packages/wheel/bdist_wheel.py", line 407
ignore=lambda x, y: {'PKG-INFO', 'requires.txt', 'SOURCES.txt',
^
SyntaxError: invalid syntax
----------------------------------------
Command "python setup.py egg_info" failed with error code 1 in /tmp/pip-build-L6R8_v/PyYAML/
できないっ!
どうやらpipの実行がうまくいかなかったようです。
調べてみると、wheelのバージョンが0.30.0だと、pipによるawscliインストールが上手くいかないことがあるとのこと。wheelをダウングレードすれば解決する問題のようですが、 “現行システムに変更を加えない” という制約条件があるのでこれも却下。
※ 現在ではこの問題に対応したget-pip.pyもあるそうです。
if implicit_wheel:
args += [“wheel<0.30”]
153~154行目のこの記述でwheel 0.30未満を指定しているので、わざわざwheelをダウングレードしなくても良いそうです。
バンドルされたインストーラを使用してみる
AWSのドキュメントを漁ってみたところ、オフラインでAWS CLIをインストールできるツールがありました(公式ドキュメントはこちら)。
pipをインストールする必要もないので、こちらの方がより制約条件にマッチする方法と言えそうです。
curl "https://s3.amazonaws.com/aws-cli/awscli-bundle.zip" -o "awscli-bundle.zip"
--2018-05-21 12:18:04-- https://s3.amazonaws.com/aws-cli/awscli-bundle.zip
localhost をDNSに問いあわせています... 127.0.0.1
localhost|127.0.0.1|:3128 に接続しています... 接続しました。
Proxy による接続要求を送信しました、応答を待っています... 200 OK
長さ: 9875928 (9.4M) [application/zip]
`awscli-bundle.zip' に保存中
100%[======================================>] 9,875,928 2.76M/s 時間 3.4s
2018-05-21 12:18:08 (2.76 MB/s) - `awscli-bundle.zip' へ保存完了 [9875928/9875928]
無事、 awscli-bundle.zip をダウンロードできました!
公式ドキュメントにあるように、必要なパッケージは全てインストーラに含まれているので、インストーラの実行自体はオフラインで行うことができます。
※「スペースを含むパスへのインストールはサポートされていない」ことに注意が必要です。
続いて、先ほどダウンロードしたzipファイルを解凍し、installスクリプトが格納されているディレクトリまで移動。
unzip awscli-bundle.zip
cd ./awscli-bundle
それでは、いよいよaws cliをインストールします。
今回は導入したpython26でinstallスクリプトを実行したいため、python26の実行可能ファイルへの絶対パスを指定します。
/usr/bin/python26 ./install -i /usr/local/aws -b /usr/local/bin/aws
aws --version
aws-cli/1.15.24 Python/2.6.8 Linux/2.6.18-398.el5 botocore/1.10.24
上記のようにawsコマンドのバージョンが表示されれば、AWS CLIのインストールは完了です。
※ 2018/5/21時点での最新バージョンは1.15.24でした。
AWS CLIの使い方
初期設定
AWS CLIを使用するには、AWSのアカウント情報を紐付ける必要があります。今回は、CLI実行用のユーザーを作成することにしました。
- IAMユーザー作成
- 権限付与:今回はS3のバケット一覧を見てみようと思うので “s3:ListAllMyBuckets” をアタッチします
- アクセスキーIDとシークレットアクセスキーの確認
aws configure
AWS Access Key ID [None]:xxxxxxxxxxxxxxxxxxxx
AWS Secret Access Key [None]:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
Default region name [None]:ap-northeast-1
Default output format [None]: text
Tokyoリージョンを使用している場合は、リージョン名に ap-northeast-1 を選択すればOKです。
リージョンコードの一覧はこちらに載っています。
また、アウトプットフォーマット(awsコマンドの実行結果がどんな形式で返ってくるか)は、 json・table・text の3つの形式から選択することが出来ます。この辺はお好みで。
設定できたら、確認。
aws s3 ls
yyyy-mm-dd hh:MM:ss hogehoge
yyyy-mm-dd hh:MM:ss hugahuga
無事にS3内のバケット一覧を取得することができました!!
おまけ
AWS CLIはアンインストールも簡単
バンドルされたインストーラでは、インストールディレクトリの外に何も配置しません(オプションのシンボリックリンク以外)。
そのため、アンインストールもコマンド2発で非常に簡単にできるのです!
sudo rm -rf /usr/local/aws
sudo rm /usr/local/bin/aws
シンボリックリンクの削除確認が出てきたら、 y と入力してください。
これでOKです。
OSの時刻設定が狂っているとawsコマンドは使えない
fatal error: An error occurred (RequestTimeTooSkewed) when calling the ListObjects operation: The difference between the request time and the current time is too large.
こんな感じのエラーが返ってきてしまいます。
dateコマンドを乱発して軽く調べてみましたが、許容できる誤差は約10~15分程度のようです。15分以上時間をずらすと、s3バケットの中身を一覧表示することができませんでした。
まとめ
- 古いバージョンのOSにAWS CLIを導入する場合、バンドルされたインストーラを使うと楽ちん
- アンインストールも楽ちん
- OSの時刻設定に注意