Rails6の開発環境をAWS上に自動構築する①

Rails6の開発環境をAWS上に自動構築する①

前回、Rails6の開発環境をまとめたので、これを自動構築に応用してみます。

toshioshimo.hatenablog.com

f:id:TOSHIOSHIMO:20191215222807p:plain

なぜやるのか

環境構築の作業は、毎回同じ作業なので無駄です。いくら手順をまとめておいても手作業だとミスは起きますし(人間だもの)時間が勿体ないです。

3年前とまだ注目されていなかった時にAnsibleを使った経験があるのも理由です。広島には某メーカー系SIerのインフラ開発拠点が某新都心にあります。もう役に立たないかと思っていましたが分からないものです。

自動構築できれば、Railsのプログラミング教育環境を受講生分すぐに用意できそうでそれにも期待。

どうやるのか

構成管理ツールのAnsibleを使います。

インスタンス側にエージェントを入れなくてもSSH接続さえできればOK

・同じクラウド内、オンプレからクラウドへ自動構築、もちろん逆も可能。

・各種コマンドの発行やAnsibleサーバー側にあるファイルのコピー等色々できる

docs.ansible.com

 

AnsibleサーバーをEC2で起動して、inventory fileでホストを定義し、playbookと呼ばれるコードを実行します。/etc配下に設置される各種設定ファイルは、修正後のものを予めAnsible側に用意しておいて、コマンド発行時にコピーすることで解決できます。Ansible側のコマンドの引数を埋め込んだりもできた気がします。

本当はPrivate Subnetに置いた方が良いと思いますが、今回はお試しでPublic Subnetでやってみます。サーバーはAnsible専用としなくてもOKなので、インフラの構成管理ツールTerraformと同居させるのもいいかもしれません。

f:id:TOSHIOSHIMO:20201005214052p:plain

最近のエンジニア求人で良く見かけるホットなキーワードですが、結局スクリプトなのでトライアンドエラーで文法を覚えるしかないと思います。もちろん検証環境ですが、数えられないほど試行しミスをしました(そして記録しました)現場にいたときは、最終的に画面のボタン一発でOpenStackのインスタンスが自動構築できるよう画面設計もしたのですが、結構楽しかった覚えがあります。

やってみないと分からない

ミスが無いに越したことは無いですが、例えミスしてもドンマイ的な環境でないと、エンジニアはのびのび仕事できないと思います。誰もミスしようと思ってオペレーションしてないですからね。大手キャリアやSIerのデータセンターのレベルでも人為的ミスは起きます。報告書等は書く必要はありますが、個人が責め立てられることは一切無く淡々と建設的な対策をとっていくだけです。ミスの発生は将来のもっと大きなミスの予防に繋がります。

 

 

AWS上にRails6の開発環境を構築する(2020年10月版)

AWS上にRailsの開発環境を構築する

AWSインスタンス上で、この手順でやれば間違いなくRails6が動くまでの手順をまとめました。時期が変われば方法も変わると思いますので、2020年10月版とします。参考にしたのは、記事末尾にある教本とWebの記事数々です。※Rails6環境で分かりやすい本が無かった

EC2インスタンスを作成する

・東京リージョン(ap-northeast1)、OSはAmazon Linux2

・t2.microまたはt3.micro(無料枠が残っていればt2、それ以降はt3の方が安い)

・ストレージ (EBS)は8GB SSDを割り当て

インスタンスに割り当てるSecurity Groupの設定で、ポート80番(HTTP)を許可

・自動割当パブリックIPは有効

・インターネット側からアクセスできるようインターネットゲートウェイの設置、VPCの設定

詳細は省略します。過去の記事はこちら。

toshioshimo.hatenablog.com

f:id:TOSHIOSHIMO:20201003105225p:plain

SSHで接続する

こちらも先程の過去記事に掲載しています。

・キーペアのダウンロード

・キーの権限変更 (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]

Railsのインストール

# 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サーバーの開始

# 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

f:id:TOSHIOSHIMO:20201003131202p:plain


クラッカーとケーキの絵が出たら完了です!

改めて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)

f:id:TOSHIOSHIMO:20201003133822p:plain

マシンイメージ(AMI)の取得

せっかく構築したので、今の状態を保存しておきます。AMI化しておけば、同じ環境のインスタンスを瞬時に起動できます(起動直後は各プロセスが上がっていないことに注意)

