個人アプリ開発 RSpec 単体テスト

作業内容

gemのRSpecを使用し、単体テストを行いました。
手順を自分なりにまとめながら進めました。


今回はユーザー登録の際のテストを記述しましたが、
これだけでは少なすぎるので、今後もう少し増やしていきたいと思います。
現場でテストは必須ですし、DevOps系の技術を学ぶ際にも重要だと思うので、記述量を増やしつつ理解を深めていきます。

gem インストール
group :development, :test do
 ーーー省略ーーー
  gem 'rspec-rails'
end

group :development do
  gem 'web-console'
end

→bundle install

RSpecの設定
$ rails g rspec:install
#RSpec用設定ファイルの作成
specファイルの作成

→テストを実行(中身が空のコード)

[spec/models/user_spec.rb]
require 'rails_helper'
describe User do
  describe '#create' do
    it "nicknameがない場合は登録できないこと" do
    end
  end
end

describe:
直後のdo ~ endまでのテストのまとまりを作り、””の中に説明を入れる

itとexample:
実際に動作するテストコードのまとまり。""の中にはそのexampleの説明を書く。

エクスペクテーション:
実際に評価される式。it do ~ endの間に書く。
→文法は”expect(X).to eq Y”

マッチャ:
エクスペクテーションの中で、テストが成功する条件。
eqは「等しければ」という意味。
他にもinclude(含んでいれば)、valid(バリデーションされれば)などがある。

$ bundle exec rspec

=>

User
  #create
    nicknameがない場合は登録できないこと

Finished in 0.1379 seconds (files took 3.28 seconds to load)
1 example, 0 failures

現在はまだテストとして評価される式を書いていないので、テストは無条件でパス。

実際に記述していく。
ユーザー名がない場合

