- 投稿日:2020-02-23T19:26:55+09:00
RailsをAWSでデプロイする
はじめに
手軽にRailsをAWSにデプロイする手順をまとめました。
極力シンプルになるように、EC2インスタンスを一つ作成し、その中に自分のRailsアプリを含め、必要なものを全てインストールしてデプロイします。
データベースはMySQL、WebサーバーはNginXでの環境構築です。
AWSのサーバーでのファイルの書き込みはviというコマンドで行います。(vi ファイル名でそのファイルを編集、そのファイルがない場合は新たにファイルを作って書き込みできます。詳しい使い方は要検索!)
注意点
コードの中で、/var/www/rails/{アプリ名}などと書いている時がありますが、自分の環境に合わせて、
/var/www/rails/sample_appとしてください
/var/www/rails/{sample_app}ではないのでご注意。
第一章 サーバーの準備
1.VPCを作成
- 名前は適当につける
- IPv4CIDERブロックは10.0.0.0/16に設定
- あとはデフォルトで
2.サブネットを作成
- 名前は適当につける
- VPCは先程作ったVPCを選択
- IPv4CIDERブロックは10.0.0.0/24に設定
3.インターネットゲートウェイを作成
- 名前は適当につける
- 作成後は先程作ったVPCをアタッチ
4.ルートテーブルを作成
- 名前は適当につける
- 作成後はルートの設定で0.0.0.0/0を追加し保存
- サブネットの関連付けで先程作ったサブネットを選択
- あとはデフォルトで
5.セキュリティグループを作成
- 名前は適当につける
- 作成後は
タイプ:HTTP ソース:任意の場所(他の設定はデフォルト)
と、
タイプ:SSH ソース:任意の場所(他の設定はデフォルト)
を追加し保存- あとはデフォルトで
6.EC2を作成
EC2インスタンスの作成
- 無料枠からAmazonLinuxを選ぶ(AmazonLinux2を選ばないように注意、この後の環境構築で差が出てきてしまうので)
- ネットワーク:先程作ったVPCを選択
- サブネット:先程作ったサブネットを選択
- 自動割り当てパブリックIP:有効化を選択
- セキュリティーグループ:先程作ったセキュリティグループを選択
キーペアの登録とElasticIPの割当て
- キーペアファイル(~.pem)はローカル(自分のパソコンのこと)の.ssh配下に移動
- ElasticIPを作り先ほど作ったEC2インスタンスに割り当てる
第二章 サーバーにログインし環境構築
1.EC2にログイン
キーペアファイルのあるディレクトリに移動
cd .sshキーペアファイルに権限を付与
chmod 600 {自分のキーペアの名前}.pemサーバー(EC2インスタンス)にログイン
ssh -i {自分のキーペアのpemファイル} ec2-user@{自分のElasticIPアドレス}ユーザーを作成
sudo adduser {新規ユーザー名} (#新規ユーザー名の登録) sudo passwd {パスワード} (#新規ユーザー名のパスワード登録) sudo visudoユーザーの権限の変更
1.rootに関する権限の記述箇所 root ALL=(ALL) ALL を探す。 2.その下に、作成したユーザーに権限を追加する記述 {ユーザー名} ALL=(ALL) ALL を追加するユーザーの切替
sudo su - {ユーザー名}2.諸々必要なものをインストール
sudo yum install git make gcc-c++ patch openssl-devel libyaml-devel libffi-devel libicu-devel libxml2 libxslt libxml2-devel libxslt-devel zlib-devel readline-devel mysql mysql-server mysql-devel ImageMagick ImageMagick-devel epel-release3.Rubyをインストール
以下Rubyをインストールするための下準備
git clone https://github.com/sstephenson/rbenv.git ~/.rbenvecho 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profileecho 'eval "$(rbenv init -)"' >> ~/.bash_profilesource .bash_profilegit clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-buildrbenv rehash以下Rubyのインストールです、インストールするRubyのバージョンは自分の環境に合わせてください
rbenv install -v 2.6.5rbenv global 2.6.5rbenv rehashインストールできたか確認
ruby -v4.node.jsをインストール
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash. ~/.nvm/nvm.shnvm install node5.Yarnをインストール
curl -o- -L https://yarnpkg.com/install.sh | bashexport PATH="$HOME/.yarn/bin:$HOME/.config/yarn/global/node_modules/.bin:$PATH"第三章 Rails、DB、Webサーバーの設定
1.Railsの設定
/var/www/rails/ の配下にRailsアプリを持ってくる、以下を一行一行実行していく
cd / (/ディレクトリに移動) sudo chown {ユーザー名} var (varフォルダの所有者を{ユーザー名}にする) cd var (varディレクトリに移動) sudo mkdir www (wwwディレクトリの作成) sudo chown {ユーザー名} www (wwwフォルダの所有者を{ユーザー名}にする) cd www (wwwディレクトリに移動) sudo mkdir rails (wwwディレクトリの作成) sudo chown {ユーザー名} rails (railsフォルダの所有者を{ユーザー名}にする) cd rails (railsディレクトリに移動)GitHubからクローン
git clone {自分のRailsのアプリのリポジトリのclone用URL}DBとの接続用の設定、以下をRailsアプリ内のconfig/database.ymlに追加
production: <<: *default database: {アプリ名} username: root #ここをrootに変更する password: #ここを空欄にする※ローカルのconfig/master.keyの一行を全てコピーし、
cloneしてきたアプリのconfig/master.keyに記載をする
(master.keyはgitignoreされておりローカルのmaster.keyの内容は
githubには反映されないため自分でコピペしてくる)2.MySQLの設定
起動
sudo service mysqld startln -s /var/lib/mysql/mysql.sock /tmp/mysql.sockDBの作成
rails db:create RAILS_ENV=productionマイグレーション
rails db:migrate RAILS_ENV=production3.Unicornの設定
Gemfileに以下を追記
group :production, :staging do gem 'unicorn' endbundlerをインストール
gem install bundlerbundlerでunicornのgemをインストール
bundle install設定ファイルの追加
vi ~/var/www/rails/{アプリ名}/config/unicorn.conf.rb以下を設定ファイルに記載
# set lets $worker = 2 $timeout = 30 $app_dir = "/var/www/rails/{アプリ名}" #自分のアプリケーション名 $listen = File.expand_path 'tmp/sockets/.unicorn.sock', $app_dir $pid = File.expand_path 'tmp/pids/unicorn.pid', $app_dir $std_log = File.expand_path 'log/unicorn.log', $app_dir # set config worker_processes $worker working_directory $app_dir stderr_path $std_log stdout_path $std_log timeout $timeout listen $listen pid $pid # loading booster preload_app true # before starting processes before_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.connection.disconnect! old_pid = "#{server.config[:pid]}.oldbin" if old_pid != server.pid begin Process.kill "QUIT", File.read(old_pid).to_i rescue Errno::ENOENT, Errno::ESRCH end end end # after finishing processes after_fork do |server, worker| defined?(ActiveRecord::Base) and ActiveRecord::Base.establish_connection end4.NginXの設定
インストール
sudo yum install nginxNginxの設定
ディレクトリを移動
cd /etc/nginx/conf.d/etc/nginx/conf.d下に設定ファイルの作成
vi {アプリ名}.conf以下を記載
# log directory error_log /var/www/rails/{アプリ名}/log/nginx.error.log; #自分のアプリケーション名に変更 access_log /var/www/rails/{アプリ名}/log/nginx.access.log; #自分のアプリケーション名に変更 # max body size client_max_body_size 2G; upstream app_server { # for UNIX domain socket setups server unix:/var/www/rails/{アプリ名}/tmp/sockets/.unicorn.sock fail_timeout=0; #自分のアプリケーション名に変更 } server { listen 80; server_name ~~~.~~~.~~~.~~~; #自分のElasticIP # nginx so increasing this is generally safe... keepalive_timeout 5; # path for static files root /var/www/rails/{アプリ名}/public; #自分のアプリケーション名に変更 # page cache loading try_files $uri/index.html $uri.html $uri @app; location @app { # HTTP headers 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; } # Rails error pages error_page 500 502 503 504 /500.html; location = /500.html { root /var/www/rails/{アプリ名}/public; #自分のアプリケーション名に変更 } }第四章 世界に公開
1.Railsのプリコンパイル
rails assets:precompile RAILS_ENV=production2.NginXを起動
sudo service nginx start3.Unicornを起動
bundle exec unicorn_rails -c /var/www/rails/{アプリ名}/config/unicorn.conf.rb -D -E production4.お疲れ様です
これでブラウザに自分のElasticIPを打ち込むと世界中のパソコンやスマホから自分のアプリにアクセスできます!
5.その他コマンド
unicornの起動確認
ps -ef | grep unicorn | grep -v grepunicornの終了
kill {masterのPID}以下のようなYarnのエラーが出ることがあります(Railsコマンドを実行した際にこのようなエラーが出る時があります)
======================================== Your Yarn packages are out of date! Please run `yarn install --check-files` to update. ========================================エラー文に従い以下を実行しましょう
yarn install --check-files
- 投稿日:2020-02-23T16:40:21+09:00
AWS RDS Auroraのデータを復元する方法
なぜこの記事を書いているのか?
- データベースのメンテナンスをしていたら、データベースの復元手順をメモったりしていないことに気づく。
- データをすっ飛ばしたりした場合に、これではまずいなと思い整理してみることに。
- 万一の時にササッと対応できるよう、簡潔にメモしておきたい。
- 備えあれば憂いなし。
前提条件(環境)
下記の環境で作業を行うことを前提とした場合の手順です。
- 対象DBサーバ
- AWS RDS
MySQL Aurora 5.7.mysql_aurora.2.07.1
mysql> select version(); +-----------+ | version() | +-----------+ | 5.7.12 | +-----------+
- 作業クライアント
macOS Catalina 10.15.3
- 対象DBサーバにアクセスできるクライアントであることが前提です。
- AWSのセキュリティグループのインバウンドルールで自分のIPアドレスを許可してアクセスできる状態にしておいてください。
$ sw_vers ProductName: Mac OS X ProductVersion: 10.15.3 BuildVersion: 19D76想定シナリオ
- mysqldumpを取得していない。(バックアップ運用計画をたてておきましょう)
- なのにSQLのクエリをミスって必要なデータを削除してしまった。
- わかっている人が一人しかいない。
- その人がコロナウィルスに感染し、対応不能。 ↑こういうことにならないように備えましょう。
データが消えました!
まずは落ち着こう。
ユーザ名とパスワードを確認
- DBサーバにアクセスするにあたって必要です。
- 1-PasswordやPassword Gorilla、社内ドキュメントを探しましょう。
- 見つからない場合は、唯一の担当者に連絡するなどして確認しましょう。 ↑こういうことにならないように備えましょう。
AWSコンソール上での作業
- AWSコンソールからRDS -> スナップショット -> システムの順に進み、お目当てのスナップショットを選択
- 右上の「アクション」プルダウンから「スナップショットの復元」を選択
- DBエンジン:
Aurora MySQL
- DBエンジンのバージョン:
Aurora(MySQL 5.7)2.07.1(default)
- DBインスタンスのクラス: 復元作業が目的なので、お安い
db.t3.small - 2 vVPU, 2GiB RAM
- DBインスタンス識別子: 何でも良いです。ただし本番稼働しているホストと似たような名前は避ける。作業対象を間違えないように。
- Virtual Private Cloud (VPC): 確実にアクセスできるネットワーク環境を選択。わからなければ本番環境を参考に。
- サブネットグループ:確実にアクセスできるネットワーク環境を選択。わからなければ本番環境を参考に。
- パブリックアクセシビリティ: はい
- アベイラビリティーゾーン: 確実にアクセスできるAZを選択。わからなければ本番環境を参考に。
- データベースのポート:3306
- DBパラメータグループ:わからなければ本番環境を参考に。
- DBクラスタのパラメータグループ: わからなければ本番環境を参考に。
- タグをスナップショットへコピー: チェックなし
- バックトラックを無効にする
- マスターキー: わからなければ本番環境を参考に。
- ログのエクスポート:復元作業が目的なので不要
- マイナーバージョン自動アップグレード: いいえ -「DBインスタンスの復元」ボタンをクリック
- AWSコンソール左側のメニューから「データベース」をクリック
- スナップショットから復元したインスタンスのステータスが「利用可能」になるのを待つ
- 利用可能になったら、
復元したインスタンス
のDB識別子をクリック- 「エンドポイント」のホスト名を控える
データを復元したいインスタンス(データを削除してしまったインスタンス)
のDB識別子をクリック- 「エンドポイント」のホスト名を控える
ターミナル上での作業
スナップショットから復元したインスタンス
上に残っているデータを下記のコマンドでdumpします- この記事では作業用クライアントがmacOSという想定ですので、「ターミナル」を起動し下記のコマンドを入力してください。
hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com
は先程のステップで控えたスナップショットから復元したインスタンスのホスト名
に置き換えてください。admin
の部分は最初に確認したユーザ名に置き換えてください。database_name
は復元したいデータベース名
に置き換えてください。$ mysqldump --skip-column-statistics --set-gtid-purged=OFF -h hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com -u admin -p database_name > ./dump.sql Enter password:
- 上記のコマンドを実行し、パスワードを入力するとカレントディレクトリにdump.sqlが出力されます。
- このダンプファイルを
データを復元したいインスタンス(データを削除してしまったインスタンス)
にインポートするために下記のコマンドを実行します。
hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com
は先程のステップで控えたスナップショットから復元したインスタンスのホスト名
に置き換えてください。admin
の部分は最初に確認したユーザ名に置き換えてください。database_name
は復元したいデータベース名
に置き換えてください。$ mysql -h hoge.c7mjpv6ouojj.ap-northeast-1.rds.amazonaws.com -u admin -p database_name < ./dump.sql Enter password:データが復元したことを確認
- あくまでスナップショットの時点のデータです。
- 復元できていないのは、どのデータなのかを把握する。
- 復元できないことによって、誰にどのような影響が出ているのかを整理する。
- 然るべき人に報告を入れる。
後片付け
- スナップショットから復元したインスタンスは削除しましょう。忘れるとどんどん課金されます。
- 何がまずかったのかをしっかり振り返り、必要な情報を整理し、今回のトラブルを次に活かしましょう。
- 投稿日:2020-02-23T11:07:26+09:00
PHP使ってユーザ作成・登録する時にパスワードをハッシュ化する
例えば
$lpw = $_POST["lpw"];
とかでログインパスワードをPOSTで受け取った際に
$hash = password_hash($lpw, PASSWORD_DEFAULT);
と記載して、その受け取ったパスワードをハッシュ化して、データベースに書き込むときにそのハッシュ化されたパスワードを放り込む。
$stmt = $pdo->prepare("INSERT INTO test_user_table(id,lid,lpw)VALUES(NULL,:lid,:lpw)"); $stmt->bindValue(':lid', $lid, PDO::PARAM_STR); $stmt->bindValue(':lpw', $hash, PDO::PARAM_STR);
- 投稿日:2020-02-23T09:03:00+09:00
【rails】mysqlのデータベース、テーブル、全データを削除する方法(初心者向け)
データベースの中身を確認
$sudo service mysqld start $mysqld -u root mysql> show databases; mysql> USE データベース名; mysql> show tables; mysql> describe テーブル名; mysql> select * FROM データベース名.テーブル名;データベースの削除
※確認なしに即削除されます。使用注意。
mysql> show databases; mysql> DROP DATABASE データベース名;テーブルの削除
※確認なしに即削除されます。使用注意。
mysql> USE データベース名; mysql> show tables; mysql> DROP TABLE データベース名.テーブル名;全データ削除
mysql> USE データベース名; mysql> show tables; mysql> select * FROM データベース名.テーブル名; mysql> DELETE FROM データベース名.テーブル名;
- 投稿日:2020-02-23T09:03:00+09:00
Mysqlのデータベース、テーブル、データを確認する方法(初心者向け)
- 投稿日:2020-02-23T07:23:22+09:00
【初学者向け】LaravelチュートリアルToDoアプリへの機能追加
はじめに
私は所属しているエンジニアサークルでLaravelを学んでいます。
Laravelのとっかかりで、こちらのチュートリアルをやった方も多いんではないでしょうか。
今回はこの完成したToDoアプリに機能追加の第一弾を行おうと思います。今回やること
今回やりたいことは大きく分けると2つです。
1, ユーザーページを作り下記3つを表示させる
・ユーザー名
・アドレス
・ユーザー名編集ページへのリンク2, ユーザー名変更機能の実装
・ログイン後であれば任意のユーザー名に変更可能難易度としてはそこまで高くないですが、WEBサービスを今後作る上で必要な機能なので確実に押さえておきたい所です。
実装までの流れ
コードを書く前に必要な事を整理してきます。
・ ユーザーページへ遷移するためのルーティングを用意
・ ユーザーページへ遷移するためのリンクを用意
・ コントローラーにユーザーの情報を取得するメソッドを用意
・ ユーザーページのテンプレートファイルを用意
・ ユーザーページにユーザー名編集ページへのリンクを用意
・ ユーザー名編集ページへのルーティングを用意
・ ユーザー名編集ページでユーザー名が変更された際のルーティングを用意
・ コントローラーにユーザー名を更新するメソッドを用意一見すると大変そうですが、1つ1つは大変な作業ではありません。
タスク一覧ページ
まず見た目を確認しておきましょう。
ヘッダー部分にユーザーページというリンクがあるのが分かると思います。
ルーティング
では早速web.phpにルーティングを書いていきます。
web.phpRoute::get('/users', 'UsersController@showUsers')->name('users.showUsers');users.showUsersと名前をつけました。
ユーザーページへのリンクを設置
次にヘッダー部分に、ユーザーページへ遷移するためのリンクを準備します。
先ほど定義したルーティングを利用します。layout.blade.php<a href="{{ route('users.showUsers') }}" class="my-navbar-item">ユーザーページ</a> |コントローラー
次に、UsersControllerにメソッドを追加します。
UsersController.phppublic function showUsers() //ユーザー情報を取得 { $user = Auth::user(); return view('users/showUsers',['user' => $user]);Auth::を使ってログインしているユーザーの情報を取得し、$userに代入しています。
これでログインしているユーザーの情報は取得できました。
そしてshowUsersというテンプレートに情報を渡しています。
テンプレートファイルはこれから準備します。ユーザーページ
ユーザーページの見た目を確認をしておきましょう。
冒頭でも説明したように、ユーザー名、アドレス、ユーザー名編集ページへのリンクが表示されているシンプルな画面です。
テンプレートファイル
ではユーザーの情報を表示させるshowUsersというテンプレートファイルを準備します。
$ touch resources/views/users/showUsers.blade.phpファイルが出来上がったら記述します。
showUsers.blade.php//省略 <p>{{$user->name}}</p> //ユーザー名 //省略 p>{{$user->email}}</p> //メールアドレス //省略 <a href="{{ route('users.editUsers') }}">ユーザー名を編集する</a> //ユーザー名編集ページへのリンク //省略先ほどコントローラーから受け取った$userは認証されたユーザーの情報も保持しています。
$user->でカラムへアクセスすると値を取得し表示できます。ユーザー名編集ページへのルーティング
ユーザーページに設置したリンクをクリックされた時のルーティングをweb.phpに記述します。
web.phpRoute::get('/users/edit', 'UsersController@editUsers')->name('users.editUsers');users.editUsersと名前をつけました。
ルーティングの名前は自分以外がコードを見た時に、処理の内容をイメージしやすい名前をつけます。コントローラー
ルーティングで呼ばれたeditUsersメソッドをUsersControllerに記述します。
UsersController.phppublic function editUsers() //ユーザー名編集画面へ遷移する { return view('users/editUsers'); }内容としてはユーザー名編集ページへ遷移するためだけの記述です。
テンプレートファイルであるeditUsersは後から準備します。ユーザー名編集ページ
ルーティング
先に変更ボタンが押された時にメソッドを呼ぶ必要があるため、ルーティングを定義しておきます。
web.phpRoute::post('/users/edit','UsersController@updateUsers')->name('users.updateUsers');今回は入力値があるため、postを使いました。
テンプレートファイル
ユーザー名が入力され変更ボタンが押された時に、先ほど定義したルーティングを利用したいため、フォーム内に記述します。
editUsers.blade.php//省略 <form action="{{ route('users.updateUsers') }}" method="post"> //省略コントローラー
UsersController.phppublic function updateUsers(Request $request) //ユーザー名を変更する { $name = $request->name; $edit_user = Auth::user(); $edit_user->name = $name; $edit_user->save(); return redirect()->route('users.editUsers'); }こちらが今回の課題の要と言えるでしょうか。
Requestクラスには、アクセスしてきた際の情報が格納されています。
今回の場合、Viewのフォームの中でname = "name"としたため(View省略のため掲載なし)$Requestクラスのオブジェクトでnameにアクセスして、入力された変更したいユーザー名を取得しています。
そして現在ログインしているユーザーの名前に上書きしています。最後に、ユーザー名を変更しても画面遷移をする必要はないため、ユーザー名編集ページへリダイレクトとしています。
動作確認
では,最後にユーザー名を実際にtestからabcへ変更してみます。
変更ボタン押下
ヘッダーのユーザー名がabcに変わりましたね。さいごに
LaravelチュートリアルはLaravel導入にとてもいい教材だと感じました。
また、実際に自身で考えて機能を追加する事で、理解が深まったと強く感じるのでぜひ色々な機能実装に挑戦してみてはいかがでしょうか。