Closed48

EC2 + RDS でRails環境構築

ito_110ito_110

ゴール

AWSにて EC2 + RDS でRailsの環境構築を実施
Railsの初期ページの表示を確認できたらゴール

ito_110ito_110

作業手順

  1. VPC構築
  2. EC2構築
  3. EC2にRails導入
  4. RDS構築
  5. Railsの初期ページを確認

上記は作業手順
ただし、作業状況次第で、一部前後する可能性あり

ito_110ito_110

VPC構築

  1. AWSコンソールからVPCへ

  2. VPCウィザードの手順通りVPCを構築(ほぼデフォルト)
    「作成するリソース」 項目では 「VPCなど」 を選択
    「名前タグ」 のみ「Rails-EC2-RDS-20220725」へ変更

  3. VPCの構築を確認

ito_110ito_110
  1. サブネットが構築されていることも確認
    VPCと同時に構築される
ito_110ito_110

EC2構築

  1. AWSコンソールからEC2選択
  2. EC2にて各種設定を実施
  • 名前とタグ「Rails-EC2-RDS-20220725」
  • OSイメージはデフォルト
ito_110ito_110
  1. EC2にて各種設定を実施
  • Railsの初期ページ表示がゴールなので、インスタンスタイプは無料枠の「t2.micro」
ito_110ito_110
  1. EC2にて各種設定を実施
  • キーペアの作成
    キーペア名を入力して、キーペアを作成する。
    設定はデフォルトのまま
ito_110ito_110
  1. EC2にて各種設定を実施
  • ネットワーク設定
    • VPCは先ほど作成した「Rails-EC2-RDS-20220725」を選択
    • サブネットには4つのサブネットの中から「Public-1a」を選択
    • セキリュティグループも新規作成。「 Rails-EC2-RDS-SG-20220725」
    • インバウンドセキリュティグループの設定はデフォルトのまま。(後で追加する)
ito_110ito_110

SSHでEC2へ接続

(mr110825は自分のユーザー名です。)

  1. ドキュメントフォルダに保存したキーペアをホームディレクトリ配下の.sshへ移動する
terminal
mv railsec2rds20220725.cer ../.ssh
  1. .ssh内部のキーペアを確認する
terminal
ls -l ./.ssh
-rw-r--r--@ 1 mr110825  staff  1674  7 25 12:04 railsec2rds20220725.cer
ito_110ito_110
  1. EC2にSSH接続
terminal
ssh -i ~/.ssh/railsec2rds20220725.cer ec2-user@13.230.184.55
ssh -i <キーペアの保存場所> ec2-user@<EC2のパブリック IPv4 アドレス>

EC2のインスタンス概要にパブリック IPv4 アドレスが表示されています。

ito_110ito_110

エラー確認

terminal
mr110825@Air ~ % ssh -i ~/.ssh/railsec2rds20220725.cer ec2-user@13.230.184.55
The authenticity of host '13.230.184.55 (13.230.184.55)' can't be established.
ED25519 key fingerprint is SHA256:EIh1tBWXXtUw76tuBNMSPNoZ1xBLgjFKDGEZEmU7a90.
This key is not known by any other names

このエラーについては下記を参照
EC2にSSHで接続しようとしたら、秘密鍵のパーミッションエラーが出る

ファイル権限を付与して、再度EC2へログイン

terminal
mr110825@Air ~ % chmod 600 ~/.ssh/railsec2rds20220725.cer

mr110825@Air ~ % ssh -i ~/.ssh/railsec2rds20220725.cer ec2-user@13.230.184.55

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
12 package(s) needed for security, out of 22 available
Run "sudo yum update" to apply all updates.
[ec2-user@ip-10-0-8-225 ~]$

ログインできることを確認。

ito_110ito_110

client_loop: send disconnect: Broken pipe への対応

EC2にログインした状態で一定時間放置すると自動的にログアウトするので、設定を変更する

terminal
[ec2-user@ip-10-0-8-225 ~]$ client_loop: send disconnect: Broken pipe
  1. .sshフォルダ配下にconfigを作成
terminal
mr110825@Air ~ % vi ~/.ssh/config
  1. 下記の設定を追記
Host *
	ServerAliveInterval 60
	ServerAliveCountMax 60

