【Heroku入門】概要からLaravelをDeployするまで

こんにちは。タンバリン狩野です。

タンバリンではWebアプリなどを作る際にはHerokuを使うことが多いです。
ということでHerokuの入門的な記事を書いておくことにしました。

Herokuについて

概要

jp.heroku.com

Heroku はアプリの構築、提供、監視、スケールに役立つクラウドプラットフォーム

いわゆるPaaSと呼ばれるサービスで、Webアプリなどを簡単にDeploy出来るサービスになっています。Java、PHP、Python、Node、Go、Rubyなど、多数の言語に対応しており、管理なども簡単です。

Dyno

Herokuでちょっと(言葉として)わかりにくいかも、と思うものに、Dyno(ダイノ)があります。簡単に言うと、コンテナの数、になります。なので、Dynoを増やすとコンテナ数が増え、さばくことの出来る処理が増えます。
例えば、管理しているWebアプリのCMが今日は放送されるからその分一時的にDynoを増やしてアクセス増に対応しておこう、ということが簡単に出来たりします。
ちょっと古いですが、以下のような事例もあったりします。
HerokuでWBS砲を打ち返した話 - Speaker Deck

コンテナ自体の性能(メモリなど)を増やしたい場合は、プランを変更すれば可能です。
価格 | Heroku

アドオン

周辺機能についてはアドオンを設定画面から簡単に追加することが出来ます。DBや監視系、ログやストレージなど様々です。無料でも利用は可能ですが、クレジットカードの登録が必要になります。
(勝手に課金が発生することはないので安心してください) jp.heroku.com

Heroku CLI

Herokuをコマンドラインで操作出来るようにするものです。Herokuを使うならば便利なので入れておくとよいでしょう。 devcenter.heroku.com

デプロイする

というわけで、この記事ではLaravelをデプロイしてみます。ゴールはLaravelのページが出るところまで、です。
(タンバリンではWebアプリのバックエンドの開発にはLaravelを利用することが多いです)

デプロイ方法

Herokuへのデプロイ方法ですが、ファイルをFTPでアップロードして…などは出来ません。全てGitで管理する必要があります。
Herokuのアプリは1日に1回、自動的に再起動が行われるのですがその際に、Gitの管理に載っていないものは消えてしまいます。
(これがWordPressなどアプリ上でアップロードした画像が消えてしまう原因です)

で。デプロイ方法は大きくは2つです。
(昔はDropboxとの連携などもありましたが、今はなくなっていますね)

  • Herokuに直接Push
  • GitHubと連携

あとは、作成したDockerコンテナをそのままHerokuにデプロイすることも出来ますが、今回は割愛します。 devcenter.heroku.com

GitHubと連携させた方が何かと便利ですし簡単なのでGitHubとの連携をおすすめします。

GitHub連携

アプリの設定画面から、Deployタブ内GitHubを選び、任意のリポジトリと連携すれば完了、です。

f:id:tamb-kano:20200520090943p:plain
GitHubとの連携

deploys

Automatic deploys は自動Deployの設定で、指定したリポジトリにpush(もしくはmerge)されると自動的にDeployされるように出来ます。

Manual deploy は手動でのDploy設定で、指定したリポジトリからDeployすることが出来ます。GitHub側にpushすることなく、その場でDeploy出来るので、別のリポジトリを一時的に反映させて確認する、なども可能です。

f:id:tamb-kano:20200520091027p:plain
自動デプロイと手動デプロイ

ビルドパック

jp.heroku.com

Heroku buildpack は、Heroku でアプリケーションをコンパイルするために使用するオープンソーススクリプトを集めたもので、Heroku の多言語プラットフォームのバックボーンを担っています。

Herokuのアプリケーションの言語はbuildpackと呼ばれるもので設定されています。 これはコードから自動で設定されるので通常であれば指定する必要はないと思います。
(composer.jsonがあればPHP、など)

設定から明示的に指定してやることも可能です。

f:id:tamb-kano:20200520091105p:plain
ビルドパック

Procfile

devcenter.heroku.com

Procfileとは、アプリケーションの起動時に実行されるコマンドを指定しておくものです。ドキュメントルートの指定などはここで行います。以下のように書けば、httpサーバをapacheとし、ドキュメントルートを public/ 以下にする、という指定になります。

web: vendor/bin/heroku-php-apache2 public/

これを記述した Procfile という名前のファイルをルートディレクトリに設置しておきます。

LaravelのDeploy

今回は、GitHubにLaravelをPushしたリポジトリを用意し、そのリポジトリと連携してDeployします。laravel new したものに、Procfileを追加しただけ、の状態とします。接続出来たらmasterリポジトリを手動でDeployします。

次に環境変数の設定です。

.env はGitHubにアップしてしまうと機密情報が漏れてしまうため、ソース管理に含めてはいけません。その代わり、サーバー側の環境変数で対応する必要があります。
Herokuではこの環境変数は設定画面から簡単に追加・変更が出来るようようになっています。

最低限、APP_KEYだけあれば動作しますので、今回はそれだけ入れておきます。
(実際には他の環境変数も設定してください!)

Laravelのキーの生成は php artisan key:generate で可能ですが、Heroku上のLaravelで実行(表示)をするには、Heroku CLIを使って生成する場合は以下のようにして表示します。

$ heroku run 'php artisan key:generate --show' -a APP_NAME

その後、設定画面から(もしくはコマンドで)設定します。

f:id:tamb-kano:20200520091143p:plain
環境変数

コマンド

$ heroku config:set APP_KEY=base64:XXX -a APP_NAME

これだけでとりあえず表示は出来ました。

実はHerouk公式のドキュメントが存在しますので、より詳しい情報は以下からどうぞ(英語)。
devcenter.heroku.com

さいごに

以上、ざーっとした説明から実際のデプロイまで、を書き出してみました。
このようにインフラの管理を簡単に行う事ができ、実際に運用にも耐えられ、アドオンで様々な拡張も可能、ということで本当に便利だと思います。

これらは、Herokuを作った人が提唱した、Twelve-Factor App、という考えが背景にあり、いわゆるマイクロサービスアーキテクチャにも通じるようなモダンな考え方がベースになっていたりします。このようなしっかりとした思想がベースにある、というのもすごく良いですよね。 12factor.net

参考

SalesforceにはTrailheadというオンライン学習サイトがあります。
これは自社の製品だけでなくGitや1on1などもあったりするのですが、当然Herokuもありますので、興味のある方は学んでみてはいかがでしょうか。 trailhead.salesforce.com