元経理マンが27歳でエンジニアに転向してからのメモ集

元経理マンがエンジニアに転向して現在

ローカルで構築したRuby On RailsのアプリをGCPへの自動デプロイ環境を構築する。①

ゴール

ローカルでいじったコードをGit PushしたらGCPに自動で反映させて、Hello Worldを表示させる。

背景

会社の開発環境とデプロイ環境をできる範囲で再現してみたかった。
きちんと説明するとそこらのチュートリアル並に長くなるので、ところどころ割愛していく。
特に開発用でやりたかっただけなので、ドメインの取得はせずにhostsファイルでなんとかする。
capistranoの使い方全然わかっていないので、かなり無茶苦茶。

必要なツール

Vagrant
VirtualBox
・Circle CI
・GoogleCloud Platform (for kusanagi)
・Git (GitHub) クライアントツールはSource Tree (GitUpをお試し中)

各種バージョン情報

kusanagi 8.4.0-3 (CentOS7.5)
・Nginx 1.15.2 (kusanagiに準ずる) ・Mac High Sierra 10.13.6
Vagrant 2.1.2
・Virtual Box 5.6.18
Ruby 2.4.2

前提

GCPkusanagiを構築

インスタンスの生成

GCPにログイン後に上部にある検索バーにkusanagiと入力。
プライム・ストラテジー社が出している以下のアイコンをクリックして生成する。

f:id:ryomoyr:20181012081616p:plain:w300

COMPUTE ENGINE上で起動を押す。

以下のように入力する。

f:id:ryomoyr:20181012082056p:plain:w300
名前は適当。
ゾーンも適当にasia-northeast-bを選択
kusanagiはメモリの推奨が4GB以上なので、それ以上のVCPUx2を選択

展開を押してIPアドレスは一旦エフェメラルなしを選択。(あとで変えます。)

そして以上の入力や選択が終わったらデプロイを押す。

4~5分?かかるので、小休憩。

デプロイが完了したら以下のように出てたらOK。

f:id:ryomoyr:20181012082801p:plain:w300

この辺はkusanagiの公式サイトに載ってあるので、こちらを参照。

KUSANAGI for GCP – KUSANAGI

VMマシンの初設定を行う

次はVMマシンの外部IPアドレスの付与、ファイヤーウォールの設定とsshの設定を行う。

外部IPアドレスの付与

マシンができたらIPアドレスを付与して外部IP、つまりグローバルIPアドレスを付与してあげることによってmacから見ることができる。

メニュー > VPCネットワーク > 外部IPアドレス

初めての場合は何もないと思うので、静的アドレスの予約を押して生成する。
無料のアカウントなら1つまで静的なアドレスをもらえる。(それ以降は動的なアドレスになる)

こんな感じで、付与してあげる。
IPは人それぞれ違う。

f:id:ryomoyr:20181012083445p:plain:w400

sshの設定を行ってローカルのmacから接続する。

kusanagiの初期設定

ここでようやくVMインスタンスにブラウザ上から接続する。

メニュー > Compute Engine へ移動。

接続方法は、作成したVMインスタンスの右側にあるsshボタンを押す。

初めて接続する場合は、GCPに接続する登録をメタデータとかからしないといけなかったような。。。

接続に成功するとKUSANAGIの文字がお出迎えしてくれる。

f:id:ryomoyr:20181012084226p:plain:w300

あとは、kusanagiのオフィシャルサイトのドキュメントを見てkusanagiの初期設定(kusanagi init)まで済ませる。

kusanagi.tokyo

kusanagiはサーバーの構築をよしなに行ってくれるので、素敵なサーバー構築が楽にできる。
その分何をしているかは勉強していかないと。

ローカルから接続

そんなこんなで初期設定を終えたらローカルから接続してみる。 が、その前にkusanagiのアカウントで直接接続できるように
サーバーに公開鍵を置いて、ローカルに秘密鍵を置く。

