BFT名古屋 TECH BLOG

日々の業務で得た知識を所属するエンジニアたちがアウトプットしていきます。

【GCP】プライベートな場所のRHEL 6系インスタンスにgcloud CLIをインストールした話とその方法 その①(前提編)

こんにちは!
BFT名古屋支店の佐野です。

今回もGCPのお話です。
最近オンプレミスからリフトしたRHEL 6系インスタンスにCloud CLIを導入しようとして、ハマりにハマってしまいました。
そこで備忘もかねて起きたこと、それに対する対処や解決の方法をお話しします。

はじめに

今回の件は、オンプレミスからGCPへの単純な移行、つまりクラウドリフトを行なった業務システムの運用費用をなるべく減らそうということから始まりました。
そのシステムは運用するにあたり常に稼働し続けなくてもよいシステムであり、以前に筆者が紹介した自動起動・自動停止の仕組みを使えば非稼働時間を作れ、その分の運用コストを削減できると見込みました。
またそのシステムには各サーバのジョブを管理するサーバがあり、そこにgcloud CLIを導入すれば自動起動および自動停止のスケジューリングできるので、そのサーバにシステム管理を統合できると見たのです。

このジョブ管理サーバは当然システムを管理する重要サーバのひとつであるため、プライベートなネットワークに配置されています。
とはいえgcloud CLIは公式からパッケージが配布されており、そのパッケージさえ作業端末に入れてしまえばローカルなインストールが可能です。

構成イメージ図

そんなこんなで早速一般的なgcloud CLIの導入手順等々をまとめ、導入しようとして……後述する問題に次々とハマっていったのです。

実働しているシステムをリフトする形で移行しているということは、当然ながらサーバのOSや構成は移行元と同じということ。
既にサポートが終了したOSを使っているサーバもOSごとGCEインスタンスに移行されました。
そして筆者が触ることとなったジョブ管理サーバもサポートが終了しているOS、RHEL 6系を使っているサーバのひとつだったのです。

gcloudCLIが入らない! / gcloud CLIの導入要件

gcloud CLIの導入が決まってすぐgcloud CLIのパッケージをダウンロードし、公式ドキュメントに記載されている手順に従ってインストールを行なおうとしました。
するとインストール実行時に「SyntaxError:invalid syntax」のエラー出力が。
公式の手順に従っているはずなのにどうして……と確認していると、gcloud CLIの導入要件を見落としていることに気づきました。

cloud.google.com

この公式ドキュメントによれば、gcloud CLIにはPython3.5~3.9が必要とあります。
確かにその時のジョブ管理サーバにはPython3は入っておらず、Python2.6.6が入っているのみ。
ですが利用しようとしていたx86_64 Linuxパッケージには「デフォルトで優先される Python インタープリタがバンドルされています」ともありました。
それならインストールしようとした時点でPython3も使えるようになるのでは? と考えていたのです。
しかし問題はそことは別のところにありました。

cloud.google.com

gcloud CLIを導入の際は前述したPython3.5~3.9、あるいはPython2.7以上が必要だったのです。
普段使っているRHEL(CentOS) 7系では基本Python2.7以上が入っているから、何気なくともインストールができていたわけです。
しかし今回のサーバのOSはRHEL 6系。導入できるPython2も2.6.6が最大であり、仕様が異なる2.7以上にはできません。
Python3を導入せずにバンドルされたPythonインタープリタを使えばよい、という仮定はここで崩れました。

ならば、普通にPython3を導入すれば何も問題はありません。
いつもと同じようにyumインストールすればいい……そんな甘いことを思っていました。

サポートが終了したOSの怖さ / Python3をビルドするために必要なもの

RHEL 6系用のPython3が見つからない。
ここにきてサポート切れOSを扱うのがいかに大変かを痛感することになります。
公式からのサポートが終了している以上、それ用のリポジトリも削除され、yumを使って簡単にパッケージをダウンロード、インストールするいつもの流れができません。
困りに困り、最終手段としてPython3.5以上のソースパッケージを探し出し、makeを使ってビルドすることにしました。

しかしソースパッケージからビルドするとなれば、依存関係の解決も自前で行なわなければなりません。
普段はyumに任せている部分。インストールを試行し、足りないものが付け足していくを繰り返して、ようやく何が必要かをまとめることができました。
結果的にPython3をインストールするために必要だったのは以下のRPMパッケージです。

