最近個人アプリを開発しているのですが、インフラどうしようかなと思ってとりあえずherokuで行こうと決まったので、経緯だったりデプロイまでの方法を書いておきます。

herokuを選んだ理由

まずは料金が安いという点です。1000時間までは無料のFreeプランがあり、さらにホビープランでは7$(postgresqlは9$)で使えます。それ以上になるとDBが一気に高価になるので他のGCPに切り替えたほうが良さげです。

詳しくはこちら

感覚的にユーザが少ないうちはherokuで増えてきたらGCPに移行したらいいかなって感じです。

herokuの概念

まず、設定するに当たってherokuの概念が他のクラウドとは異なるのでちょっと説明します。

herokuはDynoと呼ばれるWebアプリケーションをデプロイする土台があり、そこにいろいろと設定していく感じです。DBなどはAdd-onsと呼ばれるサービスをくっつけていく感じになります。他にもBuildpacksと呼ばれるビルドプロセスを自動化する機能などいろいろとあります。

こちらから確認してみてください。

準備

まず、herokuで開発するには以下の3つを行う必要があります。

  • アカウント作成
  • CLIのインストール
  • CLIでアカウントの有効化

これらはherokuのHPがわかりやすいので参照して準備してください。

アプリの作成

Dynoの作成

まずはDynoを以下のコマンドで作成します。

heroku create app_name

Add-onsの登録

ここではMySQL,PstgreSQL,Redisの追加方法を紹介します。

MySQL

heroku addons:create cleardb:ignite

PostgreSQL

heroku addons:create heroku-postgresql:hobby-dev

Redis

heroku addons:create heroku-redis:hobby-dev

追加コマンドはAdd-ons詳細の下の方のここに書いてあります。

もっとみたい方はこちらからどうぞ。

環境変数の登録

次に環境変数を登録していきます。

まず、以下のコマンドで登録されているAdd-onsのデータなどがわかります。

heroku config

Laravelの環境変数は.envファイルを参照しますが、herokuではなぜか参照されないんですよね。

なので以下のコマンドで設定していく必要があります。

heroku config:set ENV_PARAM=param

登録した変数は以下のコマンドで確認できます。

heroku config

それで、上で登録したAdd-onsを使うには環境変数を設定する必要があるんですね。

それぞれ確認していきます。

MySQL

まず、MySQLのAdd-onsを追加すると以下のような値が設定されています。

CLEARDB_DATABASE_URL: mysql://ggh389wg45nw7890:ac64bi56@us-cdbr-east-03.cleardb.com/heroku_56b4ky6hl74?reconnect=true

これら以下のような構成になっています。

mysql://DB_USER_NAME:DB_PASSWORD@DB_HOST/DB_DATABASE

なので、以下のようにコマンドを打ちます。

heroku config:add DB_NAME=heroku_56b4ky6hl74
heroku config:add DB_USERNAME=ggh389wg45nw7890
heroku config:add DB_PASSWORD=ac64bi56
heroku config:add DB_HOSTNAME=us-cdbr-east-03.cleardb.com
heroku config:add DB_PORT=3306

PostgreSQL

まず、PostgreSQLの場合は以下のような値が設定されています。

DATABASE_URL: postgres://gbe3ousoggboeyr:52347056t4846b73oly6hyvo3yvoy7v63o67b3y6@ec2-11-111-111-111.compute-1.amazonaws.com:5432/4hv324vuy

これら以下のような構成になっています。

postgres://USER_NAME:DB_PASSWORD@DB_HOST:DB_PORT/DATABASE

なので、以下のようにコマンドを打ちます。

heroku config:add DB_HOST=ec2-11-111-111-111.compute-1.amazonaws.com
heroku config:add DB_PORT=5432
heroku config:add DB_DATABASE=4hv324vuy
heroku config:add DB_USERNAME=gbe3ousoggboeyr
heroku config:add DB_PASSWORD=52347056t4846b73oly6hyvo3yvoy7v63o67b3y6

Redis

REDIS_URL: redis://:7v6l34u237l6v7627y274v5h5vl2by9285gb2po45builbvy2o84v2@ec2-11-111-111-11.compute-1.amazonaws.com:11059

Redisの場合は以下の構成になっています。

redis://:REDIS_PASSWORD@REDIS_HOST:REDIS_PORT

なので、以下のようにまとめます。

heroku config:add REDIS_HOST=ec2-11-111-111-11.compute-1.amazonaws.com
heroku config:add REDIS_PASSWORD=7v6l34u237l6v7627y274v5h5vl2by9285gb2po45builbvy2o84v2
heroku config:add REDIS_PORT=11059

ちなみにshellでまとめて登録する方法は下の方に記載してあります。

buildpackの登録

今回の記事のキモの部分です笑

buildpackとはHerokuでアプリケーションをコンパイルするために使用するオープンソーススクリプトを集めたものだそうです。

これを設定しないとphpが使えなかったり、docker-composeでデプロイできなかったりするので、設定するものです。SDKみたいな感じですかね?とりあえず、実行するコマンドは以下の2点です。

heroku buildpacks:add https://github.com/lstoll/heroku-buildpack-monorepo
heroku buildpacks:add heroku/php

上のbuildpackがDockerfileがディレクトリ直下になくてもリリースできるようにするやつです。順番が大事みたいなので、気をつけてください。

ちなみに、最初のビルドパックを使うためにはAPP_BASEの変数を設定する必要があります。

heroku config:add APP_BASE=src

追加されたbuildpackは以下のコマンドで確認できます。

heroku buildpacks

デプロイ

デプロイする方法は以下の3種類あります。

  • gitを使用する方法
  • dockerを使用する方法
  • Terraformを使用する方法

今回はgitを使ってデプロイします。

gitでデプロイする仕組み

こちらも結構詰まったので説明します。

herokuでプロジェクトを作るとherokuプロジェクトのデプロイ用のリモートブランチが作成されます。そこにGithubとかで開発したコードをコミットするとデプロイされます。

以下のコマンドで remotes/heroku/mainブランチがあるか確認します。

git branch -a

デプロイは以下のコマンドで最新のブランチをリリースするブランチにpushします。

git push heroku main

gitのデプロイに失敗する場合

git push heroku masterと打って以下のエラーが出てませんか?

error: src refspec master does not match any
error: failed to push some refs to 'https://git.heroku.com/app.git'

masterは人種差別撤廃のためmainになっています。

git push heroku mainのコマンドを打ってみてください。

procfileの作成

アプリケーションのディレクトリにProcfileを作成して、以下のように記載してコミットします。

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

Laravelの初期化

次に、Laravelの初期設定を行います。

まずは以下のコマンドでherokuにbashで入ります。

heroku run bash

次に、以下のコマンドでLaravelの初期設定を行います。

cp .env.dev .env

composer install

php artisan key:generate

環境の切り替え・環境変数の反映

herokuでLaravelアプリをリリースしても.envファイルが読み込まれません。

なので、以下のコマンドで環境変数をセットする必要があります。

heroku config:set  ENV_PARAM=param

環境をprod,stg,devで切り分けたい場合はAPP_ENVで指定する必要があります。

ちなみに、以下のshellscriptを作成すると起動するだけで反映されます。

#!/bin/bash
while read line
do
  heroku config:set $line
done < ./.env
カテゴリー: heroku

0件のコメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です