恐らく邪道な気がするが、ここではブラウザ上で表示させてローカルにコピーしてしまう。 本当はローカルで生成した鍵をサーバーに置くのが正解。

まずは、以下のコマンドを実施。 なにか聞かれても全部EnterでOK。

[root@test-kusanagi-vm .ssh]# cd /home/kusanagi/.ssh


[root@test-kusanagi-vm .ssh]# su kusanagi


[kusanagi@test-kusanagi-vm .ssh]$ ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/home/kusanagi/.ssh/id_rsa): 
Enter passphrase (empty for no passphrase): 
Enter same passphrase again: 
Your identification has been saved in /home/kusanagi/.ssh/id_rsa.
Your public key has been saved in /home/kusanagi/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:hogeHOGEhogeHOGEhogeHOGEhogeHOGE kusanagi@test-kusanagi-vm
The key's randomart image is:
+---[RSA 2048]----+
|                 |
|                 |
|    .            |
|      .    o     |
| ... . +S . O    |
| .=.P.B*oo       |
| o.**H*=* .      |
|  **o+** o       |
| . BBo+++        |
+----[SHA256]-----+

[kusanagi@test-kusanagi-vm .ssh]$ ll
total 12
-rw-r--r-- 1 root     root      822 Oct 12 08:51 authorized_keys
-rw------- 1 kusanagi kusanagi 1679 Oct 12 09:01 id_rsa
-rw-r--r-- 1 kusanagi kusanagi  407 Oct 12 09:01 id_rsa.pub

これで公開鍵と秘密鍵が生成されたので、それぞれ登録する。

まずは、公開鍵をauthorized_keysに登録
authorized_keysの所有者:グループがrootになっているので、
kusanagi に変更してから登録。

[kusanagi@test-kusanagi-vm .ssh]$ cat id_rsa.pub >> authorized_keys 
bash: authorized_keys: Permission denied

[kusanagi@test-kusanagi-vm .ssh]$ sudo chown kusanagi:kusanagi authorized_keys 

[kusanagi@test-kusanagi-vm .ssh]$ ll
total 12
-rw-r--r-- 1 kusanagi kusanagi  822 Oct 12 08:51 authorized_keys
-rw------- 1 kusanagi kusanagi 1679 Oct 12 09:01 id_rsa
-rw-r--r-- 1 kusanagi kusanagi  407 Oct 12 09:01 id_rsa.pub

[kusanagi@test-kusanagi-vm .ssh]$ cat id_rsa.pub >> authorized_keys 

これで公開鍵の設置が完了。

続いて、秘密鍵をローカルに持っておきたい。

[kusanagi@test-kusanagi-vm .ssh]$ cat id_rsa

# // 以下からコピー

-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAtt/M9c1BRkVRdY3vK0mDOfhawTnoN/0Acb/FrOafK5iRSezt
WziAZ0qDNY5mkizR4RA3/yQZn4kQ07Z940jCFBtg0uG0UplDt07V2Sc/1TGfvgvc
fKHrtx1i788tITMK3RRL8NkEq9z25Ewj7CYzisZ5BCnLSobje0+xCqrqViVsiUUc
+cUrVleaV432BIFmlzQvnncwoINwwS6mpPICOfxHzDPjBN5cRnCYtksHat8B3NgL
hPyUfnS...........................
-----END RSA PRIVATE KEY-----

# // ここまでコピー

macのターミナルを開いて、任意の名前で登録しておく。
文字化け怖いので、viエディタで記入。

$ vi ~/.ssh/test-kusanagi

で、挿入モードにして、先程の鍵を登録する。 -----BEGINKEY--- までをきっちり入れる。

終わったらパーミッション600にしておく。

$ chmod 600 ~/.ssh/test-kusanagi