bzip2、bzip2-devel、cloog-ppl、cpp、findutils、gcc
libffi、libffi-devel、libgcc、libgomp、mpfr
ncurses-base、ncurses-devel、ncurses-libs
perl、perl-core、perl-devel、perl-libs
ppl、readline、xz、xz-devel、zlib-devel

しめて23種類。多いですね…!
また必要なのはRPMパッケージだけではありません。
gcloud CLIで利用するPython3はOpenSSLモジュールおよびSQLliteモジュールを使用するため、これらも前もってビルドしておく必要があります。
そしてOpenSSLは1.0.2または1.1以上SQLiteは3.7.2以上が必要です。ビルドする前にバージョンを確認しておきましょう。

これらをまとめると、Python3をソースパッケージからビルドするまでの流れは以下のようになります。

  1. 依存関係にある(23種の)RPMパッケージをインストール
  2. バージョンが1.0.2または1.1以上のOpenSSLをソースパッケージからビルド
  3. バージョンが3.7.2以上のSQLiteをソースパッケージからビルド
  4. バーションが3.5~3.9のPython3をソースパッケージからビルド

ここまで用意してようやくPython3の導入、ひいては導入したPython3を利用してのgcloud CLIのインストールが可能になります。
RHEL 7系以上ならすぐ終わることが、こうまで手間がかかるものになってしまう。なかなかに大変です。
また必要になるものが分かっても、どうやってそれらを調達するかも問題です。
ひとまず、Python3とOpenSSL、SQLiteのソースパッケージは以下の公式サイトから入手ができます。

Python 公式】 www.python.org

【OpenSSL 公式】 www.openssl.org

SQLite 公式】 www.sqlite.org

これ以外のRPMパッケージは、どこかから頑張って調達しなければなりません。
参考に筆者が利用したRPMパッケージ名を以下に示します。

bzip2-1.0.5-7.el6_0.x86_64.rpm
bzip2-devel-1.0.5-7.el6_0.x86_64.rpm
cloog-ppl-0.15.7-1.2.el6.x86_64.rpm
cpp-4.4.7-23.el6.x86_64.rpm
findutils-4.4.2-9.el6.x86_64.rpm
gcc-4.4.7-23.el6.x86_64.rpm
libffi-3.0.5-3.2.el6.x86_64.rpm
libffi-devel-3.0.5-3.2.el6.x86_64.rpm
libgcc-4.4.7-23.el6.x86_64.rpm
libgomp-4.4.7-23.el6.x86_64.rpm
mpfr-2.4.1-6.el6.x86_64.rpm
ncurses-base-5.7-4.20090207.el6.x86_64.rpm
ncurses-devel-5.7-4.20090207.el6.x86_64.rpm
ncurses-libs-5.7-4.20090207.el6.x86_64.rpm
perl-5.10.1-144.el6.x86_64.rpm
perl-core-5.10.1-144.el6.x86_64.rpm
perl-devel-5.10.1-144.el6.x86_64.rpm
perl-libs-5.10.1-144.el6.x86_64.rpm
ppl-0.10.2-11.el6.x86_64.rpm
readline-devel-6.0-4.el6.x86_64.rpm
xz-4.999.9-0.5.beta.20091007git.el6.x86_64.rpm
xz-devel-4.999.9-0.5.beta.20091007git.el6.x86_64.rpm
zlib-devel-1.2.3-29.el6.x86_64.rpm

Python3とgcloud CLIをインストールするための前準備 / 資材配置

とかく必要なものが把握でき、取り揃えられたなら、ここからは順々に入れていくだけです。
冒頭にて書いた通り、今回の前提はプライベートなネットワーク。用意したRPMパッケージやソースパッケージなどの資材は作業端末に入れておきましょう。
その後TeraTermなどを使って作業対象(筆者の場合はシステムのジョブ管理サーバでした)にログインし、/tmpあたりに用意した資材をSSH SCP機能などで配置します。

この後にRPMパッケージのインストール、ソースパッケージからのビルドを行なっていきますが、それらの手順は次の記事にてお話していきます。

さいごに

今回はサポートが終了しているOS、RHEL 6にgcloud CLIを導入するために必要な要素を紹介しました。
次回は今回で用意した資材を使ったgcloud CLIの導入方法をお話していきます。

今の時代、特に新しく組み上げるシステムならばこの記事で紹介した内容はおおよそ不要ですが、それでも古いシステムをクラウドへ移行しようとなった場合には重要となってくる話と言えます。
その場合はOSの更新も含めて検討する必要が出てくるため、方針を決めるためのひとつの材料として参考にしていただければ嬉しく思います。