BFT名古屋 TECH BLOG

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

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

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

今回はRHEL 6系インスタンスにgcloud CLIを導入するために必要なものと、gcloud CLIそのものを実際に導入してみるお話です。
実際に行なった手順を解説も踏まえてお話していきます。

なお、この記事は前に書いた「【GCP】プライベートな場所のRHEL 6系インスタンスにgcloud CLIをインストールした話とその方法 その①(前提編)」の続きです。
導入や手順の前提となるものはそちらに記載していますので、そちらも併せてお読みください。

bftnagoya.hateblo.jp

はじめに

前回の記事のおさらいですが、RHEL 6系のインスタンスにgcloud CLIを導入するためには以下の流れで各種インストールとビルドを行なう必要があります。 この記事ではこれを順に解説していきます。

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

なお、依存関係のRPMパッケージの内容やソースパッケージのダウンロード元は前回の記事を参照ください。

ソースパッケージや依存関係にあるRPMパッケージを配置し、RPMパッケージをインストールする

cloud CLIをインストールするインスタンスに/tmpディレクトリを作成し、teratermSSL SCP機能などを使って必要なRPMパッケージやソースパッケージを配置します。
その後、以下のコマンドを実行します。

cd /tmp/
sudo rpm -ivh --force *.rpm

このコマンドを実行すると、/tmp配下のRPMパッケージをインストールできます。
必要なRPMパッケージをインストールしたら、次はOpenSSLのビルドです。

OpenSSL をインストールする

先の手順で/tmpにOpenSSLソースパッケージを配置しましたが、まずはこれをOpenSSLをインストールする場所に移動します。
既に/tmpが作業ディレクトリとなっているはずなので、以下のコマンドで/tmpから/srcにパッケージを移します。
(コマンドはOpenSSLのバージョンが1.1.1cの場合です)

sudo mv openssl-1.1.1c.tar.gz -t /usr/local/src/

続いて作業ディレクトリを/srcに移し、tarコマンドを使ってソースパッケージを展開しましょう。

cd /usr/local/src/
sudo tar xvzf openssl-1.1.1c.tar.gz

展開するとOpenSSLのディレクトリができているので、作業ディレクトリをそちらに移します。

cd openssl-1.1.1c/

その後、configureスクリプトを実行してMakeファイルを作成します。
この時にオプションとして/usr/local配下へインストールすること、シェアードライブラリとしてコンパイルすること、またコンパイルにzlibを使うことを指定します。

sudo ./config --prefix=/usr/local/openssl-1.1.1c shared zlib

Makeファイルが作成できたら、そのままmakeコマンドを実行してビルドします。
(make install までしっかり実行しましょう)

make depend
sudo make
sudo make install

これでmakeコマンドによってOpenSSLがインストールされました。
念のため、ここでちゃんと/usr/localに入ったかを確認しておきましょう。

ls -la /usr/local/openssl-1.1.1c/

意図したとおりに入っていることを確認したら、今度はインストールしたOpenSSLが使えるように設定していきます。
まずは共通ライブラリの設定ファイルを作成します。

sudo vi /etc/ld.so.conf.d/openssl-1.1.1c.conf

viエディタに入ったら、以下の内容を追加して保存します。

/usr/local/openssl-1.1.1c/lib

保存したら共通ライブラリの更新を忘れずに行ないます。

sudo ldconfig

共通ライブラリを更新したらOpenSSLのディレクトリリストとライブラリを確認します。

ldconfig -p | grep -i libssl

上手く更新できていれば、以下のようにlibssl.coが追加されています。
(以下はopenssl-1.1.1cを入れた場合の結果)

        libssl3.so (libc6,x86-64) => /usr/lib64/libssl3.so
        libssl.so.10 (libc6,x86-64) => /usr/lib64/libssl.so.10
        libssl.so.1.1 (libc6,x86-64) => /usr/local/openssl-1.1.1c/lib/libssl.so.1.1
        libssl.so (libc6,x86-64) => /usr/local/openssl-1.1.1c/lib/libssl.so

これでインストールしたOpenSSLが使えるようになったはずなので、一度フルパスで実行してみましょう。
試しにバージョン確認を行なって動作をテストします。
インストールしたOpenSSLのバージョンが表示されたら、問題なくインストールができています。

/usr/local/openssl-1.1.1c/bin/openssl version

インストールは完了しましたが、このままだとフルパスによる実行でしかこのOpenSSLを使うことができません。
またこの状態だとPythonのビルド時に組み込まれないので、パスを通す必要があります。
まずは以下のようにシンボリックリンクを作成します。 (/usr/local/lib/pkgconfigが無い場合は最初に作成しておきます)

sudo mkdir /usr/local/lib/pkgconfig

// /usr/local/bin
sudo ln -s /usr/local/openssl-1.1.1c/bin/c_rehash /usr/local/bin/
sudo ln -s /usr/local/openssl-1.1.1c/bin/openssl /usr/local/bin/