その後に ~/.ssh/config ファイルに以下を記述すると楽にターミナルから接続できる。
普通のテキストエディタで開いて記載して大丈夫。
Hostは任意の名前
xx.xx.xx.xxの部分は各自のIPアドレスに置き換える
Portは一旦22で接続。

# -------------- test-kusanagi --------------
Host test-kusanagi
  HostName xx.xx.xx.xx
  User kusanagi
  Port 22
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/[ユーザ名]/.ssh/test-kusanagi
  IdentitiesOnly yes

できたら保存して終了。

ここまで来たらmacのターミナルで接続。

$ ssh test-kusanagi
Last login: Fri Oct 12 09:00:53 2018

     __ ____  _______ ___    _   _____   __________
    / //_/ / / / ___//   |  / | / /   | / ____/  _/
   / ,< / / / /\__ \/ /| | /  |/ / /| |/ / __ / /
  / /| / /_/ /___/ / ___ |/ /|  / ___ / /_/ // /
 /_/ |_\____//____/_/  |_/_/ |_/_/  |_\____/___/

    Version 8.4.0-3, Powered by Prime Strategy.

ブラウザ上のGCPのコンソール上の秘密鍵と公開鍵は削除してしまう。

[kusanagi@test-kusanagi-vm .ssh]$ ll
total 12
-rw-r--r-- 1 kusanagi kusanagi 1229 Oct 12 09:04 authorized_keys
-rw------- 1 kusanagi kusanagi 1679 Oct 12 09:01 id_rsa
-rw-r--r-- 1 kusanagi kusanagi  407 Oct 12 09:01 id_rsa.pub

[kusanagi@test-kusanagi-vm .ssh]$ rm -rf id_rs*

[kusanagi@test-kusanagi-vm .ssh]$ ll
total 4
-rw-r--r-- 1 kusanagi kusanagi 1229 Oct 12 09:04 authorized_keys

ファイヤーウォールの設定

GCPはセキュリティ上、ファイヤーウォールの設定が最初からしていてくれて、
必要最低限のものしかポートを開放していない。

よりセキュアなサーバーを構築するためにポート番号を変更しておく。

なので、sshd_configで違うポートを指定した場合は、
自分でファイヤーウォールのポートを開放しないと、ローカルから接続ができなくなるので接続できるように設定をしておく。

メニュー > VPCネットワーク > ファイヤーウォールルール

ルールを作成して、インスタンスに適用させるためにターゲットというものを使って適用させるさせないを指定できる。

なので、ルール作成にターゲットとなる文字を決めて、インスタンスを編集してターゲットを適用させる。

デフォルトで22,80,433,3389あたりが接続できるようになっている。

今回はsshのポートを変更したいので、その番号を開けてあげる。

上部のファイヤーウォールのルールを作成するボタンを押し、以下のように設定する。

f:id:ryomoyr:20181012093720p:plain:w350

名前 : 適当 〜ssh みたいな名前でも良かった。
ターゲット : 指定されたターゲットタグを選択
ターゲット タグ : 任意の入力
ソースIPの範囲 : 0.0.0.0/0
プロトコルとポート: TCPを選択し、任意のポート番号を入力

終わったら作成ボタン。

最後のポート番号のところは、
この番号を使ってサーバーのポート番号の変更をする。

設定したものを開くと以下のようになる。

f:id:ryomoyr:20181012094316p:plain:w300

その後はターゲットタグをインスタンスに設定して、ポート番号を変更して
sshdを再起動して、ローカルから接続できればOK

まずは、ターゲットタグの文字をコピーしておいて、

メニュー > Compute Engine

先程作成したインスタンスを選択して、上部の編集ボタンを押す。
ネットワークタグ欄に、先程のターゲットタグを入れて保存する。

f:id:ryomoyr:20181012101059p:plain:w200

もう一度
メニュー > VPCネットワーク > ファイヤーウォールルール へ戻って、
先程作成したルールを開いてみると以下のように
ターゲットタグを入れたインスタンスが表示されていればOK

