AWSのサーバーを利用する

#目的
開発したアプリケーションを、AWS上で全世界に公開する仕組み・方法を学ぶこと
```＊ ここで行う設定は、AWSのアカウントを作成した際の一度きりの作業となります。なので、今後別のサービスをデプロイさせるために同じ作業を行う必要はありません。```

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

トップページに遷移したら、```左上の「サービス」から「EC2」```を選択しましょう。
次に、オレンジ色の「インスタンスを起動」をクリックします。クリック後、プルダウンで「インスタンスを起動」と表示されるので、クリックします。

次に、「AMI」というものを選択します。
###AMI
AMIとは、「Amazon Machine Image」の略語で、サーバーのデータをまるごと保存したデータのことです。この中には「OS」などが事前にインストールされているものもあるので、自分でゼロから様々なツールをインストールする手間を削減できます。
今回は「 Amazon Linux AMI 2 」という、AWSが独自にカスタマイズしたAMIを利用しましょう。
次に、「EC2インスタンスのタイプ」を選択します。
EC2ではさまざまなインスタンスタイプが用意されており、CPUやメモリなどのスペックを柔軟に指定することができます。
今回は、無料枠で利用できる「t2.micro」を選択して、「確認と作成」をクリックしましょう。
次の画面では、「起動」をクリックします。
次に、「キーペア」というものをダウンロードします。

###キーペア
インスタンスへログインする際に必要となる「秘密鍵」のことです。
これがないとEC2インスタンスにログインできないので、必ずダウンロードしてPCに保存しておきましょう。また、間違って他人に渡さないよう気をつけてください。
「新しいキーペアの作成」を選択して、キーペア名を入力しましょう。キーペアの名前はご自身で決めて大丈夫です。
キーペアのダウンロードが完了すると、クリック出来ない状態になっていた「インスタンスの作成」がクリックできるように変更されます。そちらをクリックして、EC2インスタンスを作成しましょう。
すると以下のような完了画面に遷移します。「インスタンスの表示」をクリックしましょう。
![スクリーンショット 2021-01-04 10.39.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/a444a895-179e-7503-5802-63a51c6518ad.png)

「インスタンス一覧画面」に戻るので、「インスタンスID」列の一番上をクリックしましょう。

以下の画面にインスタンスの概要が表示されています。作成した「インスタンスID」をコピーしてメモアプリなどに控えておきましょう。
![スクリーンショット 2021-01-04 10.41.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/77b736eb-3a50-5c02-da1b-437a4d114c7c.png)

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

まずはElastic IPを取得するために、左側の選択欄から「Elastic IP」をクリックしましょう。画面の表示が変わったらオレンジで表示されている「Elastic IP アドレスの割り当て」をクリックします。
![スクリーンショット 2021-01-04 10.45.05.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/076f2fd6-db75-35bd-7172-1fdebde80ece.png)

画面が遷移したら、「Amazon の IPv4 アドレスプール」にチェックが入ってることを確認しましょう。確認後、「割り当て」をクリックします。
「取得したElastic IPアドレス」と「EC2インスタンス」を紐付けましょう。まずは、右上にある「アクション」をクリックします。表示されたプルダウンから「Elastic IP アドレスの関連付け」を選択しましょう。

画面が遷移したら、インスタンスにチェックが入っていることを確認しましょう。次に、そのしたにあるインスタンスの入力欄をクリックすると、メモしたインスタンスIDが表示されます。表示されたインスタンスIDを選択しましょう。その下の入力欄は、空欄で大丈夫です。最後に「関連付ける」をクリックしましょう。
![スクリーンショット 2021-01-04 10.47.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/0d0ece42-fdb1-2651-5def-0cd219940d67.png)

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

#EC2インスタンスの設定を変える
立ち上げたばかりのEC2インスタンスは「ssh」でアクセスすることはできますが、HTTPなどの他の接続は一切つながらないようになっています。そのため、サーバーとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要があります。
```「ssh」```は、離れた場所にあるサーバーの中で作業を行いたい場合に利用します。暗号や認証の技術を利用して、安全にリモートサーバーと通信できます。
```「ポート」```とは、1つのサーバーとクライアントを繋ぐ仕組みです。ポートにはそれぞれ番号が割り振られており、リクエスト側はポート番号を指定すれば該当する番号のポートに接続されます。
ポート番号には「0〜65535」までを使うことができます。しかし、「0〜1023」までの番号はよく使われるもので基本的なインターネット接続などのポートとして予約されており、自由に使うことはできません。
このポートの設定をするためには、「セキュリティグループ」という設定を変更する必要があります。
```「セキュリティグループ」```とは、EC2インスタンスが属するまとまりのようなもので、複数のEC2インスタンスのネットワーク設定を一括で行うためのものです。
それでは実際にポートを設定しましょう。

まず、インスタンスの概要画面下部にある、「セキュリティ」のタブをクリックします。表示が変わったらセキュリティグループの下にある文字列をクリックしましょう。図中では「launch-wizard-1」と文字列の最後にあります。2回目以降のセキュリティグループの設定では、「launch-wizard-2」となり設定ごとに数字が増えていきます。
![スクリーンショット 2021-01-04 10.57.33.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/22473e41-24a5-940d-ef38-ebdf0600d439.png)
すると、インスタンスの属するセキュリティグループの設定画面に遷移します。
次に、「インバウンドルール」をクリックし、右上の「インバウンドのルールの編集」をクリックします。

ページが切り替わるので、「ルールの追加」をクリックし、画像の①~⑦の手順通りに設定しましょう。

