ローカルで構築した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
前提
- GoogleCloud Pratform でアカウントを作成している。
- 各種ツールに記載してあるものもインストール済み。
GCPでkusanagiを構築
インスタンスの生成
GCPにログイン後に上部にある検索バーにkusanagi
と入力。
プライム・ストラテジー社が出している以下のアイコンをクリックして生成する。
COMPUTE ENGINE上で起動
を押す。
以下のように入力する。
名前は適当。
ゾーンも適当にasia-northeast-b
を選択
kusanagiはメモリの推奨が4GB以上なので、それ以上のVCPUx2
を選択
展開
を押してIPアドレスは一旦エフェメラル
→なし
を選択。(あとで変えます。)
そして以上の入力や選択が終わったらデプロイ
を押す。
4~5分?かかるので、小休憩。
デプロイが完了したら以下のように出てたらOK。
この辺はkusanagiの公式サイトに載ってあるので、こちらを参照。
VMマシンの初設定を行う
次はVMマシンの外部IPアドレスの付与、ファイヤーウォールの設定とsshの設定を行う。
外部IPアドレスの付与
マシンができたらIPアドレスを付与して外部IP、つまりグローバルIPアドレスを付与してあげることによってmacから見ることができる。
初めての場合は何もないと思うので、静的アドレスの予約
を押して生成する。
無料のアカウントなら1つまで静的なアドレスをもらえる。(それ以降は動的なアドレスになる)
こんな感じで、付与してあげる。
IPは人それぞれ違う。
sshの設定を行ってローカルのmacから接続する。
kusanagiの初期設定
メニュー > Compute Engine へ移動。
接続方法は、作成したVMインスタンスの右側にあるssh
ボタンを押す。
初めて接続する場合は、GCPに接続する登録をメタデータとかからしないといけなかったような。。。
接続に成功するとKUSANAGIの文字がお出迎えしてくれる。
あとは、kusanagiのオフィシャルサイトのドキュメントを見てkusanagiの初期設定(kusanagi init
)まで済ませる。
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
で、挿入モードにして、先程の鍵を登録する。
-----BEGIN
〜 KEY---
までをきっちり入れる。
終わったらパーミッションを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のポートを変更したいので、その番号を開けてあげる。
上部のファイヤーウォールのルールを作成する
ボタンを押し、以下のように設定する。
名前
: 適当 〜ssh みたいな名前でも良かった。
ターゲット
: 指定されたターゲットタグ
を選択
ターゲット タグ
: 任意の入力
ソースIPの範囲
: 0.0.0.0/0
プロトコルとポート
: TCPを選択し、任意のポート番号を入力
終わったら作成ボタン。
最後のポート番号のところは、
この番号を使ってサーバーのポート番号の変更をする。
設定したものを開くと以下のようになる。
その後はターゲットタグをインスタンスに設定して、ポート番号を変更して
sshdを再起動して、ローカルから接続できればOK
まずは、ターゲットタグの文字をコピーしておいて、
メニュー > Compute Engine
先程作成したインスタンスを選択して、上部の編集ボタンを押す。
ネットワークタグ欄に、先程のターゲットタグを入れて保存する。
もう一度
メニュー > VPCネットワーク > ファイヤーウォールルール へ戻って、
先程作成したルールを開いてみると以下のように
ターゲットタグを入れたインスタンスが表示されていればOK
[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
kusanagi は Ruby on Railsもサポートしているためオプションを指定してprovisionigをする。
# kusanagi provision --rails [プロファイル名]
あとは以下の通りに設定していく。 KUSANAGIのプロビジョニング – KUSANAGI
今回はプロファイル名とFQDNはrails.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」と入力。
すると、エラーになる。
これは、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
で再起動。
ブラウザを再読込してあげると。。。
/home/kusanaig/rails.com/public
配下にindex.htmlを配置してあげる。
適当にテストって入力して保存する。
ブラウザを再読込させてあげると、、、、できた!
Vagrantでkusanagiを構築
今度はローカル開発環境を立ち上げて、GCPのサーバーと同様のものを作成してあげる。
Vagrantでkusanagiを構築し、開発環境を作成する。
VM上のコードとローカルのコードを同期させる。
ローカルで編集したRailsのコードをVM上で動かし、
アプリケーションを動作させることができる。
つまり開発環境を作成する。
kusanagi環境構築
今度はローカル開発環境を立ち上げて、GCPのサーバーと同様のものを作成してあげる。
こちらを参考にkusanagi init
まで進める。
ローカルと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
もう一度VMにsshでログインして/home/kusanagi
までディレクトリを移動する。
この時点で、ローカルとVMが同期しているので、
どちらかでファイルやディレクトリを作成したらもう片方も作成されていればOK。
$ sudo su -
でrootになって、kusanagiのprovisionを行い、GCPで設定した内容と同じものを作る。。
FQDNのみ、test.rails.com
や vagrant.rails.com
など本番とかぶらないようにつける。
# kusanagi provision --rails [プロファイル名]
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に入る。 長くなったので、次回。