f:id:ryomoyr:20181012101342p:plain

できたらmacのターミナルからsshのポートを変更する。

[kusanagi@test-kusanagi-vm ~]$ sudo vi /etc/ssh/sshd_config 


#       $OpenBSD: sshd_config,v 1.93 2014/01/10 05:59:19 djm Exp $

# This is the sshd server system-wide configuration file.  See
# sshd_config(5) for more information.

.
.
.

# If you want to change the port on a SELinux system, you have to tell
# SELinux about this change.
# semanage port -a -t ssh_port_t -p tcp #PORTNUMBER
#
#Port 22
Port 22222     // 追記する。

追記したら:wqで保存終了して、sshdを再起動する。

[kusanagi@test-kusanagi-vm ~]$ sudo su -
最終ログイン: 2018/10/12 (金) 08:47:52 JST日時 pts/0

[root@test-kusanagi-vm ~]# systemctl restart sshd

~/.ssh/configファイルもポートを変更しておく。

# -------------- test-kusanagi --------------
Host test-kusanagi
  HostName 35.221.82.154 
  User kusanagi
  Port 22222
  StrictHostKeyChecking no
  PasswordAuthentication no
  IdentityFile /Users/ml200/.ssh/test-kusanagi
  IdentitiesOnly yes

新たにターミナルのウィンドウを開く。

ML200:material-gcp ml200$ ssh test-kusanagi
Warning: Permanently added '[35.221.82.154]:22222' (ECDSA) to the list of known hosts.
Last login: Fri Oct 12 09:20:47 2018 from fs276ed016.tkyc509.ap.nuro.jp

     __ ____  _______ ___    _   _____   __________
    / //_/ / / / ___//   |  / | / /   | / ____/  _/
   / ,< / / / /\__ \/ /| | /  |/ / /| |/ / __ / /
  / /| / /_/ /___/ / ___ |/ /|  / ___ / /_/ // /
 /_/ |_\____//____/_/  |_/_/ |_/_/  |_\____/___/

    Version 8.4.0-3, Powered by Prime Strategy.

接続されればOK!

kusanagiのprovisioning

kusanagiRuby on Railsもサポートしているためオプションを指定してprovisionigをする。

# kusanagi provision --rails [プロファイル名]

あとは以下の通りに設定していく。 KUSANAGIのプロビジョニング – KUSANAGI

今回はプロファイル名とFQDNrails.comで進めていく。 あとはデータベースの設定を行う。 後ほど使うので覚えておくかメモしておく。

ブラウザに表示させる。

プロビジョニングが完了したら、hostsファイルを設定してブラウザに設定したFQDNを入力する。

sshでログインしている場合は別のターミナルを開いて、macの設定ファイルを編集する。

$ vi /etc/hosts
※場合によってはsudo権限で行う


##
# Host Database
#
# localhost is used to configure the loopback interface
# when the system is booting.  Do not change this entry.
##
127.0.0.1       localhost
#127.0.0.1      hoge1.com
#127.0.0.1      hoge2.com
#127.0.0.1      hoge3.com
255.255.255.255 broadcasthost
::1             localhost

# 追記分
xx.xx.xx.xx rails.com

で、ブラウザ上に「rails.com」と入力。

すると、エラーになる。
f:id:ryomoyr:20181012105040p:plain:w300

これは、railsのデータベースに接続するための設定が間違えているので出てしまう。

今度はサーバーに入って、

[root@test-kusanagi-vm ~]# vi /home/kusanagi/rails.com/config/database.yml 


default: &default
    adapter: mysql2
    encoding: utf8
    pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
    username: ENV['RAILS_DB_USER']
    password: ENV['RAILS_DB_PASS']
    socket: /var/lib/mysql/mysql.sock
.
.
.
production:
    <<: *default
    database: ENV['RAILS_DB_NAME']

と編集する。

