CentOS 5.11 で AWS CLI を使ってみた

Amazon Web Services, AWS CLI, CentOS, Python

こんにちは。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実行用のユーザーを作成することにしました。

  1. IAMユーザー作成
  2. 権限付与:今回はS3のバケット一覧を見てみようと思うので “s3:ListAllMyBuckets” をアタッチします
  3. アクセスキー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の時刻設定に注意
  • 株式会社アークシステムの来訪管理・会議室予約システム BRoomHubs
  • 低コスト・短納期で提供するまるごとおまかせZabbix