yuuki blog

プログラミング をアプトプットしています。

Heroku(デプロイ)

デプロイとは

ネットワークを通じてWebアプリケーションなどのシステムを公開し、利用可能な状態にすることです。

Herokuとは

アプリケーションの公開、運用を行うためのサーバーを提供するサービスです。
基本機能だけであれば無料で使用でき、デプロイの手間が少なく容易であるというメリットがあります。

 

Herokuにデプロイする際には、Gitの仕組みを使用し、Gitで管理しているリポジトリをHerokuへ反映することで、Heroku上で該当するアプリケーションの操作が可能です。

 

デプロイ

CLIでHerokuを操作する方法

CLIをインストールすると、herokuというコマンドが使用できるようになり、ターミナルからHerokuへアクセスが可能になります。

 Heroku CLIをインストール

ターミナルで、

% brew tap heroku/brew && brew install heroku

を入力し、インストール

Heroku CLIインストールについての公式ドキュメント

 

Herokuにログイン方法

# Herokuへログインするためのコマンド
% heroku login --interactive
  => Enter your Heroku credentials.
# メールアドレスを入力し、エンターキーを押す
  => Email:
# パスワードを入力して、エンターキーを押す
  => Password:

画像 5-2-1

rails_12factorをGemfileに記述

rails_12factorは静的アセットファイルやログの保存先をHeroku用に微調整してくれるGemです。

# ファイルの一番下の行に追記する
group :production do
  gem 'rails_12factor'
end

:productionで指定すると本番環境のみで使用されるように指定できます。

 

Heroku上にアプリケーションを作成

% heroku create アプリ名

下記のコマンドを入力し、正しく設定できたことを確認

% git config --list | grep heroku

fatal: not in a git directory以外が表示されていれば大丈夫です。

 

Heroku上でMySQLの使用方法

ClearDBアドオン

ClearDBアドオンとは、MySQLを使うためのツールです。ClearDBというデータベースサービスが提供しているアドオンで、これを追加することにより、HerokuでMySQLを使用できるようになります。

% heroku addons:add cleardb
Creating cleardb on ⬢ ajax-app-123456... free
Created cleardb-vertical-00000 as CLEARDB_DATABASE_URL
Use heroku addons:docs cleardb to view documentation

MySQLに対応するGemについて考慮する必要があり、設定を変更します

% heroku_cleardb=`heroku config:get CLEARDB_DATABASE_URL`

 

% heroku config:set DATABASE_URL=mysql2${heroku_cleardb:5}

# 以下、コマンドの実行結果
Setting DATABASE_URL and restarting ⬢ ajax-app-123456... done, v◯◯
DATABASE_URL: mysql2://000000000000:0aa0000@us-cdbr-east-02.cleardb.com/heroku_aaa00000000?reconnect=true

 

credentials.yml.encの中身を確認方法

redentials.yml.encファイル

Railsにて、外部に漏らしたくない情報を扱う際に用いるファイルです。
通常時は、英数字の文字列で構成された暗号文が表示され、ファイル内に何が書かれているのか分からないようになっています。しかし、このcredentials.yml.encと対になるmaster.keyが存在する場合、credentials.yml.encの暗号文を復号し、ファイル内の記述を確認できます。

 

 master.keyファイル

credentials.yml.encの暗号文を復号する、鍵の役割を持ったファイルです。特定のcredentials.yml.encと対になっているため、その他のcredentials.yml.encへは、効果を発揮しません。
また、master.keyは非常に重要なファイルなので、リモートリポジトリに反映されることは好ましくありません。そのため、デフォルトで.gitignoreに記述されており、Gitで管理されない仕組みになっています。

 

アプリケーションのディレクトリからconfig/credentials.yml.encを開き暗号文のみを確認できます

画像 5-2-7

ターミナルで

% EDITOR="vi" bin/rails credentials:edit

以下のような画面が確認できれば、credentials.yml.encmaster.keyによって復号し、中身を確認できた状態と言えます。

画像 5-2-8

「escキー」→「:」→「q」で閉じれます

 

Heroku上にmaster.keyを設置

heroku configコマンド

Heroku上で環境変数の参照・追加・削除等をする場合に用います。環境変数の追加であればheroku config:set 環境変数名="値"と実行します。

 

% heroku config:set RAILS_MASTER_KEY=`cat config/master.key`

環境変数を確認

% heroku config

画像 5-2-9

コミットをHerokuへプッシュした後に、環境変数を設定すると反映されません。コミットをHerokuへプッシュする前に設定します

アプリケーションをプッシュ

% git push heroku master

 

Heroku上でマイグレーションファイルを実行