toshioshimo.hatenablog.com

toshioshimo.hatenablog.com

アプリ開発は楽しい!

障害、エラー対応のみで一日が終わるよりも、アプリを作りながらインフラを覚えた方がクリエイティブでモチベーションも上がりますね。成果物ベースで逆算して勉強する方が性に合っています。大変のびのびと業務ができる今の環境に感謝です。

作り逃げを許すな。

作成した履歴は残して他のエンジニアに展開、運用担当者に引き継ぎましょう。

何も引き継ぎ資料を作らず、サポートもせず、「作ったら終わり」「あとはよろしく」は後任の工数を奪っています。いくらスキルが高いエンジニアでもどうかと思います。

構築をAnsible/Terraform等で自動化する際も必須です。

xtech.nikkei.com

今後の展望

複業の方でフロントエンド側を触っているので、その辺りも役立ちました。イベント用のデジタルスタンプラリーのサービスを企画しようと思います。

 

 

講義環境にAWSを活用する④

講義環境にAWSを活用する④

今回は、講義環境に作成したEC2インスタンスのマシンイメージ(バックアップ)を取得し、それから起動してみます。

AMIを作成する

ダッシュボードから、EC2をクリックします。

f:id:TOSHIOSHIMO:20200911194958p:plain

インスタンスをクリックします。

f:id:TOSHIOSHIMO:20200911195002p:plain

マシンイメージを作成するインスタンスを右クリックし、イメージ→イメージの作成をクリックします。

f:id:TOSHIOSHIMO:20200911195014p:plain

イメージの作成画面で、イメージ名とイメージの説明を入力します。いづれも2バイト文字は使えないので注意が必要です。右下のイメージをクリックします。

f:id:TOSHIOSHIMO:20200911200752p:plain

以下の画面が表示されたら、閉じるをクリックします。

f:id:TOSHIOSHIMO:20200911195024p:plain

ダッシュボードに戻ってAMIを見ると、AMIが作成中であることが分かります。

f:id:TOSHIOSHIMO:20200911195030p:plain

AMIからEC2インスタンスを起動する

先程作成したAMIを選択し、起動ボタンをクリックします。

f:id:TOSHIOSHIMO:20200911201153p:plain

インスタンスタイプでは、t2.microを選択して、インスタンスの詳細の設定をクリックします。

f:id:TOSHIOSHIMO:20200911195019p:plain

インスタンスの詳細の設定で、VPCとサブネットを選択します。マシンイメージ取得対象と同じで大丈夫です。右下の確認と作成をクリックします。

f:id:TOSHIOSHIMO:20200911195029p:plain

f:id:TOSHIOSHIMO:20200911195039p:plain

新しいキーペアを作成し、インスタンスの作成をクリックします。

f:id:TOSHIOSHIMO:20200911195048p:plain

インスタンス作成中の表示がされます。右下のインスタンスの表示をクリックします。

f:id:TOSHIOSHIMO:20200911195011p:plain

インスタンスのステータスがpending→availableに変わったら完了です。

f:id:TOSHIOSHIMO:20200911195004p:plain

f:id:TOSHIOSHIMO:20200911201019p:plain

インスタンスの名前が空白なので変更しておきます。Nameの欄をクリックすると編集できます。

f:id:TOSHIOSHIMO:20200911195020p:plain

f:id:TOSHIOSHIMO:20200911195025p:plain

Elastic IPの取得と紐付け

Elastic IPを取得し、作成したインスタンスに紐付けます。

その後、以下のURLでアクセスしてみます。

https://(割り当てたElastic IP)/wp-login.php

アクセスできない原因

ブラウザからの応答が無いはずです。この場合、真っ先に疑うのはポート関連、AWSで言うセキュリティグループです。

インスタンスのシステムログを取得してみると、port 80(http)でConnection timed outが発生しています。80番ポートにアクセスできていません。

f:id:TOSHIOSHIMO:20200911195159p:plain

作成したインスタンスのセキュリティグループを見ると、80番ポートが空いていないのが分かります。

インバウンドルール

f:id:TOSHIOSHIMO:20200911195729p:plain

アウトバウンドルール

f:id:TOSHIOSHIMO:20200911195732p:plain

セキュリティグループを変更する

インスタンスを右クリックし、ネットワーキング→セキュリティグループの変更をクリックします。

