職業プログラマの休日出勤

職業プログラマによる日曜自宅プログラミングや思考実験の成果たち。リアル休日出勤が発生すると更新が滞りがちになる。記事の内容は個人の意見であり、所属している(いた)組織の意見ではない。

さくらのレンタルサーバに aws cli インストール

永らくさくらのVPSのお世話になってきましたが、いくつかの用途が不要になったので「もうVPSである必要が無いよなー」という考えに至りました。これまでVPSで動かしていたものは、

  • メールサーバと、静的なWebサイトと、PHP製のWebアプリはさくらのレンタルサーバ(スタンダードプランまたはそれ以上)に、
  • その他の常駐系やタイマー起動系プログラムは構造を変えて AWS Lambda 等によるサーバレスな感じに、
  • その他の常駐でないものは都度 Amazon EC2 を起動するような構成に、

それぞれ引っ越すこととしました。流石にメールサーバは随分昔から移行していましたが、ついに他のものにも手を付けることにしました。さくらのレンタルサーバが2017年に Let's Encrypt によるHTTPSに対応してくれたことからWebサイトやWebアプリを移管するまでの障壁がぐんと下がりました。静的なWebサイトはAWSのS3での静的ウェブサイトのホスティング+CloudFrontでの配信にしても良いのですけれども、どうせレンタルサーバの契約があるのですから、「ドメインHTTPSの設定をした上でディレクトリに置くだけ」は強いです。アクセス数が異常に多くなったらS3に移せば良いでしょう。さくらインターネットさんにはオブジェクトストレージというサービスもありますが、本記事執筆時点では残念ながら新規申し込みの受付が停止されています。将来はこちらにも期待ですねー。

さて、PHP製のWebアプリをレンサバに移すにあたって困ったのは、バックアップ系のファイルをS3に置きに行く部分です。bashスクリプトから aws cli のコマンドを叩いていたのですが、この aws cli をレンサバに入れる作業は一筋縄では行かず、pythonに噛まれる(比喩表現)事態に至ったので、この記事にメモとして残しておきます。

通常の aws cli のインストール

通常は pip のお世話になります。
docs.aws.amazon.com
さくらさんのレンサバの環境ではデフォルトではpipは入っていませんので、pipのインストールから始まることになります。
しかし…

$ easy_install pip
Searching for pip
Reading https://pypi.python.org/simple/pip/
Download error on https://pypi.python.org/simple/pip/: [Errno 1] _ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version -- Some packages may not be found!
Couldn't find index page for 'pip' (maybe misspelled?)
Scanning index of all packages (this may take a while)
Reading https://pypi.python.org/simple/
Download error on https://pypi.python.org/simple/: [Errno 1] _ssl.c:507: error:1407742E:SSL routines:SSL23_GET_SERVER_HELLO:tlsv1 alert protocol version -- Some packages may not be found!
No local packages or download links found for pip
error: Could not find suitable distribution for Requirement.parse('pip')

どうやらSSL(TLS)まわりの処理が上手くいかないようです。get-pip.py を使った方法 も残念ながら同じエラーになります。さてどうしたもんか?

Pythonのソースからのインストール

ググってみると、こんな記事がありました。
qiita.com
この記事に勇気付けられた筆者は、永らくタイプしてこなかった ./configuremake といったコマンド達を打つことを決意しました。
ソースからのビルドはこのQiitaの記事に従えば良いのですが、以下は補足です。

OpenSSLのビルド

バージョンは https://www.openssl.org/source/ を参照して決めると良いでしょう。上記のQiitaの記事では1.0.2qを使っていますが、1.0.2系は2019年末にサポート終了することが予告されているので、1.1.1系を使う方が良さそうです。本記事の執筆時点での1.1.1系の最新は1.1.1bでした。

…ところが!

筆者の環境では 1.1.1b のビルドは失敗しました。

Error: previous CFI entry not closed (missing .cfi_endproc)

このエラーと同じです。
github.com
きっと次のバージョンでは治って出てくるのでしょうけども待てないですね。一つ前の1.1.1aはビルドできますが、これ使うよりは1.0.2系の最新を使った方が安全な気もするので、1.0.2rを使いました。

Pythonのビルド

バージョンは https://www.python.org/ftp/python を参照して決めると良いでしょう。上記のQiitaの記事では 2.7.15 ですが、私がこれまでPythonを好んで使わなかった最大の理由である「2系 vs 3系」みたいな話も、ついに「2.x系は2020年の頭以降はメンテされない」宣言が出されて決着がつき、世の中は3系に移行されていることと思います。ここでも3系を使いましょう。本記事の執筆時点での3.x系の最新stableは3.7.3でした。

…ところが!

Pythonのモジュールの一つ _ctypes のビルドに失敗しました。依存関係の話っぽいので、ちょっと面倒臭く感じて筆者は逃げ出しました。3.6系に逃げる手もあるようですが、2.7.16に逃げました。
2.7.16でも、gmake installの段階で次のようなエラーがありました。

error: can't combine user with with prefix/exec_prefix/home or install_(plat)base

このStackOverflowの質問へのコメントのように、~/.pydistutils.cfguser=1コメントアウト(行頭シャープ)して再度installしたら動きました。
stackoverflow.com

インストール後、PATHを通すのを忘れずに。
また、例えばbashであればコマンドの検索パスはキャッシュされることもあるので、今回のopensslやpythonのように元々パス通ってる場所にバイナリが置いてあった場合はキャッシュにも注意です。
unix.stackexchange.com

pipのインストール

この手順ではeasy_installは入らないので、get-pip.py を使った方法 を使いました。

それ以降

pipさえ入ってしまえば、あとはAWSのドキュメントの通り AWS CLI をセットアップして使えば良いでしょう。

さいごに

ネット上の記事では さくらのレンタルサーバーにPythonのpipとAWS Command Line Interface(aws-cli)をインストールする | 大石制作ブログ のように「すんなり入った」報告もあるのですが、もしかしてサーバの個体差とかあるんでしょうかね。検索で本記事に辿り着いたみなさんは、まずは「普通の」方法を試してみて、ダメだった時だけソースからのインストールに手を染めたら良いと思います。
あと、「公式で AWS CLI 入れて」ってお願いするのはさすがに無茶な話ですけども、「公式で Python 3.7 系列入れて」とはお願いしたいところですね。今年の七夕の願い事はここに決定しました。