この設定により1時間は放置しても問題ないようになります。

参考サイト

【Broken pipe】ssh接続が切れる

ito_110ito_110
terminal
[ec2-user@ip-10-0-8-225 ~]$
[ec2-user@ip-<EC2のプライベート IPv4 アドレス>]

EC2にログインした後は、プライベート IPv4 アドレスを確認
目的のEC2にログインできているか判断できます

ito_110ito_110

EC2にRails導入

下記が参考記事
Zenn:Rails6 + EC2(Amazon Linux2) + RDS + Puma + Nginx の環境構築

  1. sudo yum update実行
[ec2-user@ip-10-0-8-225 ~]$ sudo yum update -y
  1. Railsに必要なパッケージをインストール
sudo yum install git bzip2 readline-devel zlib-devel gcc libyaml-devel libffi-devel gdbm-devel ncurses-devel gcc-c++ mysql-devel ImageMagick ImageMagick-devel
  1. ruby-build, rbenvのインストール
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
vim ~/.bash_profile

下記を追記

.bash_profile
export PATH=$HOME/.rbenv/bin:$PATH
eval "$(rbenv init -)"
source ~/.bash_profile
ito_110ito_110
  1. Rubyをインストール
    インストールに時間がかかるので注意
[ec2-user@ip-10-0-8-225 ~]$ rbenv install 2.7.3

インストールを確認

[ec2-user@ip-10-0-8-225 ~]$ rbenv versions
  2.7.3
ito_110ito_110

RDS構築

Rubyのインストールで時間がかかるので、RDS構築を同時並行で実施する

ito_110ito_110
  1. RDSにてサブネットグループを作成
  • AWSコンソールからRDSを選択、サブネットグループを作成する
  • 名前:Rails-EC2-RDS-20220725
  • 説明:Rails-EC2-RDS-20220725(特に意味はないので、どの構築に利用するか判別のため)
  • VPC:今回新規に構築したVPCを選択
ito_110ito_110
  • アベイラビティゾーン:1aと1c。VPC構築と同じものを選択
  • サブネット:VPC構築時の4つのサブネットより、privateのサブネットを選択
ito_110ito_110
  1. RDSデータベース構築
  • 「エンジンのオプション」はmysqlを選択、バージョンも最新
ito_110ito_110
  • DBインスタンス識別子:rails-ec2-rds-20220725
  • マスターユーザー名:root(adminからrootへ)
  • マスターパスワード:任意のパスワード
ito_110ito_110
  • 自動スケーリングは解除(Railsの初期ページのみ表示なので、必要なし)
ito_110ito_110
  • VPCは今回構築したものを選択
  • VPCセキリュティグループは新規作成「rails_ec2_rds_for_vpc_20220725」
  • AZは1aを選択
ito_110ito_110

EC2にRails導入(初期ページの表示まで)

  1. bundlerインストール
rbenv install 2.7.3 #既に完了
rbenv rehash
rbenv global 2.7.3
gem install bundler:1.17.1
  1. nvm, NodeJsのインストール
git clone https://github.com/creationix/nvm.git ~/.nvm
vim ~/.bashrc

以下の記述を追記

export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
[ -s "$NVM_DIR/bash_completion" ] && \. "$NVM_DIR/bash_completion"

下記のコマンドを実行

source ~/.bashrc 
nvm install v6.17.1
npm install -g yarn
ito_110ito_110
  1. Railsアプリケーションの配置
    下記のコマンド実行
sudo mkdir -p /var/www
sudo chmod -R 755 /var/www
sudo chown -R ec2-user:ec2-user /var/www
cd /var/www
ito_110ito_110
  1. Railsの構築
# Railsのインストール
gem install rails 

# バージョンの確認
rails -v
Rails 7.0.3.1を確認

# Railsアプリ新規作成
rails new rails-test-app -d mysql
ito_110ito_110
  • mysqlをインストール可能か確認
[ec2-user@ip-10-0-8-225 rails-test-app]$ yum info mysql
読み込んだプラグイン:extras_suggestions, langpacks, priorities, update-motd
エラー: 表示するパッケージはありません
ito_110ito_110
  • mysqlのリポジトリ追加
