ぶちのブログ

競プロとCTFが趣味なWebエンジニアのアウトプットの場

HerokuにデプロイしたRailsアプリを、最短でAWSにデプロイするまでの流れを説明する

前書き

AWSへのデプロイ手順記事を調べると、nginxなどのリバースプロキシやロードバランサーSSLの設定までするものが多いように感じます。
最初からそこまでやらなくても、公開自体はできますし、とりあえず公開してみてから必要に応じて追加していくのも良いのかなと思うので、最短でデプロイする手順をまとめておきます。
また、できる限りAWSの無料枠内に収めるようにしています。

環境

Rails+Postgres+puma

前提

Herokuへのデプロイまではできている。

手順

1. AWSのアカウントを作成し、EC2インスタンスを作成する

こだわりがなければAmazon Linux 2を選ぶ。 インスタンスタイプは、無料枠が残っているならt2.microにするとお財布に優しい。

2. セキュリティグループの設定をする(重要)

インバウンドをマイIPからのssh接続と3000番のみ許可する。
インスタンスに設定するのを忘れないようにする。インバウンドを全て拒否したときに、sshが弾かれていることを確認したりすると、安心。

3. Elastic IPを取得し、EC2インスタンスに関連付ける

ここまでで、1.で取得した鍵と3.で取得したIPアドレスを使って、EC2インスタンスssh接続ができる。

4. ssh接続をし、必要なライブラリをインストールする。

git, rbenv, ruby-build, postgresなど、必要なライブラリをインストールする。
Amazon Linux 2を選んでいれば、amazon-linux-extrasからpostgresがインストールできるので少し楽。

5. git cloneする

公開リポジトリならば簡単。非公開ならローカルからscpコマンドで鍵を送り、ssh接続をする必要があります。

6. 環境構築

ローカルの環境と同様に、ruby, bundler, yarnなどをインストールする。
bundle installの際にpgが入らないときは、
bundle config build.pg -- --with-pg-config=/usr/pgsql-xx/bin/pg_config
を叩いてからもう一度bundle installすれば入るかもしれない。

7. production環境で起動

master.key(secrets.yml.key)などをscpコマンドで送るのを忘れると起動しないので注意。
ひとまず起動できたら、ブラウザでhttp://(3.で取得したIPアドレス):3000にアクセスすると見慣れたエラーページに飛ぶはず。
log/production.logを見てエラーを解決していく。飛ばなかったらセキュリティグループの設定がおかしいので見直す。

8. データベースを作成

RDSインスタンスを作成。無料枠を使うなら.t2.microにする。postgresのバージョンはEC2インスタンスpsqlのバージョンと合わせる。
パブリックアクセシビリティをなしにしておけば、自分のEC2インスタンスからしかアクセスできない。 host, user, db_name, passwordをメモしておく。

9. データベースに接続

database.ymlのproductionに、8.でメモした値が入るようにする。いくらRDSにVPC外から接続できないと言っても、直書きはしないでおく。
環境変数で設定するか、secretsやcredentialsで渡すなど、環境によっていろいろな方法がある。 再びブラウザからアクセスした際に、tableがありませんみたいなエラーに変わっていたらデータベースには接続できている。

10. マイグレーション、JSとCSSコンパイル

RAILS_ENV=production rails db:migrate RAILS_ENV=production rails assets:precompileする。 ここまで来れば、ブラウザから開いたときに正常に動作するはず。

11. 公開

セキュリティグループのインバウンドを変更し、任意の場所からのHTTPでのアクセスを許可する。 sudo iptables -t nat -I PREROUTING -p tcp --dport 80 -j REDIRECT --to-ports 3000
で、HTTPでのアクセスを3000番ポートにリダイレクトする。

(12. ドメイン設定)

ipアドレス直打ちのままでも公開できますが、見た目が良くないと感じたらドメインを取得する必要がある。
Route53でホストゾーンの作成からドメインを取得し(年間19.00$)、レコードセットを新規作成して3.で取得したIPアドレスを書けば、そのドメインからアクセスできる。
(結構時間がかかることが多いので、気長に待つ)

あとがき

思ったより雑になってしまいましたが、何となくの流れを知ってもらえたら幸いです。