はじめてAWSでデプロイする方法⑥（EC2サーバーにAppをクローンしてアップロード）

# 前回までの記事
[はじめてAWSでデプロイする方法①（インスタンスの作成）](https://qiita.com/nousi/items/f0ab345402362e43db80)
[はじめてAWSでデプロイする方法②（Elastic IPの作成と紐付け）](https://qiita.com/nousi/items/0fe964f0be7e1cfa2ca1)
[はじめてAWSでデプロイする方法③（AWSセキュリティグループの設定）](https://qiita.com/nousi/items/cd2d937e9faf0c0c669c)
[はじめてAWSでデプロイする方法④（EC2インスンタンスにSSHログイン）](https://qiita.com/nousi/private/f4e44f5f88cca6fdbcff)
[はじめてAWSでデプロイする方法⑤（EC2の環境構築、Ruby, MySQL）](https://qiita.com/nousi/private/f4e44f5f88cca6fdbcff)

EC2インスタンス（サーバー）を作成し、パブリックIPをElastic IPで固定。
一般ユーザーがアクセスできるように、セキュリティグループの設定を追加（入り口を作成）
IDとPWを使って、EC2にログインして、環境構築をしました。

ざっくり説明すると、こんなところです。

今回はWEB AppをEC2インスタンスにアップロードしていきます。

# WEB AppをEC2にクローンする
### 現段階
EC2サーバにアプリケーションのコードをクローンしようとしてもpermission deniedとエラーが出てしまいます。

### 原因
Githubから見てこの許可していないEC2インスタンスを拒否する
### 対策
EC2インスタンスのSSH公開鍵をGithubに登録する。

SSH鍵をGithubに登録すると、Githubはそれを認証してクローンを許可をだす


## 作業

### EC2サーバのSSH鍵ペアを作成
1. EC2にログイン
2. キーペア作成のためコマンドを入力

```
[ec2-user@ip-172-31-23-189 ~]$ ssh-keygen -t rsa -b 4096
```
3.下記が表示されるので、エンターを押す

```
Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa):
```
4.さらにエンターを押す（２回）

```
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              |
+-----------------+
```
5.SSH公開鍵を表示し、値をコピーするため、下記コマンドを実装

```
[ec2-user@ip-172-31-23-189 ~]$ cat ~/.ssh/id_rsa.pub
```
6.catで表示させた公開鍵（長いテキスト）をコピー
![スクリーンショット 2020-01-12 11.44.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/5ca0b98e-b8bd-21d2-7bd8-cb9210fd6639.png)
### コピーした公開鍵をGithubにアクセスして登録する
1. [https://github.com/settings/keys](https://github.com/settings/keys)にアクセス

![スクリーンショット 2020-01-12 11.54.04.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/49e344f5-45b4-eee0-fed5-e5a880c6c4d2.png)
2. 画面右上の緑色の『　NEW SSH KEY　』をクリック
[![Image from Gyazo](https://i.gyazo.com/5be66aa56acb45588159ac994b090bd3.gif)](https://gyazo.com/5be66aa56acb45588159ac994b090bd3)
3. タイトルを記入する（なんでも可能）
![スクリーンショット 2020-01-12 12.00.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/70fcdc3d-bc5e-f1b2-d73c-50565aacd1a6.png)
4. 公開鍵（ssh-rsaから）を貼り付け
![スクリーンショット 2020-01-12 12.00.56.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/2ad07c7a-6f35-be3e-96a8-eedb69aa0b52.png)
エラー「Key is invalid. You must supply a key in OpenSSH public key format」が表示された場合、
貼り付けたコードに『　ssh-rsa　』が含まれているかご確認ください
![スクリーンショット 2020-01-12 12.00.08.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/e378596e-bcb8-9685-f434-26c412400d23.png)
5. 『　Add SSH KEY　』をクリックして保存。
6. GithubのPWを入力
![スクリーンショット 2020-01-12 11.59.26.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/4bb72ca0-f477-43d6-fb01-2bbd8dff7810.png)
7. 完了
![スクリーンショット 2020-01-12 11.52.46.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/72853d69-8d09-428d-188e-86f03e484f58.png)
8. 登録できているか確認

```
[ec2-user@ip-172-31-23-189 ~]$ ssh -T git@github.com
```
下記の表示が出た場合： 『　yes　』を選択



```
The authenticity of host 'github.com (IP ADDRESS)' can't be established.
RSA key fingerprint is 16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48.
Are you sure you want to continue connecting (yes/no)?
```

この際に

```
Warning: Permanently added the RSA host key for IP address '52.111.11.11' to the list of known hosts.
```
と表示された場合は, EC2に入り直しましょう。更新されたのでエラーなく入れます。
成功すると、下記の表示になるはずです。


または、下記が表示された場合： 『　yes　』を選択

```
The authenticity of host 'github.com (IP ADDRESS)' can't be established.
RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8.
Are you sure you want to continue connecting (yes/no)?
```
成功すると下記の表示が出る

```
[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.
```

[参考：GitHub公式](https://help.github.com/ja/github/authenticating-to-github/testing-your-ssh-connection)

### App側でUnicornのインストール
EC2にGit クローンする前に、準備としてUnicornをインストールさせましょう
Gemfileにgem'unicorn'を追加

```Gemfile.
group :production do
  gem 'unicorn', '5.4.1'
end
```
bundle installでインストール

```
$ bundle install
```
config/unicorn.rbを作成
![スクリーンショット 2020-01-12 19.02.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/a0f9ccb2-32ca-e685-7da0-e487b4ef8960.png)
追加したunicorn.rbに下記を記述

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

```
production.rbを開き、下記の記述をコメントアウトする

```config/environments/production.rb
config.assets.js_compressor = :uglifier
```
```config/environments/production.rb
#config.assets.js_compressor = :uglifier
```
### アプリケーションの保存先となるディレクトリを作成
ディレクトリの作成

```
#/var/wwwディレクトリを作成(後述するCapistranoの初期値がwwwなので、ディレクトリをwwwに設定しています）
[ec2-user@ip-172-31-23-189 ~]$ sudo mkdir /var/www/
```
作成したディレクトリをchownコマンドで権限設定

```
#作成したwwwディレクトリの権限をec2-userに変更
[ec2-user@ip-172-31-23-189 ~]$ sudo chown ec2-user /var/www/
```
作成したディレクトリに移行

```
[ec2-user@ip-172-31-23-189 ~]$ cd /var/www/
```
### git clone でAppをEC2にダウンロード
GithubからGit cloneするためのリポジトリURLを取得
![スクリーンショット 2020-01-12 21.42.36.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/455403/cf64f15c-f070-58fe-a5ac-0b6a9b59fe0c.png)


git clone で作成したディレクトリにappをクローン

```
[ec2-user@ip-172-31-23-189 www]$ git clone リポジトリURL
```
Githubのアカウント名とPWを入力し、
ダウロードが開始される

```
remote: Enumerating objects: 298, done.
remote: Counting objects: 100% (298/298), done.
remote: Compressing objects: 100% (190/190), done.
remote: Total 298 (delta 109), reused 274 (delta 86), pack-reused 0
Receiving objects: 100% (298/298), 58.53 KiB | 365.00 KiB/s, done.
Resolving deltas: 100% (109/109), done.
```

完了

これで、EC2にAppがクローンされています。

# 次回はEC2にgemをインストールと設定の変更
次回の記事はこちら
[はじめてAWSでデプロイする方法⑦（EC2サーバーにAppをクローンしてアップロード）](https://qiita.com/mylevel/items/22d99df2e85dd6146653)