AWS

AWS(EC2)本番環境へのデプロイ手順をついつい忘れがちなのでメモ

3+

AWS(EC2)本番環境へのデプロイはそんなに頻繁に行う作業ではないので、手順をついつい忘れがち。。。ということで、いつでも見返せるように手順をまとめました。
文中に出てくるgitコマンドの説明はこちらの記事がとても分かりやすく、丁寧に書かれているので、必要に応じて適宜参考にしてください!
まずはGitの仕組みを理解することから

前提

・開発環境:VirtualBox
・本番環境:AWS(EC2)
・仕様サーバー:Nginx、Unicorn
・ローカルリポジトリのブランチで開発したソースをGitHubにプッシュし、本番環境ではorigin/masterをプルする、という方法を取る

手順① 現状のブランチを確認し、変更内容をステージング環境にaddする

これで、ローカルリポジトリのブランチ一覧と現在どのブランチにいるのか確認

上記コマンドの「.」は変更があった全てのファイルを指している。例えば、ある特定のファイルだけをステージング環境にaddしたければ、「.」の部分をaddしたいファイル名に変更すればOK!

手順② ステージング環境にaddされたファイルをリポートリポジトリにコミットする

コミットが出来たら、コミットできたかを下記コマンドで確認

手順③ GitHubにプッシュし、ブランチをmasterブランチにマージする

プッシュしたら、GitHubのページに遷移してプルリクエスト。プルリクエスト後のマージは、個人開発をしているのか、チーム開発をしているのか、等状況に応じて変わるので、臨機応変に対応

手順④ AWSにSSHでログインし、Unicornのプロセスを停止させる

なぜ、Unicornのプロセスを停止させるのか?

vagrantの開発環境であれば、Webブラウザをリロードすれば、変更内容が即時反映されるが、本番環境では変更されたアプリケーションの内容は即時反映されないので、一度プロセスを停止させた状態で、変更内容をGitHubからプルし、再度Unicornを起動させる必要がある。

production(本番)環境にすぐに変更が反映されない理由

それは、development環境とproduction環境に以下の違いがあるから
■development:キャッシュが無効 
■production:キャッシュが有効 

キャッシュとは?

リクエスト・レスポンスのサイクルの中で生成されたコンテンツを保存しておき、次回同じようなリクエストが発生したときのレスポンスでそのコンテンツを再利用すること。単一サーバー、単一データベースのWebサイトでも数千ユーザーの同時接続による負荷に耐えられるようになる。
キャッシュにもコンテンツキャッシュやクエリキャッシュなど、いくつか種類があるが、今回変更内容がすぐに反映されない原因を作っているのは、静的ページ等のコンテンツをキャッシュしておく、コンテンツキャッシュ

production(本番)環境にすぐに変更が反映されない理由(続き)

■development環境はキャッシュが無効だから、Railsアプリケーションに変更を加えてreloadし、再度リクエストを送ると即時反映される。

■production環境はキャッシュが有効だから、Railsアプリケーションに変更を加えてreloadし、再度リクエストを送っても変更前のアプリケーションのコンテンツ内容がキャッシュにより再利用されるので、変更がすぐに反映されない。変更を反映させる場合は一度キャッシュによるコンテンツの再利用を止める必要があるので、Unicornを一度落として、再起動させる必要が生じる。

手順⑤ git pullする

手順⑥ bundle installする

手順⑦ production環境でrake db:migrateする


ローカル環境では、「$ rake db:migrate」しか入力しないかもしれないが、
「rake db:migrate」はmigrateする環境指定の記述を省略しており、下記のようにデフォルトでdevelopment環境が指定されていることは頭の片隅に置いておいた方が良い

手順⑧ production環境でプリコンパイルする

プリコンパイルとは、アセットパイプラインというJavaScriptやCSSのアセットを最小化または圧縮して連結するためのフレームワークで行われる一連の処理を指すが、詳細は下記の記事を参照
https://numb86-tech.hatenablog.com/entry/2018/11/10/002439

https://railsguides.jp/asset_pipeline.html

手順⑨ Unicornを再度、起動させる

これでUnicornが起動し、git pullされたアプリケーションとUnicornが接続されてデプロイが完了!


3+