f:id:TOSHIOSHIMO:20200911195735p:plain

セキュリティグループの変更画面で、現在のセキュリティグループから外し、他のインスタンスと同じものを割り当てます。

f:id:TOSHIOSHIMO:20200911195741p:plain

EC2ダッシュボードでセキュリティグループを確認すると、インバウンドルール、アウトバウンドルールで80番ポートが開放されたことが分かります。

f:id:TOSHIOSHIMO:20200911202341p:plain

f:id:TOSHIOSHIMO:20200911202341p:plain

もう一度、以下のURLでアクセスしてみます。

https://(割り当てたElastic IP)/wp-login.php

f:id:TOSHIOSHIMO:20200911195746p:plain

 無事、バックアップ対象と同じインスタンスが作成できました。一度AMIを作成してしまえば、この手順で複製できます。

バックアップが取得できることが確認できた

以上で、バックアップが取得できることが確認できました。AMIでバックアップすれば実体はS3に保存されるので、非常に低コストでバックアップができます。次回は、インスタンスの停止を行います。

最新版 はじめて講師を頼まれたら読む本
 

 

講義環境にAWSを活用する③

講義環境にAWSを活用する③

f:id:TOSHIOSHIMO:20200907195439p:plain前回までで作成したEC2インスタンスに以下のURLでアクセスでき、ログイン画面が表示されるはずです。

https://(割り当てたElastic IP)/wp-login.php

 

f:id:TOSHIOSHIMO:20200908192221p:plain

ログインIDとの取得

前々回書きましたが、忘れやすいので復習です。作成したインスタンスを右クリック、インスタンスの設定からシステムログの取得をクリックします。

f:id:TOSHIOSHIMO:20200907201523p:plain

システムログからWordpressのログイン情報を確認します。

ユーザー名はデフォルトで"user"、パスワードはマスクしている部分です。

f:id:TOSHIOSHIMO:20200907201735p:plain

WordPressの初期設定を行う

WordPressダッシュボードが開きます。まず、更新からWordPressのバージョンを最新にしておきます。

f:id:TOSHIOSHIMO:20200910184725p:plain

設定メニューから一般をクリックします。

f:id:TOSHIOSHIMO:20200910184850p:plain

ここで最低限実施しておくのは、サイトの言語:日本、タイムゾーン:東京の設定です。

f:id:TOSHIOSHIMO:20200910185031p:plain

固定ページの作成から、新規作成をクリックし、トップページという名前で新規に固定ページを作成します(名前は何でも良いのですが)

WordPressは元々ブログサイトを作成するためのCMSなので、この作業が必要になります。

f:id:TOSHIOSHIMO:20200910185144p:plain

設定メニューから、表示設定をクリックします。

f:id:TOSHIOSHIMO:20200910185251p:plain

ホームページの表示の項目から、固定ページを選択、ホームページに先程作成した「トップページ」を選択し、保存します。

f:id:TOSHIOSHIMO:20200910185332p:plain

左上の家のアイコンから、サイトを表示をクリックします。

f:id:TOSHIOSHIMO:20200910185436p:plain

内容を確認してみる

トップページの内容が、
https://(割り当てたElastic IP)/

のURLで表示されるはずです(画像は講義の中で説明用に使ったもの)

f:id:TOSHIOSHIMO:20200910185558p:plain

 

一時的にWordPressの学習で使える環境ができました。ただ、従量課金のためずっとEC2インスタンスを稼働させておくわけにはいきませんよね。次回はスナップショットの取得、AMIにイメージをバックアップ、EC2インスタンスの停止を行う作業を行います。

 

 

講義環境にAWSを活用する②

講義環境にAWSを活用する②

昨日に続いて、EC2インスタンスにグローバル固定IPアドレスを付与して、外部からアクセスできるようにします。

f:id:TOSHIOSHIMO:20200907195439p:plain

aws.amazon.com

Elastic IPを確保する

サービスから、EC2を選択します。

f:id:TOSHIOSHIMO:20200907195708p:plain

ネットワーク&セキュリティより、Elastic IPをクリックします。

f:id:TOSHIOSHIMO:20200908190939p:plain

Elastic IPアドレスの割り当てをクリックします。

 

f:id:TOSHIOSHIMO:20200908191009p:plain

AmazonIPv4 アドレスプールが選択された状態で、割り当てをクリックします。

