AWSでアプリをデプロイする方法(EC2の初期設定編)

# EC2インスタンスを理解し、初期設定をするところまでを紹介します！(学習記録):sunrise:


### EC2インスタンスとは
EC2インスタンスとはAWSで「仮想マシン」と呼ばれるものです。「サーバーを生成する」といっても、AWSがすべてのサーバーを物理的に用意しているわけではなく、実際には「仮想マシン」と呼ばれるソフトウェアを利用して、仮想的に1つのLinuxサーバーを利用できる仕組みを利用します。

#### 1: EC2インスタンスを作成（Rails仕様）
1.AWSのトップページに移り、画面左上のサービスという欄からEC２を選択しインスタンスを起動をクリック!

2.次にAMIを選択します。無料枠で利用できるAmazon Linux 2 AMIを利用します！
AMIとは、「Amazon Machine Image」の略語で、サーバーのデータをまるごと保存したデータのことです。この中には「OS」などが事前にインストールされているものもあるので、自分でゼロから様々なツールをインストールする手間を削減できます。

3.EC2インスタンスのタイプを選択します。無料枠で利用できる t2.micro を選択します！
EC2ではさまざまなインスタンスタイプが用意されており、CPUやメモリなどのスペックを柔軟に指定することができます。選択できたら、確認と作成をクリック！次の画面で起動をクリック！

4.キーペアをダウンロード
新しいキーペアを選択して、キーペアをダウンロードをクリック！その後にインスタンスを作成をクリックします！その後インスタンス一覧画面に移動し、作成したインスタンスがあることを確認してみてください！
その後、そのインスタンスをクリックし、インスタンスIDをコピーしましょう！
キーペアとはインスタンスへログインする際に必要となる「秘密鍵」のことです。
これがないとEC2インスタンスにログインできないので、必ずダウンロードしてPCに保存しておきましょう。また、間違って他人に渡さないよう気をつけてください。

5.サーバーを起動させる準備
さきほど作成した「EC2インスタンス」には、作成時にIPアドレスが自動で割り振られています。これを「パブリックIP」と言います。しかし、サーバーを再起動させるたびにこのパブリックIPが変わってしまうという欠点を持っています。IPが変わってしまうということは、設定ファイル等をその都度書き換えなければいけません。これを解決してくれるのが「Elastic IP」です。

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

サイドバーにあるElastic IPという項目をクリック！そして、Elastic IPアドレスの割り当てをクリックします！画面が遷移したら、「Amazon の IPv4 アドレスプール」にチェックが入ってることを確認しましょう。確認後、「割り当て」をクリックします。

.Elastic IPの紐付け
「取得したElastic IPアドレス」と「EC2インスタンス」を紐付けましょう。まずは、右上にある「アクション」をクリックします。表示されたプルダウンから「Elastic IP アドレスの関連付け」を選択しましょう。
アクションという項目をクリックし、Elastic IPアドレスの関連付けをクリックしましょう！
画面が遷移したら、インスタンスにチェックが入っていることを確認しましょう。次に、そのしたにあるインスタンスの入力欄をクリックすると、メモしたインスタンスIDが表示されます。表示されたインスタンスIDを選択しましょう。その下の入力欄は、空欄で大丈夫です。最後に「関連付ける」をクリックしましょう。

・Elastic IPが設定されているか確認
再びインスタンス一覧画面に戻り、作成したインスタンスの「Elastic IP」が設定されていることを確認しましょう。
以降、このIPアドレスはあなたの所有物のようになり、意図的にAWSに返却しない限り、変更されることはありません。

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

##### ・ssh
「ssh」は、離れた場所にあるサーバーの中で作業を行いたい場合に利用します。暗号や認証の技術を利用して、安全にリモートサーバーと通信できます。

##### ・ポート
「ポート」とは、1つのサーバーとクライアントを繋ぐ仕組みです。ポートにはそれぞれ番号が割り振られており、リクエスト側はポート番号を指定すれば該当する番号のポートに接続されます。
ポート番号には「0〜65535」までを使うことができます。しかし、「0〜1023」までの番号はよく使われるもので基本的なインターネット接続などのポートとして予約されており、自由に使うことはできません。

このポートの設定をするためには、「セキュリティグループ」という設定を変更する必要があります。

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

・実際にセキュリティグループのポートを設定
まず、インスタンスの概要画面下部にある、「セキュリティ」のタブをクリックします。表示が変わったらセキュリティグループの下にある文字列をクリックしましょう!
すると、インスタンスの属するセキュリティグループの設定画面に遷移します。
次に、「インバウンドルール」をクリックし、右上の「インバウンドのルールの編集」をクリックします。
ルールを追加します！例えば　タイプ：HTTP、プロトコル：TCP,ポート範囲：80,送信元：カスタム/0.0.0.0/0などがあります！
追加したらルールを保存をクリック！以上で、ポートの開放が完了です！

