AWS EC2インスタンスでrailsを動かす

EC2インスタンスgithubからコードをクローンする

1まずクローンするディレクトリと作る

#mkdirコマンドで新たにディレクトリを作成
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
#作成したwwwディレクトリの権限をec2-userに変更
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/

2次にgithubでclone or download押してリポジトリのurlをコピーしとく

 

3クローンする

ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
[ec2-user@ip-172-31-23-189 www]$ git clone https://github.com/<ユーザー名>/<リポジトリ名>.git

 

 

EC2の能力拡張

無料枠で何もしないとパワー不足でエラーになる可能性がある。

容量を超えると普通エラーで処理が止まる。

swap領域があればメモリが足りなくなりそうな時に一時的にメモリの容量を増やせる。

デフォルトではswap領域は用意してないので以下の手順で用意する

#ホームディレクトリに移動
[ec2-user@ip-172-31-25-189 ~]$ cd
#処理に時間がかかる可能性があるコマンドです
[ec2-user@ip-172-31-25-189 ~]$ sudo dd if=/dev/zero of=/swapfile1 bs=1M count=512
# しばらく待って、以下のように表示されれば成功
512+0 レコード入力
512+0 レコード出力
536870912 バイト (537 MB) コピーされました、 7.35077 秒、 73.0 MB/秒
[ec2-user@ip-172-31-25-189 ~]$ sudo chmod 600 /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo mkswap /swapfile1
# 以下のように表示されれば成功
スワップ空間バージョン1を設定します、サイズ = 524284 KiB
ラベルはありません, UUID=74a961ba-7a33-4c18-b1cd-9779bcda8ab1
[ec2-user@ip-172-31-25-189 ~]$ sudo swapon /swapfile1
[ec2-user@ip-172-31-25-189 ~]$ sudo sh -c 'echo "/swapfile1  none        swap    sw              0   0" >> /etc/fstab'

 

最初のコマンドはここ読む

https://www.atmarkit.co.jp/ait/articles/1711/30/news027.html

 

UUIDは重複する可能性がほぼないさくっと作れるID

 

最後のコマンドはこことか読む。まぁ正確にはまだよくわかってないが

https://qiita.com/ukinau/items/410f56b6d777ad1e4e90

 

 

bundlerのインストール

