はじめに
AWS Cloudtechで一通り基礎を学んだ初心者が、
Rails のアプリをAWSでデプロイしさらに冗長化構成にする際に参考にした記事をまとめました。
AWSの基礎を学んで、WordPressの設定はできるけど、Railsアプリの場合はちょっと良く分からない。
AWSの記事はたくさんあるけど、どの記事が自分の設定にあっているか分からないという方もこの記事を読むと何か掴めるかもしれません。
最終的に以下の図のような設定ができました。
環境は以下の通りです。
Rails 6
MySQL(RDS)
*この記事で冗長化の設定方法は書いてありません。
RailsのアプリをAWSでデプロイする際の参考記事の決め方と参考記事の紹介
データベースについて
- EC2に直接インストールする方法
- AWSのRDSを使う方法
データベースの使用方法は二種類あります。冗長化構成にしたいのであれば、AWSのRDSを使用するのが◎です。
違いは、EC2にMysqlサーバーをインストールするか否かです。
初心者向けの丁寧に解説されているほとんどの記事は、EC2にデーターベースサーバーを直接インストールしているということに注意しながら参考記事を探します。
冗長化構成にするための基盤の設定は、AWSのRDSを使用したシングル構成の環境構築です。
「マルチAZ」「シングル構成」「RDS」などをキーワドにして記事を探します。
これという記事はありませんが、AWS Cloudtechで学習することで簡単に作れるようになります。
下記の図のような構成で環境構築することが最初の目標になります。
ここでの注意点は、セキュリティグループのインバウンドルールを正しく設定することです。
EC2にhttp接続、ssh接続ができるように設定し、RDSはEC2から接続できるように設定します。
上記の環境を構築できたら、EC2に接続しRailsが動く環境をインストールしていきます。
EC2の設定
EC2にインストールする内容はどの記事もほとんど同じです。
node.jsをインストールする際に出てくるメッセージにyarnもインストールしてくださいとあるのでインストールします。(yarnのことは書いていない記事も多いですが柔軟に)
注意することは、データベースのインストール時にmysql-devel、mysqlはインストールして
[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql-devel
[ec2-user@ip-10-0-0-21 sample-app]$ sudo yum -y install mysql
mysql-serverをインストールしないということです。(RDSを使用するため)
sshでEC2への接続を試す(ターミナル)
[ダウンロードしたkeyがあるディレクトリ]$ chmod 600 key.pem
↑権限の変更をしています
$ ssh -i 〇〇.pem ec2-user@紐付けたElastic IP
↑ssh接続
EC2からRDSの接続を試す
[ec2-user@ip-10-0-0-21 sample-app]$ mysql -h <RDSのエンドポイント> -u rails -p
Enter password:
Welcome to the MariaDB monitor. Commands end with ; or \g.
Your MySQL connection id is 140
Server version: 8.0.20 Source distribution
Copyright (c) 2000, 2018, Oracle, MariaDB Corporation Ab and others.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
MySQL [(none)]> show databases;
+--------------------+
| Database |
+--------------------+
| information_schema |
| mysql |
| performance_schema |
| sample ← |
+--------------------+
4 rows in set (0.00 sec)
この記事がわかりやすそうです。
> show databases;
これを打つことでRDSで作成したデーターベースをみることができます。
ローカルのdatabase.ymlのproductionの設定
production:
adapter: mysql2
encoding: utf8
database: <%= Rails.application.credentials.db[:database] %>
username: <%= Rails.application.credentials.db[:username] %>
password: <%= Rails.application.credentials.db[:password] %>
host: <%= Rails.application.credentials.db[:host] %>
port: <%= Rails.application.credentials.db[:port] %>
参考にした記事
環境変数の設定方法
credentials.yml.encとmaster.keyを使う方法を試してみました。
環境変数が設定してあるcredentials.yml.encは暗号化されてGithubに、master.keyは.gitignoreに載っているため公開されないという仕組みです。EC2にgitcloneしたアプリにも同じmaster.keyを書いてあげることでcredentials.yml.encの暗号化が解け、環境変数がEC2上でも使えるようになるという仕組みです。
以下の記事を参考にしました。わかりやすいです。ありがとうございます。
こんな感じで設定しました。(ローカルで設定)
# aws:
# access_key_id: 123
# secret_access_key: 345
db:
database: sample_app
host: database-1.csssssssd.ap-northeast-1.rds.amazonaws.com
username: sample
password: sample3456
port: 3306
# Used as the base secret for all MessageVerifiers in Rails, including the one protecting cookies.
secret_key_base: asdfgfhaasdffg7as7gd78a9ha9ahdhnsg894ti9849
~
ユニコーン、EC2のサーバにアプリのコードをクローン、Nginx、Capistrano
環境設定が終わったところでユニコーンの設定、Githubからアプリのコードをクローンしていきます。
クローンができたら、Nginx、Capistranoを設定します。
ユニコーンの設定からはこの記事が参考になりました。ありがとうございます。
gitcloneしたアプリでrubyがないと言わました。
$ rbenv global x.x.x
で効かなかったようです。下記を入力。
$ rbenv local x.x.x
環境変数の設定は、
設定したcredentials.yml.encに対応するローカルのmaster.keyを手動でEC2内のアプリにコピーするという方法で行います。
この記事が参考になりました。ありがとうございます。
master.keyのファイルの場所の関係でエラーが何度か出ましたが、環境変数が使えるようになればデーターベースには繋がりますし、エラーが出たらエラー文が教えてくれるので次に進めます。
複数のEC2に自動デプロイする方法(Capistrano設定後)
ローカルのproduction.rbにserverを付け加える
server '54.65.157.240', user: 'ec2-user', roles: %w{app db web}
server '35.72.140.240', user: 'ec2-user', roles: %w{app db web}
AutoScallingで追加されたEC2に自動でデプロイする方法
この記事が参考になりそうです。まだ試していないのでわかりません。
最後に
エラーがたくさん出るとは思いますが、一つの記事をベースに、その他エラーが出る度に色々な記事を参考にしながら理解を深めていけば解決方法は見つかります。
AWS Cloudtech、お勧めです。
herokuにデプロイできず2日間エラーに向き合って、基礎が全くわかっていないと気付きAWSを勉強し始めて約20日間。
全くインフラの知識がなかった自分でも、色々な記事を参考にエラーを解決していくことができるようになりました。
ありがとうございます☺️