f:id:TOSHIOSHIMO:20200908191049p:plain

Elastic IPアドレスが正常に割り当てられました。

f:id:TOSHIOSHIMO:20200908191228p:plain

Elastic IPをインスタンスに関連付ける

一度Elastic IPの一覧に戻って、先程割り当てられたIPにチェックを入れ、アクションボタンより関連付けを行うをクリックします。

f:id:TOSHIOSHIMO:20200908191522p:plain

f:id:TOSHIOSHIMO:20200908191548p:plain

リソースタイプでインスタンスを選択し、昨日の記事で作成したインスタンスを選択します。

その後、右下の関連付けるをクリックします。

f:id:TOSHIOSHIMO:20200908191650p:plain

EC2ダッシュボードで該当のインスタンスを選択すると、IPv4パブリックIPとElastic IPに固定IPアドレスが割り当てられていることが確認できます(画像はマスクしています)

f:id:TOSHIOSHIMO:20200908191857p:plain

 

WordPressのログイン画面にアクセスしてみる

以下のURLでアクセスでき、ログイン画面が表示されるはずです。

https://(割り当てたElastic IP)/wp-login.php

f:id:TOSHIOSHIMO:20200908192221p:plain

次回は、WordPressを最低限使えるよう初期設定を行います。

まちのファンをつくる 自治体ウェブ発信テキスト

まちのファンをつくる 自治体ウェブ発信テキスト

  • 作者:狩野 哲也
  • 発売日: 2020/07/23
  • メディア: 単行本(ソフトカバー)
 

 

 

講義環境にAWSを活用する①

講義環境にAWSを活用する①

先日9月3日に、広島修道大学にてリモート講義を行いました。その際の講義環境としてAWSを活用しました。

講義の様子

f:id:TOSHIOSHIMO:20200907194347j:plain

f:id:TOSHIOSHIMO:20200907194342j:plain

何をやったのか

WordPressを使用したWeb制作についての講義で、学生に一時的に使ってもらうためのサーバーをAWSで用意しました。レンタルサーバーにフォルダ分けして構築するのも良いのですが、商用で稼働している、エキキタまちづくり会議公式Web (https://ekikita.jp) や自社Webと同じ環境に混ぜたくなかったことが大きな理由です。

どうやったのか

受講学生人数分のEC2インスタンスを、予めWordPressが入ったAMIで作成しました。そして、Elastic IPでグローバス固定IPアドレスを付与しました。あとは学生にログインアカウントとURLを教えて完了です。

f:id:TOSHIOSHIMO:20200907195439p:plain

aws.amazon.com

実際の操作

サービスから、EC2を選択します。

f:id:TOSHIOSHIMO:20200907195708p:plain

インスタンスを選択し、インスタンスの作成をクリックします。

f:id:TOSHIOSHIMO:20200907195756p:plain

AMIの選択で、"Wordpress"と入力し、AWS Marketplaceにあるイメージを選択します。

f:id:TOSHIOSHIMO:20200907195919p:plain

インスタンスタイプ別の料金等が表示されます。右下の"Continue"をクリックします。

f:id:TOSHIOSHIMO:20200907200028p:plain

料金などが表示されます。

※9/2に更新されているからか、t2.micro(無料枠)が使えなくなっているようです。

インスタンスタイプを選択し、インスタンスの詳細の設定ボタンをクリックします。

f:id:TOSHIOSHIMO:20200907201113p:plain

 

f:id:TOSHIOSHIMO:20200907201149p:plain

パブリックサブネットを選択して、確認と作成をクリックします。

f:id:TOSHIOSHIMO:20200907201309p:plain

f:id:TOSHIOSHIMO:20200907201336p:plain

インスタンス作成の確認画面で、起動をクリックします。

f:id:TOSHIOSHIMO:20200907201416p:plain

EC2ダッシュボードに戻り、作成したインスタンスを右クリック、インスタンスの設定からシステムログの取得をクリックします。

f:id:TOSHIOSHIMO:20200907201523p:plain

システムログからWordpressのログイン情報を確認します。

ユーザー名はデフォルトで"user"、パスワードはマスクしている部分です。

f:id:TOSHIOSHIMO:20200907201735p:plain

ここまでを振り返って

ここまで所要時間は数分と非常に簡単です。このままだとパブリック固定IPが付与されておらずアクセスURLが分かりにくいので、次回その辺りから載せます。