[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ gem install bundler -v 2.0.1
# ローカルで確認したbundlerのバージョンを導入する
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle install
# 上記コマンドは、数分以上かかる場合もあります。

 

 

環境変数設定 

参考記事

https://techtechmedia.com/environment-variable-aws/

とりあえずconfig/のsecrets.ymlとdatabase.ymlでまとめとく。credentials.ymlはまた今度まとめる

データベースのパスワードなどのgithubにアップできない物は環境変数を利用する

ざっくり環境変数

https://qiita.com/yuichir43705457/items/7cfcae6546876086b849

 RailsからはENV['環境変数名']という記述で利用できる。

・ポイントとしては環境変数と一口に言うが、一つのOSはいくつも環境変数を持ってるもんであるってこと。DATABASE_PASSWORDやSECRET_KEY_BASEという名前の環境変数を自分で作って、値にデーターベースのパスワードやsecret_key_baseをいれるということ

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

実際の設定方法

EC2サーバーのsecret_key_baseをまず作る

[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rake secret
69619d9a75b78f2e1c87ec5e07541b42f23efeb6a54e97da3723de06fe74af29d5718adff77d2b04b2805d3a1e143fa61baacfbf4ca2c6fcc608cff8d5a28e8d

EC2サーバーの環境変数を設定する。最初は何も書いてないはず。

[ec2-user@ip-172-31-23-189 ~]$ sudo vim /etc/environment

ファイルの保存場所は/etc/environmentだと覚えといた方がいい。それをvimエディタで開いて中にさっきの値を書く

/etc/environment

DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'
SECRET_KEY_BASE='先程コピーしたsecret_key_base'

設定したら反映するために:wqで保存して一旦ログアウトする

[ec2-user@ip-172-31-23-189 ~]$ exit
logout
Connection to 52.xx.xx.xx closed.

 

exitするとローカル環境になるので再度SSH接続し直す

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

 

envコマンドとgrepコマンドを合わせてちゃんと設定されてるか確認

[ec2-user@ip-172-31-23-189 ~]$ env | grep SECRET_KEY_BASE
SECRET_KEY_BASE='secret_key_base'

[ec2-user@ip-172-31-23-189 ~]$ env | grep DATABASE_PASSWORD
DATABASE_PASSWORD='MySQLのrootユーザーのパスワード'

 

ポートを開放する

セキュリティグループのリンクを踏み設定画面にとび、インバウンドタブの編集からルールの追加で開放する。今回は

タイプ「カスタムTCPルール」

プロトコルTCP

ポート範囲「3000」

送信元「カスタム」「0.0.0.0/0」

にする

デフォルトのSSHとこないだ開いたHTTPと違うのはタイプがカスタムTCPなことくらいか。タイプがカスタムTCPなことは覚えておいた方がいいだろう。

 

Railsを起動する

起動の前に、本番環境のmysqlの設定に合わせるために、ローカルのdatabase.ymlを編集する必要がある。

config/database.yml

production:
  <<: *default
  database: ~~~(それぞれのアプリケーション名によって異なっています。こちらは編集しないでください)
  username: root
  password: <%= ENV['DATABASE_PASSWORD'] %>
  socket: /var/lib/mysql/mysql.sock

 

gitのmasterに上の変更を反映したらEC2サーバ側でpullする

[ec2-user@ip-172-31-23-189 <リポジトリ名>] git pull origin master
 DBを作成する
ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:create RAILS_ENV=production
Created database '<データベース名>'
[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ rails db:migrate RAILS_ENV=production

もしここでMysql2::Error: Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'というエラーが起こった場合、mysqlが起動していない可能性があります。sudo service mysqld startというコマンドをターミナルから打ち込み、mysqlの起動を試してみましょう。

 

自分からしたらリモートやけど、当のEC2サーバーもmysqlにとっちゃlocalだから上みたいなエラー文なんやろうな。何かこういうエラー見たことある気がするけど、localって入ってたら間違えそうだから注意やな。

 

最後にrailsを起動させてみる

[ec2-user@ip-172-31-23-189 <リポジトリ名>]$ bundle exec unicorn_rails -c config/unicorn.rb -E production -D

 

unicorn_rails で起動させてる

-c config/unicorn.rbで設定ファイルの指定

-E production は「本番モードとして動作させる」

-D はプログラムを起動させつつターミナルで別のコマンドを打てるようにするオプション

 

 

補足

当然起動させる時はアプリのあるリポジトリに移動して行う。今回で言えば

cd /var/www/[リポジトリ]で移動しておく

エラーがでたら

less log/unicorn.stderr.logなどでログを確認する

(エラーログをここに書き出す設定は前の部分でやってたと思う)

envコマンド

「env」は、環境変数の値を設定しつつ、同時に指定したコマンドを実行するコマンドです。https://www.atmarkit.co.jp/ait/articles/1801/18/news016.html

AWS 環境構築その3

アプリケーションサーバーの設定の前に

 

アプリケーションサーバーいれる前にそもそもアプリがないと意味ないのでgitからコードをクローンできるようにしとく。

 

githubSSH鍵を登録

EC2インスタンスSSH公開鍵をGithubに登録しないと誰だかわかんないのでclone出来ない。

まずSSH鍵ペアを作る。

注意点としては

SSHログインする時にパソコンとEC2の間にペア鍵を作ったのを思い出して欲しい。

AWSの場合はpemファイルをダウンロードすることで秘密鍵をgetしていたが、

本来であれば秘密鍵はローカルで作成して、公開鍵だけをあげるはずだった。(SSHの記事参照)

今回はEC2とGithubの間で本来の手順でSSHキーペア を作る感じ

 

以下抜粋

以下のコマンド入力して、EC2サーバのSSH鍵ペアを作成しましょう

途中で passphrase など3段階ほど入力を求められることがありますが、全て何も入力せずにEnterキーで進んでください。
※EC2サーバにログインしていない場合はログインしてから以下の作業を行なってください。

ターミナル(EC2サーバ)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
[ec2-user@ip-172-31-23-189 ~]$ ssh-keygen -t rsa -b 4096
Generating public/private rsa key pair.
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /home/ec2-user/.ssh/id_rsa.
Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub.
The key fingerprint is:
3a:8c:1d:d1:a9:22:c7:6e:6b:43:22:31:0f:ca:63:fa ec2-user@ip-172-31-23-189
The key's randomart image is:
+--[ RSA 4096]----+
|    +            |
| . . =           |
|  = . o .        |
| * o . o         |
|= *     S        |
|.* +     .       |
|  * +            |
| .E+ .           |
| .o              |
+-----------------+

次に、以下のコマンドで生成されたSSH公開鍵を表示し、値をコピーします。

ターミナル(EC2サーバ)
1
2
[ec2-user@ip-172-31-23-189 ~]$ cat ~/.ssh/id_rsa.pub
ssh-rsa AAAAB3NzaC1yc2E......

 

 本来の手順通りキーペア を作成して公開鍵.pubの方の中身を覗いてコピーしてる。これをgithubに渡す感じ

 

github側でやること

personal settingsの部分にSSH and GPG keysの項目があるから

タイトルには適当なもをつけて

keyの部分にさっきcatで覗いてコピーしたSSH公開鍵を貼り付けて

Add SSH key を押して保存

 

ここまできたらEC2からGithubSSH接続できるかを確認する

[ec2-user@ip-172-31-23-189 ~]$ ssh -T git@github.com
Hi <Githubユーザー名>! You've successfully authenticated, but GitHub does not provide shell access.

 

途中何か聞かれたらyesで進んで上のようにsuccessしてるのを確認する。これでgitからクローンできるようになってるので、とりあえずアプリケーションサーバーの設定に進む。

 

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

ローカルではrails s でpumaが起動し、ブラウザから自身のPCを指すドメインであるlocalhost:3000にアクセスしている。って感じなんだけど、そこはあんま気にせんでいいかな。擬似的なもんだから実際との違いが逆に理解の妨げになるかも。結局大事なのは本番環境がどうなってるかってことだからね。で、実際はpumaじゃなくてunicornアプリケーションサーバーとして使うのでそれを設定していく。

 

Unicornの設定

1.まず普通にローカルのgemに'Unicorn'入れてbundle installする。本番だけでいい。

2. config.unicorn.rbを作成し、設定を書く。ここも抜粋する

 

#サーバ上でのアプリケーションコードが設置されているディレクトリを変数に入れておく
app_path = File.expand_path('../../', __FILE__)

#アプリケーションサーバの性能を決定する
worker_processes 1

#アプリケーションの設置されているディレクトリを指定
working_directory app_path

#Unicornの起動に必要なファイルの設置場所を指定
pid "#{app_path}/tmp/pids/unicorn.pid"

#ポート番号を指定
listen 3000

#エラーのログを記録するファイルを指定
stderr_path "#{app_path}/log/unicorn.stderr.log"

#通常のログを記録するファイルを指定
stdout_path "#{app_path}/log/unicorn.stdout.log"

#Railsアプリケーションの応答を待つ上限時間を設定
timeout 60

#以下は応用的な設定なので説明は割愛

preload_app true
GC.respond_to?(:copy_on_write_friendly=) && GC.copy_on_write_friendly = true

check_client_connection false

run_once = true

before_fork do |server, worker|
  defined?(ActiveRecord::Base) &&
    ActiveRecord::Base.connection.disconnect!

  if run_once
    run_once = false # prevent from firing again
  end

  old_pid = "#{server.config[:pid]}.oldbin"
  if File.exist?(old_pid) && server.pid != old_pid
    begin
      sig = (worker.nr + 1) >= server.worker_processes ? :QUIT : :TTOU
      Process.kill(sig, File.read(old_pid).to_i)
    rescue Errno::ENOENT, Errno::ESRCH => e
      logger.error e
    end
  end
end

after_fork do |_server, _worker|
  defined?(ActiveRecord::Base) && ActiveRecord::Base.establish_connection
end

 

 worker_processes

ワーカーの数決める。workerはプロセスが分裂した物らしい。まあ数増やせば処理速度あがるよくらいに思っとく。

 

pid

プロセスidが書かれたファイルが生成される場所の指定

 

 

 

uglifierのコメントアウト

config/environments/production.rbに

config.assets.js_compressor = :uglifier があるのでコメントアウトする。

js軽量化のための物だがテンプレートリテラルに対応してないのでエラーの元になる。個人アプリで作ったレベルであれば軽量化してなくてもほとんど変わらない。

 

 

 

追記予定

AWS 環境構築その2

データベースサーバの設定

 

MySQLのインストール

[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install mysql56-server mysql56-devel mysql56

上の例だとバージョン5.6

 

MySQLの起動

ec2-user@ip-172-31-25-189 ~]$ sudo service mysqld start

 

serviceコマンド

Amazon LinuxCentOSで使えるコマンド。インストールしたソフトウェアの起動を一括して行える

daemonデーモン

Linux用語でサーバを意味する。上の例だとmysqldのdはdaemonのd

 

確認

sudo service mysqld status と打ち runningであることを確認する

 

MySQLのrootパスワードの設定

yumインストールしたMYSQLにはデフォルトではrootというユーザーで接続できるが、パスワードは設定されていないので、パスワード設定しとく。

[ec2-user@ip-172-31-25-189 ~]$ sudo /usr/libexec/mysql56/mysqladmin -u root password 'ここを設定したいパスワードにする。ただし0から始まる物は避ける'

 

 Railsからアクセスする時にも利用するので覚えとく。

 

設定したパスワードで入れるか確認

[ec2-user@ip-172-31-25-189 ~]$ mysql -u root -p

 

パスワードを入れて入れるか確認。mysql>と出る。

 

AWS 環境構築

結構定型文的な呪文が多そうなのでカリキュラムからの抜粋が多い。

sudoよく使ってるので一応

https://eng-entrance.com/linux-root

 

最初はLinuxOS以外何も入ってないので色々と入れてく。yumコマンドを使う。

yumはLinuxOSのパッケージ(ソフトウェアでもライブラリでもいいけどLinuxは行為言うのをパッケージって読んでる)管理のための仕組み。

MacOSのhomebrewみたいなもん。

以下抜粋

環境構築で最初にやること

サーバーに接続したターミナルで

[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y update

でまずパッケージをアップデート

ec2-user@ip-172-31-25-189 ~]$ 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
  

で必要な物をインストール。まぁとりま呪文でいいかなぁ。

git make gcc-c++ patchは

#cとc++コンパイラ、gitの差分をpatchファイルに変更する、らしい
あとのは調べてないがyamlだのxmlだのopensslだのちょこちょこ何のための物か想像つく奴があるし、本当に環境構築って感じなんだろう。libとかdevelをとったもん調べれば何のためのもんかはわかりそうな気がする

 

 

yumコマンド

https://www.atmarkit.co.jp/ait/articles/1608/29/news019.html

-yは全てにyesで答えるオプション。

 

 

node.jsをインストールする

 抜粋

[ec2-user@ip-172-31-25-189 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nodejs

 

Curl(カール)とは、URLを使用してデータ転送するためのコマンドラインツールです。ライブラリ「libCurl」をベースとして動作します。多くのプロトコルに対応して、さまざまなソフトウェアのデータ転送バックボーンとして利用されています。

らしい。-sLは-sが進捗やエラーを表示しない。-Lが

curlGoogle ( http://www.google.com/ ) にアクセスすると分かりますが、別のページに飛ばされます。HTTPには、別のページへ飛ばすためのいくつかの方法がありますが、その指定に従って飛んでいくには、「 -L 」を書いておきます。特別なことが無い限りは、常に書いておいた方がよいでしょう。

ということらしいので併せたような感じなんかなぁ

 

 rbenvとruby-buildのインストール

rubyいれる前にこれ入れとかないとだめ

また抜粋 

ターミナル(サーバー)
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
#rbenvのインストール
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 
#パスを通す
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
#rbenvを呼び出すための記述
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
#.bash_profileの読み込み
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile
#ruby-buildのインストール
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
#rehashを行う
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  

コマンドを一つずつ見ていきましょう。
1つ目のコマンドは、gitからrbenvをクローンしています。
2つ目と3つ目のコマンドは、パスを通す際に必要なコマンドです。パスを通すとは、どのディレクトリからもアプリケーションを呼び出せる状態にするということです。
そして、4つ目のコマンドで、設定したパスを読み込んでいます。
5つ目のコマンドは、gitからruby-buildをクローンしています。
最後のコマンドは、使用しているRubyのバージョンにおいて、gemのコマンドを使えるようにするために必要なコマンドです。

これでrbenvとruby-buildのインストールは完了です。

 

補足

.bash_profile

https://wa3.i-3-i.info/word13650.html

export

https://www.atmarkit.co.jp/ait/articles/1801/12/news015.html

eval

https://www.atmarkit.co.jp/ait/articles/1712/22/news019.html 

 

まぁとりあえず呪文だと思っとくかなぁ。この辺りは自分の力だと生兵法になりそうだし。わからんくなったら都度調べるくらいの方がいいかも。

 

 

Rubyのインストール

抜粋

ec2-user@ip-172-31-25-189 ~]$ rbenv install 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 2.5.1
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  #rehashを行う
[ec2-user@ip-172-31-25-189 ~]$ ruby -v # バージョンを確認

 

バージョンの指定は例だから特に2.5.1である必要はない

AWS EC2インスタンスにログインする。ポートを開放しておく。

Amazon EC2は仮想サーバ

Amazon S3クラウドストレージ

Amazon RDSはデータベース

一応言葉使いはこんな感じの認識でいると想像し易いかも↓ 

https://it-trend.jp/database/article/89-0058

 

まず前提としてリージョンは最初に選ぼうね。

 

EC2(Amazon Elastic Compute Cloud)

仮想マシン(ソフトウェア)が仮想的なlinuxサーバーを使えるようにしてくれる。このLInuxサーバー1つ分のことをEC2インスタンスと呼ぶ。あくまで仮想的な物だから物理的に一台という訳ではない。

 

AMI (Amazon Machine Image)

サーバーのデータを丸ごと保存したデータ。OSやwebサーバー等が事前にインストールされてる物もある。今はとりあえずAmazon Linux AMI を使ってる(2じゃない方)。クイックスタートからAmazon Linux AMI を選択したら、

インスタンスタイプ(スペックが違う。要はサーバーのスペック選べ)の選択に移るので、

無料枠のt2.microを選択して確認と作成ボタンを押して、インスタンス作成の確認ページに移る

間違いがなければ起動ボタンを押す

 するとキーペア のダウンロードができるのでする。インスタンス毎にキーペア を作成しといた方が理論上は安全そう。鍵管理の煩雑さとの兼ね合いではあるので、どの程度そのサーバーにアクセスされたら困るかでレベル分けしてもいいかもしれない。

注意すべきポイントとして

この時ダウンロードしてるのは秘密鍵であるということ。

これは本来はおかしいのだが(本来秘密鍵はローカルで生成して、公開鍵だけをリモートに追記する。詳しくは前にまとめたSSH参照)、AWSは信頼できるのでコンソールで作成した物をダウンロードしてる。もちろんAWS秘密鍵は持たずに破棄してくれる。

ユーザーが簡単にSSHできるようにというAWS側の配慮である。

当然他人に知られてはいけないし、無くすとログイン出来なくなってしまうので必ずダウンロードして保存しておくこと。キーペア の名前は何でもいいが、エラーのもとなのでスペースは含まないこと。

拡張子が.pemというファイルでダウンロードされる。

鍵名.pemってやつ。普通にdownload内にダウンロードされるので.sshディレクトリに移動させる。ディレクトリが無ければ作る。

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

で権限設定しとく。

ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したインスタンと紐付けたElastic IP

でログイン可能だが、普段はec2-userではログインしない。あと説明する。

ここまでやって初めてEC2インスタンスの作成ができるようになる。

作成したらIDをメモっとく。(次のElastic IP 取得に必要なため)

 

Elastic IP

インスタンス作っただけだとサーバー起動時にIPアドレスが変わってしまうのでその都度設定を変える必要が出てくるので大変。Elastic IPを取得して紐づけることで、インスタンの起動停止にかかわらず固定のIPアドレスを使える。

まずElastic IPを取得。取得出来たら

アクションからアドレスの関連付けを選ぶ、

次のページでインスタンスを選ぶプルダウンがあるから、メモっといたインスタンスIDのインスタンスを選んで関連付ける。(プライベートI Dは入力しない)

取得したElastic IPと作成したインスタンスのパブリックIPが同一の物になってることを確認する

 

ポート開放

 インスタンスは立ち上げたばかりだとSSHしか出来ない。

普通のhttp接続とかも出来ないので必要なポートを開放していく

設定はセキュリティグループで行う

 

セキュリティグループ

EC2インスタンスが属するまとまり。複数のEC2インスタンスのネットワーク設定を一括で行うためのもの。EC2インスタンス一覧のぺーじにセキュリティーグループのリンクも書いてあるから、インスタンの属するセキュリティグループの設定ページに飛んで編集を選択する。

モーダルが開くので、「ルールの追加」ポートを開く

タイプ HTTP

プロトコル TCP

ポート範囲 「80」

送信元「カスタム/0.0.0.0, ::/0」

等としてhttpのポートを開いておく。それぞれの意味は気になったら調べるべし。普通はこれにしとけばいいと思う。

この時にルールの追加で開くこと。もともとあるSSHのポート閉じたりしないようにね。

 

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

抜粋

 

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

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#(例えばElastic IPが123.456.789であれば、ssh -i ダウンロードした鍵の名前.pem ec2-user@123.456.789 というコマンドになります)
#(ダウンロードした鍵を用いて、ec2-userとしてログイン)

 

以下の様なメッセージが表示されることがありますが、「yes」と入力して下さい。

ターミナル(ローカル)
1
2
3
4
$ ssh -i aws_key.pem ec2-user@52.68.~~~~~~
The authenticity of host '52.68.~~~~~~ (52.68.~~~~~~)' can't be established.
RSA key fingerprint is eb:7a:bd:e6:aa:da:~~~~~~~~~~~~~~~~~~~~~~~~.
Are you sure you want to continue connecting (yes/no)? 

 

左側が[ec2-user]になれば成功。

ssh接続は一定時間でタイムアウトするので、切れたら同じようにまたログインする。

-i はidentigyのi 秘密鍵ファイルのことを言ってる。

https://webkaru.net/linux/ssh-command/

 

ただしec2-userは権限が大きいため、権限を小さくしたユーザーを作成してそちらでログインするのが普通

 

 

追記予定

SSH 自分にとって大事なとこ

前にもSSHについて何か書いたような気もするけど今の自分にとって何が大事、どこがポイントなのか整理しとく。

 

何故使うか

割りと安全にリモートサーバーを動かせる。

ファイルの操作や編集とかこれでできる。

リモートにSSHサーバがインストールされてる必要がある(LinuxOSなら入ってる)

ローカルにSSHクライアントがインストールされてる必要がある(MacOSなら入ってる)

要は普通に使えて安全なssh通信でリモートの設定しようねって話。

 

どうやって使うか

ターミナルからサーバーにログインして、ターミナルから遠隔操作するわけなんだけれども、どうやってsshログインするかについては2通り方法があり、2つ目が推奨される。

1パスワード認証でログインする

IPアドレスを指定してSSHコマンドを打つだけ。

ssh [ログインユーザー名]@[IPアドレス]

IPアドレスは前にまとめたから大丈夫だと思う。

192.168.***.***的なやつだったからプライベートIPだろう。リモートのIPでいいと思う。

ちょっとこのあたりは後で確定してから修正しよう。

初めてログインする時は本当に接続するか聞かれるのでyesと入力する

するとパスワードを求められるので入力する

これでリモートサーバにsshログイン出来た。

特徴

デフォルの認証方法なので、明示的に無効にしない限りはこれで入れる。

ユーザー名とパスワードは接続先OSのユーザーアカウントの情報が使われる。

セキュリティ的に脆弱なので無効にしてることも多い。

参考記事

https://qiita.com/tag1216/items/5d06bad7468f731f590e

 

2公開鍵でログインする

抑えておくべきとこ

公開鍵と秘密鍵の理解は別の話になりそうだから一旦置いといて

パスワード認証は危ないので普通こっちにする。

公開鍵はサーバーへのSSH通信を始める時に一緒に送る。

秘密鍵は、ローカル環境内に保存しておく(絶対。gitとかにあげんなよ)

 

実際のログイン手順

①公開鍵と秘密鍵を生成(ローカル環境側)

②公開鍵をサーバ側に設置(ローカル環境側→サーバ側)

③公開鍵認証でログイン

 

詳しくみていく

①公開鍵と秘密鍵を生成

1  cd .ssh  で.sshディレクトリに移動

ssh-keygen  -t rsa  で公開鍵と秘密鍵を作成

3 上のコマンドを実行すると 

# 秘密鍵を保存するときの名前は、デフォルト(id_rsa)のままで良いので何もせずにenterキーを押します。
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/hogehoge/.ssh/id_rsa): [秘密鍵の置き場所] 

# 秘密鍵に設定するパスワードを入力(忘れないよう覚えておきましょう)
Enter passphrase (empty for no passphrase): [パスワード]
Enter same passphrase again: [パスワード]

 (上のは抜粋)、という画面になるので

秘密鍵の保存場所と秘密鍵に設定するパスワードを設定する

 

ローカル環境の公開鍵と秘密鍵の保存場所はデフォルトで決まっていて。

公開鍵は~/.ssh/id_rsa.pub

秘密鍵は~/.ssh/id_rsa

に保存される

.sshディレクトリ内でlsしてファイルがあるか確認する。

catコマンドで中も覗けるけど見ても意味はわからん。

 

②公開鍵をサーバ側に設置

1リモートサーバにローカル環境の公開鍵のファイル(id_rsa.pub)をコピーする

scpコマンドを使う。

scpコマンドは、送信先のディクトリを指定してファイルを送ることができるコマンド。このあたりちょこちょこ抜粋使いながら注釈入れてく

# .sshディレクトリにローカル環境の公開鍵のファイル(id_rsa.pub)をコピー
$ scp ~/.ssh/id_rsa.pub [ユーザー名]@ [IPアドレス]:~/.ssh

 

※ただしAWSではpemを使うのでこのコマンドとは異なる。AWSの記事の方で説明する。

2ローカル環境の公開鍵のファイル(id_rsa.pub)の中身をリモートサーバの公開鍵ファイル(~/.ssh/authorized_keys)に保存。

ここ要暗記。

ローカル環境では公開鍵はid_rsa.pubに保存してた。リモートでは.sshディレクトリ内なのは同じだがauthorized_keysというファイルを作って、そこに公開鍵の中身を追記する。

# リモートサーバにログイン
$ ssh [ユーザー名]@ [IPアドレス]

# .sshディレクトリへ移動
$ cd ~/.ssh  

# リモートサーバの公開鍵のファイル(~/.ssh/authorized_keys)を作成
touch .ssh/authorized_keys

# 公開鍵の中身を追記
$ cat ~/id_rsa.pub >> authorized_keys

 

ちょっとわかりづらいがLinuxでは

>で上書き

>>でファイルへの追記

で、矢印が刺さってる側に書き込まれるみたい。

catで中身みてそれを追記してるって解釈でええんやろう。

https://qiita.com/i35_267/items/a19f065691fdc17ae476

 

最後にauthorized_keysファイルの権限を設定する。

.sshディレクトリには読み・書き・実行の全ての権限

authorized_keysファイルには読み・書きの権限を設定

もちろん所有者だけね

chmod 700 ~/.ssh

chmod 600 ~/.ssh/authorized_keys

 

③公開鍵認証でログインできるか確認

秘密鍵が~/.ssh/id_rsaに保存されていればリモートサーバにログインする時に自動的に鍵をしようした接続を行うようになってる。

1リモートサーバにログインする

ssh [ユーザー名]@[IPアドレス]

パスワード入力求められるので秘密鍵に設定してたやつを入力する

2ログインを確認

ログイン出来たら

[ユーザー名]@[IPアドレス]%

となってるはず

 

おしまい。ざっくりまとめても長かったけどこの辺りしっかりわかってないと自分が何やってるかわかんなくなるのでちゃんと理解しとく。

データベース設定

後で追記予定とりあえず最初に参考にしたのはこれ↓

https://qiita.com/YJ2222/items/f07f01c03b681d7a2eb9

 

このあたりは後で読んどくか。どっかでdatabase.ymlの設定について調べてまとめるべきだろう。

https://qiita.com/soutaro/items/bf3e5ec3acce11aa1993

https://note.com/itoa06/n/n31fe4f9cd6b9