#### EC2インスタンスへログイン
EC2インスタンスを作成すると、「ec2-user」というユーザーと対応するssh秘密鍵が生成されました。本来はこのec2-userではなく、サービスを稼働させるためにより権限を小さくしたユーザーを作成して運用しますが、ここでは簡易化のためにこの「ec2-user」を使って作業を進めていきます!
それでは「ec2-user」を使ってログインしましょう!

```
# ターミナル（ローカル）
% cd ~

# .sshというディレクトリを作成
# File existsとエラーが表示されたとしても、.sshディレクトリは存在しているのということなので、そのまま進みましょう。
% mkdir ~/.ssh

# mvコマンドで、ダウンロードしたpemファイルを、ダウンロードディレクトリから、.sshディレクトリに移動します。
# 「ダウンロードした鍵の名前」の部分は、Finderでダウンロードフォルダから「〜.pem」というファイルを探し、「〜」の部分の名前に置き換えてください。
% mv Downloads/ダウンロードした鍵の名前.pem .ssh/

# sshディレクトリに移動
% cd .ssh/

# pemファイルが存在するか確認しましょう
% ls

# 「ダウンロードした鍵の名前」はFinderのダウンロードフォルダから探しましょう（見つからない場合は他のフォルダを探しましょう）
% chmod 600 ダウンロードした鍵の名前.pem

# 「作成したEC2インスタンスと紐付けたElastic IP」は、ご自身のものに編集しましょう
# サイドバーから、インスタンスという項目をクリックし、下部にある説明のなかのElastic IP をコピー
% ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
```

#### 必要なツールをインストール

・まずはyumコマンドというコマンドを使ってこのサーバに元々あるプログラムをアップデートします。こうしたプログラムをパッケージと呼びます。

##### ・yumコマンドとは
「yumコマンド」とは、Linuxにおけるソフトウェア管理の仕組みです。MacOSにとってのhomebrewと同じ役割を果たします。yumコマンドを利用することで、yumの管理下にあるプログラムのバージョンを管理したり、一括でアップデートしたりできます。

##### ・パッケージとは
「パッケージ」とは、LinuxOS下におけるある役割/機能をもったプログラムの集合のことです。「ソフトウェア」や「ライブラリ」とも呼べます。
あくまでもLinuxOSでは「ある役割/機能をもったプログラムの集合のことをパッケージと呼ぶよ」ということです。

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

```
# ターミナル（EC2で実行）
[ec2-user@<自身のElastic IP> ~]$ sudo yum -y update

# 次に、その他環境構築に必要なパッケージを諸々インストールします
[ec2-user@<自身のElastic IP> ~]$ 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

```

#### EC2でJavaScriptを動かすための準備

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

##### EC2にNode.jsをインストール
```
[ec2-user@<自身のElastic IP> ~]$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
[ec2-user@<自身のElastic IP> ~]$ sudo yum -y install nodejs
```
これで、「Node.js」のインストールは以上です。

##### ・Yarn
「Yarn」とは、Railsに搭載されているJavaScriptのパッケージを管理するためのパッケージマネージャーです。

##### EC2にYarnをインストール

```
[ec2-user@<自身のElastic IP> ~]$ sudo yum -y install wget
[ec2-user@<自身のElastic IP> ~]$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
[ec2-user@<自身のElastic IP> ~]$ sudo yum -y install yarn
```
これで、「Yarn」のインストールは以上です。


##### EC2にrbenvとruby-buildをインストールします！

```
# ①rbenvのインストール
[ec2-user@<自身のElastic IP> ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv 

# ②パスを通す
[ec2-user@<自身のElastic IP> ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 

# ③rbenvを呼び出すための記述
[ec2-user@<自身のElastic IP> ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile

# ④.bash_profileの読み込み
[ec2-user@<自身のElastic IP> ~]$ source .bash_profile

# ⑤ruby-buildのインストール
[ec2-user@<自身のElastic IP> ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

# ⑥rehashを行う
[ec2-user@<自身のElastic IP> ~]$ rbenv rehash  
```

##### 最後にEC2にRubyをインストール
ここでは「2.6.5」をインストールしていきます。

```
# Ruby 2.6.5のバージョンをインストール
[ec2-user@<自身のElastic IP> ~]$ rbenv install 2.6.5

# EC2インスタンス内で使用するRubyのバージョンを決める
[ec2-user@<自身のElastic IP> ~]$ rbenv global 2.6.5

# rehashを行う
[ec2-user@<自身のElastic IP> ~]$ rbenv rehash  

# Rubyのバージョンを確認
[ec2-user@<自身のElastic IP> ~]$ ruby -v 
```
以上がEC2の初期設定（Rails仕様）になります！参考までにどうぞ！