% heroku run rails db:migrate Running rails db:migrate on ⬢ ajax-app-123456... up, run.8920 (Free) D, [2020-05-08T08:22:50.410454 #4] DEBUG -- : (2.9ms) SET NAMES utf8mb4, @@SESSION.sql_mode = CONCAT(CONCAT(@@sql_mode, ',STRICT_ALL_TABLES'), ',NO_AUTO_VALUE_ON_ZERO'), @@SESSION.sql_auto_is_null = 0, @@SESSION.wait_timeout = 2147483 D, [2020-05-08T08:22:50.467023 #4] DEBUG -- : (2.6ms) SELECT @@innodb_file_per_table = 1 AND @@innodb_file_format = 'Barracuda' D, [2020-05-08T08:22:50.479166 #4] DEBUG -- : (11.6ms) CREATE TABLE `schema_migrations` (`version` varchar(255) NOT NULL PRIMARY KEY) D, [2020-05-08T08:22:50.499390 #4] DEBUG -- : (12.0ms) CREATE TABLE `ar_internal_metadata` (`key` varchar(255) NOT NULL PRIMARY KEY, `value` varchar(255), `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) D, [2020-05-08T08:22:50.504699 #4] DEBUG -- : (2.4ms) SELECT GET_LOCK('410119075843185555', 0) D, [2020-05-08T08:22:50.525145 #4] DEBUG -- : (2.8ms) SELECT `schema_migrations`.`version` FROM `schema_migrations` ORDER BY `schema_migrations`.`version` ASC I, [2020-05-08T08:22:50.527632 #4] INFO -- : Migrating to CreatePosts (20200407082548) == 20200407082548 CreatePosts: migrating ====================================== -- create_table(:posts) D, [2020-05-08T08:22:50.545176 #4] DEBUG -- : (11.5ms) CREATE TABLE `posts` (`id` bigint NOT NULL AUTO_INCREMENT PRIMARY KEY, `content` text, `created_at` datetime NOT NULL, `updated_at` datetime NOT NULL) -> 0.0126s == 20200407082548 CreatePosts: migrated (0.0128s) ============================= D, [2020-05-08T08:22:50.559351 #4] DEBUG -- : (2.4ms) BEGIN D, [2020-05-08T08:22:50.562044 #4] DEBUG -- : primary::SchemaMigration Create (2.5ms) INSERT INTO `schema_migrations` (`version`) VALUES ('20200407082548') D, [2020-05-08T08:22:50.573840 #4] DEBUG -- : (11.5ms) COMMIT D, [2020-05-08T08:22:50.584601 #4] DEBUG -- : ActiveRecord::InternalMetadata Load (3.2ms) SELECT `ar_internal_metadata`.* FROM `ar_internal_metadata` WHERE `ar_internal_metadata`.`key` = 'environment' LIMIT 1 D, [2020-05-08T08:22:50.595802 #4] DEBUG -- : (2.5ms) BEGIN D, [2020-05-08T08:22:50.598379 #4] DEBUG -- : ActiveRecord::InternalMetadata Create (2.4ms) INSERT INTO `ar_internal_metadata` (`key`, `value`, `created_at`, `updated_at`) VALUES ('environment', 'production', '2020-05-08 08:22:50', '2020-05-08 08:22:50') D, [2020-05-08T08:22:50.607963 #4] DEBUG -- : (9.4ms) COMMIT D, [2020-05-08T08:22:50.610566 #4] DEBUG -- : (2.4ms) SELECT RELEASE_LOCK('410119075843185555')

 

公開を確認

% heroku apps:info

===ajax-app-123456
Addons:         cleardb:ignite
Auto Cert Mgmt: false
Dynos:          web: 1
Git URL:        https://git.heroku.com/アプリ名.git
Owner:          sample@sample.com
Region:         us
Repo Size:      165 KB
Slug Size:      56 MB
Stack:          heroku-18
Web URL:        https:/アプリ名.herokuapp.com/

Web URL: https://アプリ名.herokuapp.com/の部分のURLへアクセスすれば、公開されたページを見ることができます。

 

デプロイの流れ

はじめてデプロイをする場合

  1. Herokuにアカウント登録する

  2. Heroku CLIをインストールする

  3. 必要なGemを導入する

  4. masterブランチへcommitする

  5. Heroku上にアプリケーションを作成する

  6. MySQLを使用できるように設定する

  7. master.keyを環境変数として設定する

  8. Herokuへアプリケーションの情報をpushする

  9. Heroku上でマイグレーションを実行する

デプロイ済みのアプリケーションに変更修正を加えた場合

  1. 変更修正をcommitする

  2. ブランチを作成していた場合は、masterブランチへマージする

  3. Heroku上にpushする

  4. (テーブルに変更を加えた場合は)Heroku上でマイグレーションを実行する