// /usr/local/include
sudo ln -s /usr/local/openssl-1.1.1c/include/openssl /usr/local/include/

// /usr/local/lib
sudo ln -s /usr/local/openssl-1.1.1c/lib/engines-1.1 /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libcrypto.a /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libcrypto.so /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libcrypto.so.1.1 /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libssl.a /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libssl.so /usr/local/lib/
sudo ln -s /usr/local/openssl-1.1.1c/lib/libssl.so.1.1 /usr/local/lib/

// /usr/local/lib/pkgconfig
sudo ln -s /usr/local/openssl-1.1.1c/lib/pkgconfig/libcrypto.pc /usr/local/lib/pkgconfig/
sudo ln -s /usr/local/openssl-1.1.1c/lib/pkgconfig/libssl.pc /usr/local/lib/pkgconfig/
sudo ln -s /usr/local/openssl-1.1.1c/lib/pkgconfig/openssl.pc /usr/local/lib/pkgconfig/

シンボリックリンクを作成したらbash_profileファイルに環境変数を設定します。 まずはvimbash_profileを開きます。

sudo vim ~/.bash_profile

その後、openssl-1.1.1cの場合は以下のように設定します。

# OpenSSL
OPENSSL_INC=/usr/local/openssl-1.1.1c/include/openssl
OPENSSL_ENGINE_LIB=/usr/local/openssl-1.1.1c/lib/engines-1.1

export CPATH=$OPENSSL_INC:$CPATH
export LD_LIBRARY_PATH=/usr/local/lib:$OPENSSL_ENGINE_LIB:$LD_LIBRARY_PATH
export PKG_CONFIG_PATH=/usr/local/lib/pkgconfig:$PKG_CONFIG_PATH

bash_profileファイルを変更したら、以下のコマンドを実行して忘れず更新をかけておきましょう。

sudo source ~/.bash_profile

最後にOpenSSLのバージョンをコマンドで確認します。
パスが通っていれば今回インストールしたバージョンが表示されます。

openssl version

SQLite をインストールする

続いてSQLiteのインストールを行ないます。 基本的な手順はOpenSSLの時と同じで、まずは/tmpに移動し、その後/usr/local/srcにソースパッケージを移動します。

sudo mv sqlite-autoconf-3410200.tar.gz -t /usr/local/src/

そしてまた作業ディレクトリを/srcに移し、tarコマンドを使ってソースパッケージを展開します。

cd /usr/local/src/
sudo tar xvzf sqlite-autoconf-3410200.tar.gz

展開したら、SQLiteディレクトリができているので、作業ディレクトリをそちらに移します。

cd sqlite-autoconf-3410200

その後、configureスクリプトを実行してMakeファイルを作成します。
オプションはインストール場所の指定(/usr/local配下)の他、BSD libeditを利用する「--enable-editline」、readlineを利用する「--enable-readline」、拡張セッションを有効にする「--enable-session」そしてデバッグ機能を有効にする「--enable-debug」を指定します。

sudo ./configure --prefix=/usr/local/sqlite/3_41_2 --enable-editline --enable-readline --enable-session --enable-debug

Makeファイルを作成したら、makeコマンドを実行してビルドします。
make install も忘れずに。

sudo make
sudo make install

これでインストールしたSQLiteが使えるようになっているはずです。
OpenSSLの時と同じように一度フルパスでバージョン確認を行なってみましょう。
インストールしたSQLiteのバージョンが表示されたら、問題なくインストールができています。

/usr/local/sqlite/3_41_2/bin/sqlite3 -version

フルパスで使えることを確認したら、次はパスを通していきます。
まずは共通ライブラリを作成します。

sudo vi /etc/ld.so.conf.d/usr_local_lib.conf

viエディタに入ったら、以下の内容を追加して保存します。

/usr/local/lib

保存後、共通ライブラリの更新を行ってください。

sudo ldconfig

共通ライブラリの設定を行ったら、次はシンボリックリンクを作成します。
以下のコマンドを上から順に実行していきます。

// /usr/local/bin
sudo ln -s /usr/local/sqlite/3_41_2/bin/sqlite3 /usr/local/bin/

// /usr/local/include
sudo ln -s /usr/local/sqlite/3_41_2/include/sqlite3.h /usr/local/include/
sudo ln -s /usr/local/sqlite/3_41_2/include/sqlite3ext.h /usr/local/include/

// /usr/local/lib
sudo ln -s /usr/local/sqlite/3_41_2/lib/libsqlite3.a /usr/local/lib/
sudo ln -s /usr/local/sqlite/3_41_2/lib/libsqlite3.la /usr/local/lib/
sudo ln -s /usr/local/sqlite/3_41_2/lib/libsqlite3.so /usr/local/lib/
sudo ln -s /usr/local/sqlite/3_41_2/lib/libsqlite3.so.0 /usr/local/lib/
sudo ln -s /usr/local/sqlite/3_41_2/lib/libsqlite3.so.0.8.6 /usr/local/lib/