![スクリーンショット 2021-01-04 11.00.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/a4501bbf-90c1-fc4a-a71f-51a86c901d81.png)

「0.0.0.0」や「::/0」は「すべてのアクセスを許可する」という意味です。
以上で、ポートの開放が完了です。
#EC2インスタンスへログインしよう
EC2インスタンスを作成すると、「ec2-user」というユーザーと対応するssh秘密鍵が生成されました。本来はこのec2-userではなく、サービスを稼働させるためにより権限を小さくしたユーザーを作成して運用しますが、ここでは簡易化のためにこの「ec2-user」を使って作業を進めていきます。
それでは「ec2-user」を使ってログインしましょう。

```
% cd ~
```

```
% mkdir ~/.ssh

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

```
% mv Downloads/ダウンロードした鍵の名前.pem .ssh/

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

```
cd .ssh/
```

```
% ls

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

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

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

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

# 「作成したEC2インスタンスと紐付けたElastic IP」は以下の画像を参照し、ご自身のものに編集しましょう
```
![スクリーンショット 2021-01-04 11.26.02.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/2c1d59c3-4504-b05b-a85c-dc3652838cee.png)
ssh接続（以下のコマンド）
先ほどのコマンドを打ち以下のようなコマンドが出てきたらyesを打ちましょう。

```
% ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
The authenticity of host '作成したEC2インスタンスと紐付けたElastic IP (作成したEC2インスタンスと紐付けたElastic IP)' can't be established.
RSA key fingerprint is eb:7a:bd:e6:aa:da:~~~~~~~~~~~~~~~~~~~~~~~~.
Are you sure you want to continue connecting (yes/no)? 

（ここで「yes」を入力し、実行する）
```
ターミナルのコマンド待ちの際の左側の表示が、以下の画像のようになればログイン成功です。
![スクリーンショット 2021-01-04 11.31.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/918688/1cfd84cf-1712-195d-5cee-c62c2ea1c984.png)
```ssh接続は、一定時間操作をせずにいるとタイムアウトしてしまいます。その場合は、「ssh -i 〜」のコマンドを再度実行することでサーバーに接続できます。```
#設定に必要なツールをインストールしよう
まずはyumコマンドというコマンドを使ってこのサーバに元々あるプログラムをアップデートします。こうしたプログラムをパッケージと呼びます。
###yumコマンド
「yumコマンド」とは、Linuxにおけるソフトウェア管理の仕組みです。MacOSにとってのhomebrewと同じ役割を果たします。yumコマンドを利用することで、yumの管理下にあるプログラムのバージョンを管理したり、一括でアップデートしたりできます。
###パッケージ
「パッケージ」とは、LinuxOS下におけるある役割/機能をもったプログラムの集合のことです。「ソフトウェア」や「ライブラリ」とも呼べます。
あくまでもLinuxOSでは「ある役割/機能をもったプログラムの集合のことをパッケージと呼ぶよ」ということです。
ターミナル（EC2内で実行）

```
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y update
```
次に、その他環境構築に必要なパッケージを諸々インストールします。
ターミナル（EC2内で実行）

```
[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
```
###-yオプション
「-yオプション」とは、yumコマンドのオプションです。yum install などのコマンドでは、本当にインストールして良いのか [y/n]（「Yes or No」の意味）が問われます。
この場合、「Y（Yesのイニシャル）」を入力し、Enterキーを押して実行すればインストールされます。しかし、誤ってYキー以外を押してしまう場合もあります。 ここでは確実にインストールするために、あらかじめオプションで「-y」を設定する事で「すべての問いにYesで自動的に答える」という設定してコマンドを実行しています。
無事に入力画面に戻れば、インストール完了です。

続いて、EC2上で```JavaScriptを動かすためにNode.js```というものをインストールします。
```「Node.js」```とは、サーバーサイドで動くJavaScriptのパッケージのことです。今後のデプロイに向けた作業の中で、CSSや画像を圧縮する際に活用されます。

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

Railsのバージョンが6.0以降のアプリケーションを動かすために、Yarnをインストールします。
```「Yarn」```とは、Railsに搭載されているJavaScriptのパッケージを管理するためのパッケージマネージャーです。

```
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install wget
[ec2-user@ip-172-31-25-189 ~]$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install yarn
```

続いては、「rbenv」と「ruby-build」をインストールします。
これらはRubyをインストールする前に、インストールする必要があり、Rubyのバージョンを管理する際に組み合わせて使うツールになります。

```
# ①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  
```
各項目の役割
①	gitから「rbenv」をクローンします。
②＆③	パスを通す際に必要なコマンドです。パスを通すとは、「どのディレクトリからもアプリケーションを呼び出せる状態にする」ということです。
④	設定したパスを読み込みます。
⑤	gitから「ruby-build」をクローンします。
⑥	使用しているRubyのバージョンにおいて、gemのコマンドを使えるようにするために必要なコマンドです。

最後は「Ruby」をインストールします。
以下で実行するコマンド群は、「インストールするRubyのバージョン」「自身のアプリケーションで使っているRubyのバージョン」によって適宜変更してください。

ここでは「2.6.5」をインストールしていきます。

```
# Ruby 2.6.5のバージョンをインストール
[ec2-user@ip-172-31-25-189 ~]$ rbenv install 2.6.5

# EC2インスタンス内で使用するRubyのバージョンを決める
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 2.6.5

# rehashを行う
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash  

# Rubyのバージョンを確認
[ec2-user@ip-172-31-25-189 ~]$ ruby -v 
```
「Ruby」のインストールは以上です。

次回はデーターベースの設計です