AWSのインスタンス上で、この手順でやれば間違いなくRails6が動くまでの手順をまとめました。時期が変われば方法も変わると思いますので、2020年10月版とします。参考にしたのは、記事末尾にある教本とWebの記事数々です。※Rails6環境で分かりやすい本が無かった
・東京リージョン(ap-northeast1)、OSはAmazon Linux2
・t2.microまたはt3.micro(無料枠が残っていればt2、それ以降はt3の方が安い)
・ストレージ (EBS)は8GB SSDを割り当て
・インスタンスに割り当てるSecurity Groupの設定で、ポート80番(HTTP)を許可
・自動割当パブリックIPは有効
・インターネット側からアクセスできるようインターネットゲートウェイの設置、VPCの設定
詳細は省略します。過去の記事はこちら。
toshioshimo.hatenablog.com
こちらも先程の過去記事に掲載しています。
・キーペアのダウンロード
・キーの権限変更 (chmod 400 xxxxxx.pem)
・ssh -i "(キーペア)" (ユーザー名)@パブリックDNS名
標準ライブラリのインストール
# sudo yum install gcc-c++ glibc-headers openssl-devel readline libyaml-devel readline-devel zlib zlib-devel
MariaDB(データベース)のインストール
ひとまずRDSを使わずインスタンス内でMariaDBを使います
# sudo yum install mariadb mariadb-server
gitのインストール
後のgit cloneに必要なgitをインストールします。
# sudo yum install git
rbenvのインストール
rbenvとはRubyの開発バージョンを切り替えられるようにするものです。
# git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
# echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
# echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
# source .bash_profile
rbenvは5分〜10分時間がかかります。Installing ruby-2.7.1...のまま固まっているように見えますが、待ちましょう。
# mkdir -p "$(rbenv root)"/plugins
# git clone https://github.com/rbenv/ruby-build.git "$(rbenv root)"/plugins/ruby-build
# rbenv install 2.7.1
rbenvでRubyのバージョンを指定
# rbenv global 2.7.1
# ruby -v
ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux]
# gem install rails
# rails --version
Rails 6.0.3.3
使用データベースの設定、開始
使用データベースでMySQLを指定します。
# bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
# bundle install
bundlerでMySQLのインストールエラーが出るので、対処します。
An error occurred while installing mysql2 (0.5.3), and Bundler cannot
continue.
…
# bundle config --local build.mysql2 "--with-ldflags=-L/usr/local/opt/openssl/lib --with-cppflags=-I/usr/local/opt/openssl/include"
# sudo vi Gemfile
Gemfileの記述を一部コメントアウト。
# gem 'mysql2', '>= 0.4.4'
改めてbundle install
※Installing sassc 2.4.0 with native extensionsが長いです。
# bundle install
MySQL 0.5.3をgemでインストール。
# gem install mysql2 -v '0.5.3'
ssl関係のライブラリが見つからないとエラーが出ます。
ERROR: Error installing mysql2:
ERROR: Failed to build gem native extension.
…
mysql-develをインストール
# sudo yum install mysql-devel
リトライ
# gem install mysql2 -v '0.5.3'
MariaDBの開始
# sudo systemctl start mariadb
DBの作成
作成されたディレクトリで、下記コマンドを実行
# rails db:create
gemのLoadErrorが出るので対処
Gem::LoadError: mysql2 is not part of the bundle. Add it to your Gemfile.
Gemfileに以下の1行を追加
# sudo vi Gemfile
gem 'mysql2'
リトライ
# rails db:create
Created database 'appname_development'
Created database 'appname_test'
# rails s --port=80 -b 0.0.0.0
webpackerのエラーが出るので、対処
/home/ec2-user/.rbenv/versions/2.7.1/lib/ruby/gems/2.7.0/gems/webpacker-4.3.0/lib/webpacker/configuration.rb:95:in `rescue in load': Webpacker configuration file not found /home/ec2-user/appname/config/webpacker.yml.
webpackerのインストールにはNode.jsが必要
# rails webpacker:install
sh: node: コマンドが見つかりません
sh: nodejs: コマンドが見つかりません
Node.js not installed. Please download and install Node.js https://nodejs.org/en/download/
Node.jsのインストール
# curl -sL https://rpm.nodesource.com/setup_12.x | sudo bash -
# sudo yum install nodejs
リトライするとYarnが入っていないと言われる
# rails webpacker:install
Yarn not installed. Please download and install Yarn from https://yarnpkg.com/lang/en/docs/install/
Yarnをインストール
# curl -sL https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
# sudo yum install yarn
改めてwebpackerのインストール
# rails webpacker:install
クラッカーとケーキの絵が出たら完了です!
改めてRailsサーバーの開始
# sudo rails s --port=80 -b 0.0.0.0
何故かsudo でrails sできません(PATHが通っていない)
sudo: rails: コマンドが見つかりません
sudo のPATHを通す
# sudo visudo
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin
↓
Defaults secure_path = /sbin:/bin:/usr/sbin:/usr/bin:/usr/local/rbenv/bin:/usr/local/rbenv/shims
改めてRailsサーバーの開始
# sudo rails s --port=80 -b 0.0.0.0
Railsのスタートページが開けることを確認する
インスタンスのパブリックIP(デフォルトでport 80番)にアクセスすると、Railsのスタートページが表示されるはずです。
http://(インスタンスのパブリックIP)
マシンイメージ(AMI)の取得
せっかく構築したので、今の状態を保存しておきます。AMI化しておけば、同じ環境のインスタンスを瞬時に起動できます(起動直後は各プロセスが上がっていないことに注意)
toshioshimo.hatenablog.com
toshioshimo.hatenablog.com
障害、エラー対応のみで一日が終わるよりも、アプリを作りながらインフラを覚えた方がクリエイティブでモチベーションも上がりますね。成果物ベースで逆算して勉強する方が性に合っています。大変のびのびと業務ができる今の環境に感謝です。
作り逃げを許すな。
作成した履歴は残して他のエンジニアに展開、運用担当者に引き継ぎましょう。
何も引き継ぎ資料を作らず、サポートもせず、「作ったら終わり」「あとはよろしく」は後任の工数を奪っています。いくらスキルが高いエンジニアでもどうかと思います。
構築をAnsible/Terraform等で自動化する際も必須です。
xtech.nikkei.com
今後の展望
複業の方でフロントエンド側を触っているので、その辺りも役立ちました。イベント用のデジタルスタンプラリーのサービスを企画しようと思います。