// /usr/local/lib/pkgconfig
sudo ln -s /usr/local/sqlite/3_41_2/lib/pkgconfig/sqlite3.pc /usr/local/lib/pkgconfig/

シンボリックリンクも作成したら、SQLiteのバージョンをコマンドで確認してみましょう。
パスが通っていれば今回インストールしたバージョンが表示されます。

sqlite3 -version

Python 3.8.1 をインストールする

ここまでで必要なRPMパッケージと、OpenSSLおよびSQLiteのソースパッケージの導入を終えています。
それらが前提となるPython3を、ここから入れていきます。
まずはOpenSSLやSQLiteの時と同様に/tmpに戻り、その後/usr/local/srcにソースパッケージを移動します。

cd /tmp/
sudo mv Python-3.8.1.tar.xz -t /usr/local/src/

そして作業ディレクトリを/usr/local/srcに移し、Puthon3ソースパッケージを展開します。

cd /usr/local/src/
sudo tar -Jxvf Python-3.8.1.tar.xz

展開したら、Python3のディレクトリができているので、作業ディレクトリをそちらに移しましょう。
そしてここはPython3だけの手順。Modules配下のSetupファイルをviコマンドで開きます。

cd Python-3.8.1/
sudo vi Modules/Setup

Setupファイルを開いたら「# socket line above, and possibly edit the SSL variable:」直下の文章のコメントアウトを外し、以下のように変更して保存します。
なお「SSL=」の部分はOpenSSLをインストールした場所を指定します。
この記事の手順に従っているなら、「/usr/local」を設定することになります。

# Socket module helper for SSL support; you must comment out the other
# socket line above, and possibly edit the SSL variable:
SSL=/usr/local
_ssl _ssl.c \
    -DUSE_SSL -I$(SSL)/include -I$(SSL)/include/openssl \
    -L$(SSL)/lib -lssl -lcrypto

その後、configureスクリプトを実行してMakeファイルを作成します。
オプションはインストール場所の指定(/usr/local配下)の他、コンパイルした時に最適化を行なう「--enable-optimizations」、SQLiteを有効にする「--enable-loadable-sqlite-extensions」を指定します。

sudo ./configure --prefix=/usr/local/python3 --enable-optimizations --enable-loadable-sqlite-extensions

Makeファイルを作成したら、makeコマンドを実行してビルドします。
ここでもmake install までの実行を忘れないようにしましょう。

sudo make
sudo make install

インストールしたら次はパスを通します。
Python3の場合はシンボリックリンクを作成するだけでパスが通ります。

sudo ln -s /usr/local/python3/bin/python3.8 /usr/bin/python3
sudo ln -s /usr/local/python3/bin/pip3.8 /usr/bin/pip3

シンボリックリンクを作成したら、Python3のバージョンを確認して、パスが通っていることを確かめましょう。

python3 --version

これでPython3がインストールできたので、いよいよ本題のgcloud CLIのインストールに入ります。

gcloud CLI をインストールする

最初は今までに入れてきたソースパッケージと同じです。
まずは/tmpに移動し、その後/usr/local/srcにソースパッケージを移動しましょう。

sudo mv google-cloud-cli-421.0.0-linux-x86_64.tar.gz -t /usr/local/src/

パッケージを移動したら作業ディレクトリも/usr/local/srcに移し、gcloudCLIのソースパッケージを展開します。

cd /usr/local/src/
sudo tar -xf google-cloud-cli-421.0.0-linux-x86_64.tar.gz

展開するとgcloud CLIgoogle-cloud-sdk)のディレクトリができているので、作業ディレクトリをそちらに移します。

cd google-cloud-sdk

作業ディレクトリをgoogle-cloud-sdkに移したら、gcloud CLIのインストールスクリプトを起動します。

install.sh

スクリプトを起動するとインストールが進んでいきます。
その最中に以下の質問が入るので、以下のように回答します。

Do you want to help improve the Google Cloud CLI (y/N)?  y
Do you want to continue (Y/n)?  Y
Enter a path to an rc file to update, or leave blank to use [<ホームディレクトリ>/.bashrc]:<何も入力せずEnter>

質問に答えていくとインストールが完了します。
インストールの最中にパスが作られるのですが、インストールが終わった段階だと環境変数が更新されていないので、以下のコマンドで更新を行ないます。

source ~/.bashrc

環境変数を更新したら、改めてgcloud CLIのバージョンを確認し、インストールとパスの構築が完了していることを確認します。

gcloud --version

これで無事、RHEL 6にgcloud CLIを導入することができました!
あとはgcloud initを実行してgcloud CLIを初期化したり、その他の方法でgcloud CLIへ権限を付与するなど設定を行なっていきましょう。

cloud.google.com

さいごに

ほとんどすべてを手作業でインストールすることになった今回の件。
必要なものや手順さえ揃えられれば割とすんなりできるものですが、そこに至るまでがなかなかに大変でした。
もし同じような状況になっている方に、この記事の内容や手順が役立てば幸いです。
それでは今回はここまで。次回の記事もお楽しみに!