20200223のMySQLに関する記事は6件です。

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-release

3.Rubyをインストール

以下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  
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
rbenv rehash  

以下Rubyのインストールです、インストールするRubyのバージョンは自分の環境に合わせてください

rbenv install -v 2.6.5
rbenv global 2.6.5
rbenv rehash

インストールできたか確認

ruby -v

4.node.jsをインストール

curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.34.0/install.sh | bash
. ~/.nvm/nvm.sh
nvm install node

5.Yarnをインストール

curl -o- -L https://yarnpkg.com/install.sh | bash
export 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 start
ln -s /var/lib/mysql/mysql.sock /tmp/mysql.sock

DBの作成

rails db:create RAILS_ENV=production

マイグレーション

rails db:migrate RAILS_ENV=production

3.Unicornの設定

Gemfileに以下を追記

group :production, :staging do
  gem 'unicorn'
end

bundlerをインストール

gem install bundler

bundlerで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
  end

4.NginXの設定

インストール

sudo yum install nginx

Nginxの設定

ディレクトリを移動

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=production 

2.NginXを起動

sudo service nginx start

3.Unicornを起動

bundle exec unicorn_rails -c /var/www/rails/{アプリ名}/config/unicorn.conf.rb -D -E production

4.お疲れ様です

これでブラウザに自分のElasticIPを打ち込むと世界中のパソコンやスマホから自分のアプリにアクセスできます!

5.その他コマンド

unicornの起動確認

ps -ef | grep unicorn | grep -v grep

unicornの終了

kill {masterのPID}

以下のようなYarnのエラーが出ることがあります(Railsコマンドを実行した際にこのようなエラーが出る時があります)

========================================
  Your Yarn packages are out of date!
  Please run `yarn install --check-files` to update.
========================================

エラー文に従い以下を実行しましょう

yarn install --check-files
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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: 

データが復元したことを確認

  • あくまでスナップショットの時点のデータです。
  • 復元できていないのは、どのデータなのかを把握する。
  • 復元できないことによって、誰にどのような影響が出ているのかを整理する。
  • 然るべき人に報告を入れる。

後片付け

  • スナップショットから復元したインスタンスは削除しましょう。忘れるとどんどん課金されます。
  • 何がまずかったのかをしっかり振り返り、必要な情報を整理し、今回のトラブルを次に活かしましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

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);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【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 データベース名.テーブル名;
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Mysqlのデータベース、テーブル、データを確認する方法(初心者向け)

Mysqlへログイン

$sudo service mysqld start
$mysqld -u root

データベース一覧を確認

mysql> show databases;

テーブル一覧を確認

mysql> USE データベース名;
mysql> show tables;

テーブルのカラムを確認

mysql> describe テーブル名;

テーブルの全データを確認

mysql> select * FROM データベース名.テーブル名;

Mysqlからログアウト

mysql> exit
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【初学者向け】LaravelチュートリアルToDoアプリへの機能追加

はじめに

私は所属しているエンジニアサークルでLaravelを学んでいます。
Laravelのとっかかりで、こちらのチュートリアルをやった方も多いんではないでしょうか。
今回はこの完成したToDoアプリに機能追加の第一弾を行おうと思います。

今回やること

今回やりたいことは大きく分けると2つです。

1, ユーザーページを作り下記3つを表示させる
・ユーザー名
・アドレス
・ユーザー名編集ページへのリンク

2, ユーザー名変更機能の実装
・ログイン後であれば任意のユーザー名に変更可能

難易度としてはそこまで高くないですが、WEBサービスを今後作る上で必要な機能なので確実に押さえておきたい所です。

実装までの流れ

コードを書く前に必要な事を整理してきます。

・ ユーザーページへ遷移するためのルーティングを用意
・ ユーザーページへ遷移するためのリンクを用意
・ コントローラーにユーザーの情報を取得するメソッドを用意
・ ユーザーページのテンプレートファイルを用意
・ ユーザーページにユーザー名編集ページへのリンクを用意
・ ユーザー名編集ページへのルーティングを用意
・ ユーザー名編集ページでユーザー名が変更された際のルーティングを用意
・ コントローラーにユーザー名を更新するメソッドを用意

一見すると大変そうですが、1つ1つは大変な作業ではありません。

タスク一覧ページ

まず見た目を確認しておきましょう。
ヘッダー部分にユーザーページというリンクがあるのが分かると思います。
スクリーンショット 2020-02-22 23.37.34.png

ルーティング

では早速web.phpにルーティングを書いていきます。

web.php
Route::get('/users', 'UsersController@showUsers')->name('users.showUsers');

users.showUsersと名前をつけました。

ユーザーページへのリンクを設置

次にヘッダー部分に、ユーザーページへ遷移するためのリンクを準備します。
先ほど定義したルーティングを利用します。

layout.blade.php
        <a href="{{ route('users.showUsers') }}" class="my-navbar-item">ユーザーページ</a>
        |

コントローラー

次に、UsersControllerにメソッドを追加します。

UsersController.php
public function showUsers()  //ユーザー情報を取得
    {
        $user = Auth::user();

        return view('users/showUsers',['user' => $user]);

Auth::を使ってログインしているユーザーの情報を取得し、$userに代入しています。
これでログインしているユーザーの情報は取得できました。
そしてshowUsersというテンプレートに情報を渡しています。
テンプレートファイルはこれから準備します。

ユーザーページ

ユーザーページの見た目を確認をしておきましょう。
冒頭でも説明したように、ユーザー名、アドレス、ユーザー名編集ページへのリンクが表示されているシンプルな画面です。
スクリーンショット 2020-02-22 23.37.43.png

テンプレートファイル

ではユーザーの情報を表示させる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.php
Route::get('/users/edit', 'UsersController@editUsers')->name('users.editUsers');

users.editUsersと名前をつけました。
ルーティングの名前は自分以外がコードを見た時に、処理の内容をイメージしやすい名前をつけます。

コントローラー

ルーティングで呼ばれたeditUsersメソッドをUsersControllerに記述します。

UsersController.php
public function editUsers()  //ユーザー名編集画面へ遷移する
    {
        return view('users/editUsers');
    }

内容としてはユーザー名編集ページへ遷移するためだけの記述です。
テンプレートファイルであるeditUsersは後から準備します。

ユーザー名編集ページ

最後にユーザー名編集ページの見た目を確認しておきましょう。
スクリーンショット 2020-02-22 23.37.51.png

ルーティング

先に変更ボタンが押された時にメソッドを呼ぶ必要があるため、ルーティングを定義しておきます。

web.php
Route::post('/users/edit','UsersController@updateUsers')->name('users.updateUsers');

今回は入力値があるため、postを使いました。

テンプレートファイル

ユーザー名が入力され変更ボタンが押された時に、先ほど定義したルーティングを利用したいため、フォーム内に記述します。

editUsers.blade.php
//省略
<form action="{{ route('users.updateUsers') }}" method="post">
//省略

コントローラー

UsersController.php
public 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へ変更してみます。
スクリーンショット 2020-02-23 0.57.32.png

変更ボタン押下
スクリーンショット 2020-02-23 0.57.39.png
ヘッダーのユーザー名がabcに変わりましたね。

さいごに

LaravelチュートリアルはLaravel導入にとてもいい教材だと感じました。
また、実際に自身で考えて機能を追加する事で、理解が深まったと強く感じるのでぜひ色々な機能実装に挑戦してみてはいかがでしょうか。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む