永らくさくらの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
この記事に勇気付けられた筆者は、永らくタイプしてこなかった ./configure
や make
といったコマンド達を打つことを決意しました。
ソースからのビルドはこの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.cfg
のuser=1
をコメントアウト(行頭シャープ)して再度installしたら動きました。
stackoverflow.com
インストール後、PATHを通すのを忘れずに。
また、例えばbashであればコマンドの検索パスはキャッシュされることもあるので、今回のopensslやpythonのように元々パス通ってる場所にバイナリが置いてあった場合はキャッシュにも注意です。
unix.stackexchange.com
pipのインストール
この手順ではeasy_install
は入らないので、get-pip.py を使った方法 を使いました。
さいごに
ネット上の記事では さくらのレンタルサーバーにPythonのpipとAWS Command Line Interface(aws-cli)をインストールする | 大石制作ブログ のように「すんなり入った」報告もあるのですが、もしかしてサーバの個体差とかあるんでしょうかね。検索で本記事に辿り着いたみなさんは、まずは「普通の」方法を試してみて、ダメだった時だけソースからのインストールに手を染めたら良いと思います。
あと、「公式で AWS CLI 入れて」ってお願いするのはさすがに無茶な話ですけども、「公式で Python 3.7 系列入れて」とはお願いしたいところですね。今年の七夕の願い事はここに決定しました。