require 'rails_helper'
describe User do
  describe '#create' do
    it "nameがない場合は登録できないこと" do
      user = User.new(name: nil, email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000")
      user.valid?
      expect(user.errors[:name]).to include("を入力してください")
    end
end
factory_botを導入

factory_bot
ダミーのインスタンスを作成することができるGem。exampleの記述を減らし効率化する。

1.gem install

2.specディレクトリ直下に「factories」というディレクトリを追加し、その中に「users.rb」という名前でファイルを作成

3.users.rbの編集

FactoryBot.define do
  factory :user do
    name                  {"teramoto"}
    email                 {"kkk@gmail.com"}
    password              {"00000000"}
    password_confirmation {"00000000"}
  end
end

★buildメソッド

#factory_botを利用しない場合
user = User.new(name: "abe", email: "kkk@gmail.com", password: "00000000", password_confirmation: "00000000")

#factory_botを利用する場合
user = FactoryBot.build(:user)

★createメソッド

#createしたインスタンスはDBに保存される
user = FactoryBot.create(:user)

※1回のテストが実行され、終了する毎にテスト用のDBの内容がロールバックされる。(保存された値がすべて消去されてしまう)
従って、binding.pry等でテストの実行を一時停止しないとテスト用のDBに保存された値をSequel Pro等で確認することはできない。

factory_botの記法の省略
rails_helper.rb

#省略
RSpec.configure do |config|
  #下記の記述を追加
  config.include FactoryBot::Syntax::Methods

  #省略

end

省略を用いて、記述の変更

it "nameがない場合は登録できないこと" do
    user = build(:user, name: nil)
    user.valid?
    expect(user.errors[:name]).to include("can't be blank")
  end
テストコードを書く際の原則

①各exampleで期待する値は1つ
②期待する結果をはっきりわかりやすく記述
③起きて欲しいことと起きてほしくないこと両方をテストする
④境界値をテストする
⑤可読性を考えつつ、適度にDRYにする



上記を基にユーザー登録時のテストを書いていきました。

個人アプリ開発 AWS S3


本日も引き続きAWSの作業。自分なりにまとめながら進めていきました。
S3を導入しました。

セキュリティ対策

AWSは従量制のサービスのため、他人がなりすましでログインして膨大な処理を行うと、それに対する支払いが発生する。

セキュリティ対策① 二段階認証

二段階認証:
あるサービスにログインする際に、通常パスワードに加えて、別の方法でも認証されないとログインできないようにする仕組み

・アプリAuthyを使用し設定

セキュリティ対策② IAMユーザーの利用

IAMユーザー:
AWSのサービスの1つ。ルートユーザーとは別に、使用できる機能を制限したアカウントを作成することができる

→IAMユーザーにも二段階認証

セキュリティ対策③ git-secrets

アプリはGitHubのpublicリポジトリソースコードをアップロードしており、誤操作でパスワードをGitHubにpushしてしまうと誰でも見られる状態になってしまう。

git-secretsは、そのような誤操作を防いでくれるツール。pushしようとしたコードをチェックし、パスワードだと推定されるような文字列が含まれている場合は、そこで処理が中断される仕組み。

1.ローカルからS3にアップロード

S3で保存先を用意

バケット
S3で、実際にデータが格納される場所

画像のアップロード先をS3に変更

1.fog-awsをインストール
fog:
画像をアップロードする際、外部のストレージを選択しアップロードするのを補助してくれるGem

2.fogの設定
image_uploader.rbを編集

3.fogのアップロード先の設定
config/initializers/carrierwave.rbファイルの作成・編集

4.安全にAWSのキーを扱えるよう設定
環境変数を設定
secrets.ymlの設定
→credentials(Rails5.2以降)

躓き

本番環境で画像がUPされない現象が起こりました。

1.星形のイメージ図が表示されない
→パスの参照をasseteからpublic/asseteに変更できていませんでした。

2.投稿画像が表示されない
capistrano導入前の投稿についてはパスの参照変更が適用されなかった(多分)
→新たに投稿した画像はちゃんと見れることが確認できました。


本番環境の不具合は肝が冷えます笑
ただこの一週間AWSと格闘して、やるほど理解は進んでいく気がしています。
自分なりにPDCAを回し、初期より対策ができるようになってきました。

・不具合確認→
・開発環境で同様の現象は起きていないか→
・サーバ・DB再起動→
・ログの確認→
・不明であれば検索し、仮説を立てる→
・仮説を潰していく

以降、引き続き作業を行いたいと思います。
日々精進していきます。

個人アプリ開発 AWS 自動デプロイ

今日は自動デプロイをする為に、capistranoを導入していきました。
ただ作業するだけでなく、自分なりに手順をまとめながら進めました。

Capistranoの導入準備

Gemをインストール
[Gemfile]
group :development, :test do
  gem 'capistrano'
  gem 'capistrano-rbenv'
  gem 'capistrano-bundler'
  gem 'capistrano-rails'
  gem 'capistrano3-unicorn'
end

→bundle install

ファイルの生成

bundle exec cap install
Capfileを編集
require "capistrano/setup"
require "capistrano/deploy"
require 'capistrano/rbenv'
require 'capistrano/bundler'
require 'capistrano/rails/assets'
require 'capistrano/rails/migrations'
require 'capistrano3/unicorn'

Dir.glob("lib/capistrano/tasks/*.rake").each { |r| import r }
デプロイについての設定ファイルを編集

cap installコマンド
→config/deploy配下にproduction.rbとstaging.rbの2種類のファイルを生成

[config/deploy/production.rb]
server '<用意したElastic IP>', user: 'ec2-user', roles: %w{app db web}
[config/deploy.rb]
# config valid only for current version of Capistrano
# capistranoのバージョンを記載。固定のバージョンを利用し続け、バージョン変更によるトラブルを防止する
lock '<Capistranoのバージョン>'

# Capistranoのログの表示に利用する
set :application, '<自身のアプリケーション名>'

# どのリポジトリからアプリをpullするかを指定する
set :repo_url,  'git@github.com:<Githubのユーザー名>/<レポジトリ名>.git'

# バージョンが変わっても共通で参照するディレクトリを指定
set :linked_dirs, fetch(:linked_dirs, []).push('log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system', 'public/uploads')

set :rbenv_type, :user
set :rbenv_ruby, '<このアプリで使用しているrubyのバージョン>' #カリキュラム通りに進めた場合、2.5.1か2.3.1です

# どの公開鍵を利用してデプロイするか
set :ssh_options, auth_methods: ['publickey'],
                  keys: ['<ローカルPCのEC2インスタンスのSSH鍵(pem)へのパス(例:~/.ssh/key_pem.pem)>'] 

# プロセス番号を記載したファイルの場所
set :unicorn_pid, -> { "#{shared_path}/tmp/pids/unicorn.pid" }

# Unicornの設定ファイルの場所
set :unicorn_config_path, -> { "#{current_path}/config/unicorn.rb" }
set :keep_releases, 5

# デプロイ処理が終わった後、Unicornを再起動するための記述
after 'deploy:publishing', 'deploy:restart'
namespace :deploy do
  task :restart do
    invoke 'unicorn:restart'
  end
end
[config/unicorn.rb]
# ../が一つ増えている
app_path = File.expand_path('../../../', __FILE__)

worker_processes 1
# currentを指定
working_directory "#{app_path}/current"

# それぞれ、sharedの中を参照するよう変更
listen "#{app_path}/shared/tmp/sockets/unicorn.sock"
pid "#{app_path}/shared/tmp/pids/unicorn.pid"
stderr_path "#{app_path}/shared/log/unicorn.stderr.log"
stdout_path "#{app_path}/shared/log/unicorn.stdout.log"
nginxの設定ファイル
[rails.conf]
upstream app_server {
  # sharedの中を参照するよう変更
  server unix:/var/www/<アプリケーション名>/shared/tmp/sockets/unicorn.sock;
}

server {
  listen 80;
  server_name <Elastic IPを記入>;

# クライアントからアップロードされてくるファイルの容量の上限を2ギガに設定。デフォルトは1メガなので大きめにしておく
  client_max_body_size 2g;

  # currentの中を参照するよう変更
  root /var/www/<アプリケーション名>/current/public;

  location ^~ /assets/ {
    gzip_static on;
    expires max;
    add_header Cache-Control public;
    # currentの中を参照するよう変更
    root   /var/www/<アプリケーション名>/current/public;
  }

  try_files $uri/index.html $uri @unicorn;

  location @unicorn {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://app_server;
  }

  error_page 500 502 503 504 /500.html;
}

Nginxの設定を変更したら、忘れずに再読込・再起動

[ec2-user@XXX]$ sudo service nginx reload
[ec2-user@XXX]$ sudo service nginx restart

MySQLを再起動

[ec2-user@XXX]$ sudo service mysqld restart

自動デプロイ

# アプリケーションのディレクトリで実行
$ bundle exec cap production deploy

躓き

デプロイ時エラー

上記実行したところ、エラーが発生。

00:00 git:check
      01 git ls-remote git@github.com:kogegoro0930/aquq-log.git HEAD
      01 ERROR: Repository not found.

→指定したリポジトリ名が違った。
▶︎修正したところ、うまくいきました。

画像が表示されなくなった

・config内ファイルの設定変更

config.public_file_server.enabled = ENV['RAILS_SERVE_STATIC_FILES'].present?
↓
config.public_file_server.enabled = true

→不可

▶︎capistranoを使用したことにより、画像を参照するパスが変わっているようなので、
S3を導入し画像をアップロードできるようにし、様子を見てみることにしました。


ちょっと今回は解決に時間をかけてしまいました。
よくエラー内容を確認すればすぐに分かったはずが、これまでのトリッキーなエラーに引っ張られ、複雑に考えてしまいました。

まずちゃんとエラー内容を把握してから仮説を立てることが大事だと再認識しました。(当たり前すぎますが、これも経験ですね・・・)

日々精進していきます。

個人アプリ開発 AWS Nginx導入・エラー解決

本番環境を確認。
ログイン時・未ログイン時で一通り操作を行い、出てきたエラーを解決していきました。

躓き1

ログアウト時のエラー

ログアウトしようとすると、下記エラーが出ました。
”The page you were looking for doesn't exist.
You may have mistyped the address or the page may have moved.”

他にも”いいね”しようとした時も同様のエラーが。

unicornを停止中にrake assets:precompile
→不可

・ログを確認すると、HTTPメソッド[Post][Delete]を[Get]で探しにいっている。
→エディタでビューを確認するが、ちゃんと指定はできている。

・さらに調べたところ、上記はjsでエラーがある場合に起こる不具合らしい
→consoleでjsを確認し、エラーを確認。よく確認すると、ローカルでもエラーが出ていました!
→不要な記述があった為削除し、ローカルで修正

・ローカルの修正をpushし、本番環境でgit pullするが、コンソールのエラーが消えず。
→アセットをプリコンパイルし、エラーの解消を確認できました!

[ec2-user@XXX <リポジトリ名>]$ bundle exec rake assets:precompile RAILS_ENV=production

▶︎動作確認。ログアウト、いいね機能なども問題なし。

Nginxの導入と設定

Webサーバの役割:
1.静的なコンテンツをレスポンスとしてクライアントに返す処理
2.動的なコンテンツ生成をアプリケーション本体に依頼する処理
3.アプリケーションサーバから返ってくる処理結果をレスポンスとしてクライアントに返す処理

アプリケーションサーバ
動的なコンテンツを生成し、処理結果をWebサーバに返すという役割を果たす

Nginxをインストール
[ec2-user@XXX]$ sudo yum -y install nginx
Nginxの設定ファイルを編集

下記手順で設定

1. rails.confファイルをvimで開く

[ec2-user@XXX]$ sudo vim /etc/nginx/conf.d/rails.conf

2. VimでNginxの設定を編集

3. nginxの権限を変更
POSTメソッドでもエラーが出ないようにするために、下記のコマンドも実行

[ec2-user@XXX]$ cd /var/lib
[ec2-user@XXX]$ sudo chmod -R 775 nginx  

4. Nginxを再起動して設定ファイルを再読み込み

[ec2-user@XXX]$ cd ~
[ec2-user@XXX]$ sudo service nginx restart
unicorn.rbを修正

1. ローカルでunicorn.rb修正

# 修正前
listen 3000

# 修正後
listen "#{app_path}/tmp/sockets/unicorn.sock"

2. ローカルで編集したファイルをリモートへpush

3. ローカルの変更点を本番環境へ反映

4. Unicornを再起動

躓き2

エラー
”このサイトにアクセスできません”
→Elastic IPの後に:3000をつけていた


下記が表示される
”Welcome to nginx on the Amazon Linux AMI!”
→nginxの設定の記載ミス。タイプミスがあった。


デプロイ時のエラー解決は仮説を立てづらく、本当に苦戦しました。
ただここまで来て諦めたくなかったし、絶対なんとかできるはず!と思ってたくさん検索してなんとかデプロイまで漕ぎつけました。
苦労した分、1人で解決できて自信になりました。
日々精進していきます。

個人アプリ開発 AWSデプロイでハマった


前回の記事で一通りデプロイ作業を行いましたが、結果本番環境で表示を確認することができませんでした。
今日はエラーログを辿り、一つ一つ解決していきました。

躓き

1.Railsが起動できない。

EC2のアプリのディレクトリで下記コマンドを実行するとエラーが出ました
bundle exec unicorn_rails -c config/unicorn.rb -E production -D


・手順を見返し、漏れがないか確認
→問題無し

・ローカルのmasterのpush、EC2側でpullがちゃんとできているか確認
→問題無し

・EC2インスタンスの再起動
→問題無し

デバッグし確認
EC2サーバ側で、/var/www/<リポジトリ名>/log/unicorn.stderr.logをlessコマンドで確認
→エラーが出ていたが、内容が分からない
”bundler: failed to load command: unicorn_rails (/home/ec2-user/.rbenv/versions/2.5.1/bin/unicorn_rails)
ArgumentError: Unknown key: :throgh. Valid keys ….”

・ひたすらググる
→stack overflowで同じエラーをリレーションの改善で解決した例を発見。
自分のコードを見返してみる

▶︎不要なモデルがあり、また、そのリレーションをしっかり記述できていなかったことが原因だった。
モデルを削除し、関連するリレーションの記述も削除することで、Railsの起動ができた。

2.本番環境のURLを叩くとページが表示されない

下記エラーが出て表示がされませんでした。
We're sorry, but something went wrong.

・エラーログを確認

$ cd /var/www/app-name
$ cd log
$ cat production.log

するといくつかのエラーが確認できた

ActionView::Template::Error

調べたところ、開発環境と本番環境でimagesディレクトリへのパスが異なるために起きたエラーだった。

アセットコンパイル前(開発環境)
app/assets/images

アセットコンパイル後(本番環境)
public/assets/images

・下記のようにパスの指定方法を変更

image_tag asset_path('ファイル名')

上記を試したが、ログのエラーが消えず、サイトを見れない
▶︎unicornを再起動できていなかった。

これでやっとサイトを見れるようになりました。

3.一部の表示がおかしい

TOPページの一部、faviconの表示がされない。

・ログを確認すると、下記エラーが。
Uglifier::Error: Unexpected token: name (w). To use ES6 syntax, harmony mode must be enabled with Uglifier.new(:harmony => true).

「ES6を使うにはUglifier.new(:harmony => true)でharmony modeを有効にしてね」とのこと

→調べたところ、UglifierはJavaScriptの圧縮をしてくれるgem。ただES5までしか対応していなかった。

▶︎本番環境の設定ファイルを編集

[config/environments/production.rb]
# config.assets.js_compressor = :uglifier  →コメントアウト

▶︎再度アセットファイルをコンパイルUnicornRailsの再起動
問題なく表示がされるようになった。
エラーでアセットファイルのコンパイルが正しく完了していなかったことが原因だったようです。

感想

デプロイはまだ不慣れだったことや、工程が長かったこと、あともし解決できなかったら、これまでの努力が水の泡になってしまうのではないかという不安で、めちゃくちゃ焦りました。

ただ試行錯誤したことで、サーバサイドの理解が深まったと思います。
ひとまずデプロイができて安心しました。
まだまだ一喜一憂ありますが、日々精進していきます。

コマンドまとめ

# EC2ログイン 

cd .ssh/
ssh -i aqua-log.pem ec2-user@54.249.237.209
cd /var/www/
cd /var/www/aquq-log/

# ログ確認
cd log
cat production.log
cat log/production.log

# Git pull
git pull origin master

# Mysql再起動
$ sudo service mysqld stop
$ sudo service mysqld start

# Nginx再起動
$ sudo service nginx restart

# Unicorn再起動
# プロセスを確認
[ec2-user@XXX <リポジトリ名>]$ ps aux | grep unicorn
# 「unicorn_rails master」と表示されているプロセスがUnicornのプロセス本体

# killコマンドを入力してUnicornのプロセスを停止
[ec2-user@XXX <リポジトリ名>]$ kill <確認したunicorn rails masterのPID>

[ec2-user@XXX <リポジトリ名>]$ RAILS_SERVE_STATIC_FILES=1 unicorn_rails -c config/unicorn.rb -E production -D

個人アプリ開発 AWSデプロイ

作業内容

既にTECH CAMPのカリキュラムでASWのアカウントを作成し、アプリのデプロイをしていました。
今回は復習も兼ねて、一つ一つの手順を自分なりにまとめながら、新たにアカウントを作成しデプロイを行いました。

1.AWSアカウント作成

新しいメールアドレスで新規アカウントを作成。

2.EC2 サーバのセットアップ

EC2:
時間単位で利用できるサーバ。設定によりターミナルを介して遠隔操作できる。

リージョンの設定

AWSの物理的なサーバの場所を指定する。
リージョンは世界各地に10箇所以上存在。
リージョン間でEC2の設定は独立していて、あるリージョンのEC2を他のリージョンへ移動することはできない為、EC2を立ち上げる際には、「どのリージョンの設定か」を意識するようにする。

EC2インスタンスの作成

EC2インスタンス
AWSで仮想的に一つのLinuxサーバを利用できる仕組み

AMIの選択

AMI:
Amazon Machine Image」の略語で、サーバのデータをまるごと保存したデータのこと。この中には、OSやWEBサーバなどが事前にインストールされているものもあり、自分でゼロからインストールする手間を削減することができる。
→今回は「 Amazon Linux AMI 」AWSが独自にカスタマイズしたAMIを利用。

Elastic IPの作成と紐付け

作成したEC2インスタンスには、作成時にIPアドレス(パブリックIP)が自動で割り振られている。
しかし、サーバーを再起動させるたびにこのパブリックIPが変わってしまうという欠点がある。

Elastic IP:
AWSから割り振られた固定のパブリックIPアドレス
これをEC2インスタンスに紐付けることで、インスタンスの起動、停止に関わらず常に同じIPアドレスで通信をすることが可能になる。

ポートを開く

立ち上げたばかりのEC2インスタンスSSHでアクセスすることはできるが、HTTPなどの他の接続は一切つながらないようになっている。そのため、WEBサーバとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要がある。

セキュリティグループの変更
セキュリティグループ:
EC2インスタンスが属するまとまりのようなもので、複数のEC2インスタンスのネットワーク設定を一括で行うためのもの。

アクセス制限(ルール)の追加
→タイプを「HTTP」、プロトコルを「TCP」、ポート範囲を「80」、送信元を「カスタム / 0.0.0.0/0, ::/0」に設定

EC2インスタンスへのログイン

ec2-userでログイン
ec2-user:
EC2インスタンスを作成時に生成され、一緒に生成されるSSH秘密鍵と対応したユーザー。本来はこのec2-userではなく、サービスを稼働させるためにより権限を小さくしたユーザーを作成して運用していくが、今回は簡易化の為こちらを使用し進めていきました。

$ cd ~

$ mkdir ~/.ssh
# .sshというディレクトリを作成
# File existsとエラーが表示された場合、.sshディレクトリは存在しているということ

$ mv Downloads/ダウンロードした鍵の名前.pem .ssh/
# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。

$ cd .ssh/

$ ls
# pemファイルが存在するか確認

$ chmod 600 ダウンロードした鍵の名前.pem

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#(ダウンロードした鍵を用いて、ec2-userとしてログイン)

3.EC2のRuby/Rails環境構築

設定用のツールをインストール

yumコマンド:
Linuxにおけるソフトウェア管理の仕組み。MacOSにとってのhomebrewと同じ役割を果たす。

パッケージをアップデート

$ sudo yum -y update

その他環境構築に必要なパッケージを諸々インストール

$ sudo yum -y install git make gcc-c++ patch libyaml-devel libffi-devel libicu-devel zlib-devel readline-devel libxml2-devel libxslt-devel ImageMagick ImageMagick-devel openssl-devel libcurl libcurl-devel curl
  • yコマンド:

オプションで-yを設定する事で全ての問いにYesで自動的に答えるように設定してインストールするコマンド

Node.jsをインストール

Node.js;
サーバーサイドで動くJavaScriptのパッケージです。今後のデプロイに向けた作業の中で、CSSや画像を圧縮する際に活用される。

$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum -y install nodejs
rbenvとruby-buildをインストール

rbenvとruby-build:
Rubyのバージョンを管理する際に組み合わせて使うツール

#rbenvのインストール
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
#パスを通す
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
#rbenvを呼び出すための記述
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_profileの読み込み
$ source .bash_profile
#ruby-buildのインストール
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#rehashを行う
$ rbenv rehash  
Rubyをインストール
$ rbenv install 2.5.1  #インストール
$ rbenv global 2.5.1  #バージョン指定
$ rbenv rehash  #rehashを行う
$ ruby -v  # バージョンを確認

アプリと同じRubyのバージョン(2.5.1)をインストール

4.MySQLの設定と動作確認

MySQL
Oracle社が開発・提供をしているRDBMS
扱いのシンプルさと処理の速度を考慮し使用しました。

MySQLをインストール
$ sudo yum -y install mysql56-server mysql56-devel mysql56

MySQLのバージョン5.6をインストール

MySQLを起動
$ sudo service mysqld start

service コマンド:
Amazon LinuxCentOSに含まれているもので、インストールしたソフトウェアの起動を一括して行えるツール

mysqld:
「d」はLinuxの用語で「サーバ」を意味する「デーモン(daemon)」の頭文字

$ sudo service mysqld status

起動できたか確認

MySQLのrootパスワードの設定
sudo /usr/libexec/mysql56/mysqladmin -u root password 'ここを設定したいパスワードに変更してからコマンドを実行'

yum でインストールしたMySQLには、デフォルトで root というユーザーでアクセス出来るようになっているが、パスワードは設定されていない

MySQLへの接続確認
$ mysql -u root -p

5.EC2のサーバにChatSpaceのコードをクローンする準備

GithubSSH鍵を登録

1.EC2サーバのSSH鍵ペアを作成
2.Githubにアクセスして登録
3.SSH接続を確認

6.アプリケーションサーバの設定

Unicorn
アプリケーションサーバ。ローカル環境のpumaにあたる。

ローカルでGemfile を編集
[Gemfile]
group :production do
  gem 'unicorn', '5.4.1'
end
$ bundle install
config/unicorn.rbを作成・編集

→変更修正をコミットしてプッシュ(masterブランチ)

Githubからコードをクローン

1. /var/wwwディレクトリを作成し、権限をec2-userに変更

#mkdirコマンドで新たにディレクトリを作成
$ sudo mkdir /var/www/
#作成したwwwディレクトリの権限をec2-userに変更
$ sudo chown ec2-user /var/www/

2. Githubから「リポジトリURL」を取得

$ cd /var/www/
$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git

7.本番環境での設定

EC2の能力を拡張

現状動かしているEC2のインスタンスではコンピューターの能力が足りず、Gemのインストール時などにエラーが発生する可能性がある(コンピューターの処理能力に関係するメモリというものが足りない)。

#ホームディレクトリに移動
$ cd

$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512

$ sudo chmod 600 /swapfile1

$ sudo mkswap /swapfile1

$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

これで、Swap領域を確保することができました。

gemをインストール

クローンしたアプリケーションを起動するために必要なgemを以下のコマンドでインストール

1. クローンしたディレクトリに移動し、 rbenvでインストールされたRubyが使われているかチェック

2.本番環境でgemを管理するためのbundlerをインストールして、bundle installを実行
開発環境(ローカル)で開発してきたアプリで、どのバージョンのbundlerが使われていたのか確認
→同じバージョンのものをEC2サーバ側にも導入

環境変数の設定

環境変数
データベースのパスワードなどセキュリティのためにGithubにアップロードすることができない情報は、環境変数を利用して設定
Railsからは ENV['<環境変数名>'] という記述でその値を利用することができる

secret_key_base:
Cookieの暗号化に用いられる文字列。Railsアプリケーションを動作させる際は必ず用意する必要がある。また、外部に漏らしてはいけない値であるため、こちらも環境変数から参照する。

1. secret_key_baseを作成
2.環境変数を設定
3. 設定した環境変数を反映させるために、一度本番環境をログアウト
4. もう一度本番環境へログイン
5. 設定した環境変数が本当に適用されているか確認

ポートを解放

セキュリティグループのポートを設定
→起動したRailsにアクセスできるようになる

8.Railsを起動

1.database.ymlの本番環境の設定を編集
2.ローカルでの編集をコミットして、GitHubにプッシュ
3.データベースを作成しマイグレーションを実行し直す
4.Railsを起動

9.アセットファイルをコンパイル

個人アプリ開発 かんたんログイン機能

作業内容

f:id:kobegoro:20200829193421p:plain

いろいろ調べてみると複数実装方法がありました。

1.htmlに隠しパラメータで忍ばせる
2.サーバ側で処理する

今回はビューに追記するだけで作成できる1.の方法で実装しました。

テストユーザーを新規作成

name:テストユーザー
email:test@example.com
password:password

ビューの編集
= form_for(User.new, url:user_session_path) do |f|
        = f.hidden_field :email, value: "test@example.com"
        = f.hidden_field :password, value: "password"
        = f.submit "かんたんログイン", class:"btn btn-lg center-block btn-success"

hidden_fieldで[params]をuser_session_path(sessions#create)に送信