そして、ENV['~~']の中身を.envファイルで定義してあげる。
xxxx...には先程設定したデータベース名などを入れる。

[root@test-kusanagi-vm ~]# vi /home/kusanagi/rails.com/.env


RAILS_DB_NAME='xxxxxxx'
RAILS_DB_USER='xxxxxxxx'
RAILS_DB_PASS='xxxxxxxxxx'

あとはNginxの設定ファイルをいじって、本番環境で起動させる設定を反映させてあげる。

[root@test-kusanagi-vm ~]# vi /etc/nginx/conf.d/rails.com_http.conf

.
.
.

    #rails_env development;
    rails_env production;

.
.
.

rails_env development;コメントアウトして、
rails_env production;コメントアウトを外してあげる。

終わったら、# systemctl restart nginxで再起動。

ブラウザを再読込してあげると。。。

f:id:ryomoyr:20181012110411p:plain:w300

/home/kusanaig/rails.com/public配下にindex.htmlを配置してあげる。

適当にテストって入力して保存する。

ブラウザを再読込させてあげると、、、、できた!
f:id:ryomoyr:20181012111306p:plain:w300

Vagrantkusanagiを構築

今度はローカル開発環境を立ち上げて、GCPのサーバーと同様のものを作成してあげる。

Vagrantkusanagiを構築し、開発環境を作成する。

VM上のコードとローカルのコードを同期させる。

ローカルで編集したRailsのコードをVM上で動かし、
アプリケーションを動作させることができる。
つまり開発環境を作成する。

kusanagi環境構築

今度はローカル開発環境を立ち上げて、GCPのサーバーと同様のものを作成してあげる。

こちらを参考にkusanagi initまで進める。

kusanagi.tokyo

ローカルとVM上を同期させ、開発環境を作成する。

kusanagi initが終わったらローカルフォルダとVMのフォルダを同期する。

まずは、ローカルでGitHubと連携したいリポジトリを作成しておく。
$ mkdir rails.com

vagrant init をした際に生成されていたVagrantfileを編集する。

 # config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.synced_folder "/Users/[ユーザ名]/rails.com", "/home/kusanagi"

保存したらvagrant reloadして、変更を反映する。

kusanagiのprovisioning

もう一度VMsshでログインして/home/kusanagiまでディレクトリを移動する。

この時点で、ローカルとVMが同期しているので、
どちらかでファイルやディレクトリを作成したらもう片方も作成されていればOK。

$ sudo su -でrootになって、kusanagiのprovisionを行い、GCPで設定した内容と同じものを作る。。
FQDNのみ、test.rails.comvagrant.rails.com など本番とかぶらないようにつける。

# kusanagi provision --rails [プロファイル名]

KUSANAGIのプロビジョニング – KUSANAGI

provisiongが終わったらログアウトして、
ローカルのVagrantfileを以下のように編集して、vagrant reloadする。

 # config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.synced_folder "/Users/[ユーザー名]/rails.com", "/home/kusanagi/rails.com"

から

 # config.vm.synced_folder "../data", "/vagrant_data"
  config.vm.synced_folder "/Users/[ユーザー名]/rails.com", "/home/kusanagi/rails.com", owner: "kusanagi", group: "kusanagi"

に変更する。

vagrant reloadを行い、同期の確認ができたら、ローカルのリポジトリをgitに登録しておく。 GitHubでもリモートリポジトリを作成しておく。

ドメインにアクセスしたらエラーがでるので、GCPで行ったときと同様に、
config/database.ymlと.envファイル を編集して、
kusanagi restartして画面が表示されればOK。

dotenv-railsを使う場合は、bundleコマンドを入力してから
Rails rootに.env.developmentというファイルを作成して、環境変数を設定する。

このときにpushする前に.gitignore.env*を入れないと、環境変数が外部に漏れてしまうので、記載する。

ここまできて、ようやくCIrcle CIに入る。 長くなったので、次回。