sudo yum localinstall -y https://dev.mysql.com/get/mysql80-community-release-el7-3.noarch.rpm
ito_110ito_110
  • mysqlリポジトリ有効化
# mysql5.7のリポジトリを無効化し、mysql8.0のリポジトリを有効化する
sudo yum-config-manager --disable mysql57-community
sudo yum-config-manager --enable mysql80-community
ito_110ito_110
  • mysql-community-clientをインストールする
sudo yum install -y mysql-community-client
  • インストールされているか確認
mysql --version
ito_110ito_110

エラーを確認

mysqlインストール時にエラー発生

〜
mysql-community-libs-8.0.29-1.el7.x86_64.rpm の公開鍵がインストールされていません


 Failing package is: mysql-community-libs-8.0.29-1.el7.x86_64
 GPG Keys are configured as: file:///etc/pki/rpm-gpg/RPM-GPG-KEY-mysql
  • 公開鍵を最新にして再度インストール
# 公開鍵をインストール
sudo rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022

# mysqlをインストール
sudo yum install -y mysql-community-client

# mysqlを確認
mysql --version
ito_110ito_110
  1. RDSと接続

    現状では、RDSと接続しようとしてもセキリュティグループで排除されるので、再設定する
  • RDS構築時のVPC「rails_ec2_rds_for_vpc_20220725」にて
    EC2構築時「Rails-EC2-RDS-SG-20220725」のVPCの接続を許可するよう設定

    「rails_ec2_rds_for_vpc_20220725」のインバウンドルールに
    「Rails-EC2-RDS-SG-20220725」のセキリュティグループIDを設定している
ito_110ito_110
  • RDSへ接続
mysql -h rails-ec2-rds-20220725.crfqcvs3zcns.ap-northeast-1.rds.amazonaws.com -P 3306 -u root -p
# RDSへ接続
mysql -h <RDSのエンドポイント> -P 3306 -u root -p

  • RDS構築に設定したパスワードを入力して接続を確認する
[ec2-user@ip-10-0-8-225 rails-test-app]$ mysql -h rails-ec2-rds-20220725.crfqcvs3zcns.ap-northeast-1.rds.amazonaws.com -P 3306 -u root -p
Enter password:
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 88
Server version: 8.0.28 Source distribution

Copyright (c) 2000, 2022, Oracle and/or its affiliates.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql>
ito_110ito_110
  • Railsのconfig設定
    Railsのdatabase.ymlを編集する
vim ./config/database.yml
config/database/yaml
default: &default
  adapter: mysql2
  encoding: utf8mb4
  pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>
  username: root
  password: rootpass #設定したパスワードを入力
  host: rails-ec2-rds-20220725.crfqcvs3zcns.ap-northeast-1.rds.amazonaws.com #RDSのエンドポイント
ito_110ito_110

エラー発生

  • rails sコマンドで下記のエラー発生。mysqlについて必要なパッケージがない旨のメッセージを確認。
/home/ec2-user/.rbenv/versions/2.7.3/lib/ruby/gems/2.7.0/gems/bootsnap-1.12.0/lib/bootsnap/load_path_cache/core_ext/kernel_require.rb:30:
in `require': libmysqlclient.so.18: cannot open shared object file: No such file or directory - /home/ec2-user/.rbenv/versions/2.7.3/lib/ruby/gems/2.7.0/gems/mysql2-0.5.4/lib/mysql2/mysql2.so (LoadError)
  • mysql-develを個別でインストール
sudo yum install mysql-devel
  • 改めて、bundle
bundle install --path vender/path
  • 必要なgemがない旨のメッセージを確認。
bundle update
bundle install --path vender/path #再度トライ

上記の手順で解決。

ito_110ito_110
  1. rails の初期ページ表示
  • ポート3000をEC2のセキリュティグループにて許可する
  • Railsサーバー起動
rails s -b 0.0.0.0
  • ブラウザのURLにて<EC2のパブリック IPv4 アドレス> :3000へ接続する
ito_110ito_110
  • エラー発生:ActiveRecord::NoDatabaseError
    単純にデータベース作成を忘れていたので、
rails db:create
rails db:migrate
  • 再度、Railsサーバー起動
    rails s -b 0.0.0.0
このスクラップは2022/07/26にクローズされました