【AWS】EC2でのデプロイ（EC2の初期設定）

# 目的
`AWS`のサーバーを利用し、Railsで作成したアプリを公開する。

# 開発環境
macOS: *Big Sur*
Rubyバージョン: *2.6.5*
Railsバージョン: *6.0.0*

# 前提

- `AWS`にてアカウントが作成されている。

# 手順

1. [はじめに](#はじめに)
1. [リージョンの確認](#リージョンの確認)
1. [EC2インスタンスの作成](#ec2インスタンスの作成)
1. [AMIの選択](#amiの選択)
1. [インスタンスタイプの選択](#インスタンスタイプの選択)
1. [キーペアの作成](#キーペアの作成)
1. [サーバー起動の準備](#サーバー起動の準備)
1. [Elastic IPの作成](#elastic-ipの作成)
1. [Elastic IPの紐付け](#elastic-ipの紐付け)
1. [EC2インスタンスの設定変更](#ec2インスタンスの設定変更)
1. [セキュリティグループのポート設定](#セキュリティグループのポート設定)
1. [EC2インスタンスへログイン](#ec2インスタンスへログイン)
1. [必要なツールのインストール](#必要なツールのインストール)
1. [パッケージのアップデート](#パッケージのアップデート)
1. [Node.jsのインストール](#nodejsのインストール)
1. [Yarnのインストール](#yarnのインストール)
1. [rbenvとruby-buildのインストール](#rbenvとruby-buildのインストール)
1. [Rubyのインストール](#rubyのインストール)

# はじめに

`AWS`のサーバーを利用し、アプリを公開していきますが、今回はまず`「AWS内の環境構築」`を行っていきます。
ここで行う設定は、AWSのアカウントを作成した際の一度きりの作業となるので、今後デプロイさせるために同じ作業を行う必要はありません。

# リージョンの確認

それでは早速始めていきます！
まずは、AWSアカウントにルートユーザーでログインし、リージョンを確認します。

リージョンが東京となっていない場合は、メニューから`アジアパシフィック（東京）ap-northeast-1`を選択します。

# EC2インスタンスの作成

続いて、`EC2インスタンス`を作成していきます。

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

トップページ左上の「サービス」から「EC2」を選択し、オレンジ色の「インスタンスを起動」をクリックします。

![EC2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/c53a68ef-286a-7765-e18a-8aae70a53676.png)

# AMIの選択

次に、`AMI`を選択します。

AMIとは、サーバーのデータをまるごと保存したデータのことです。この中には「OS」などが事前にインストールされているものもあるので、自分でゼロから様々なツールをインストールする手間を削減できます。

今回は`Amazon Linux 2 AMI`という、AWSが独自にカスタマイズしたAMIを利用します。

![AMI.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/c6de671f-27ae-2cd8-12a3-8bb82c0aa800.png)


# インスタンスタイプの選択

次に、`EC2インスタンスのタイプ`を選択します。
EC2ではさまざまなインスタンスタイプが用意されており、CPUやメモリなどのスペックを柔軟に指定することができます。

今回は、無料枠で利用できる`t2.micro`を選択して、「確認と作成」をクリックします。

![インスタンスタイプ.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/0040a973-a7f4-fcae-9f87-a7363becd589.png)

次の画面では、「起動」をクリックします。

# キーペアの作成

次に、`キーペア`というものをダウンロードします。
これは、インスタンスへログインする際に必要となる`秘密鍵`のことです。
これがないとEC2インスタンスにログインできないので、必ずダウンロードしてPCに保存しておきます。

「新しいキーペアの作成」を選択して、キーペア名を入力します。

![キーペア.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1337030/6c6d51be-d911-eb08-193d-beee8217038f.png)

この時、キーペアの名前にスペースを含まないようにします。
キーペアのダウンロードが完了すると、クリック出来ない状態になっていた「インスタンスの作成」がクリックできるように変更されます。そちらをクリックして、EC2インスタンスを作成しましょう。

完了画面に遷移した後、「インスタンスの表示」をクリックします。
「インスタンス一覧画面」に戻るので、作成した「インスタンスID」をクリックします。
インスタンスの概要が表示されます。作成した「インスタンスID」はこの後使用するため、コピーしてメモアプリなどに控えておきます。

# サーバー起動の準備

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

それでは実際に「Elastic IPの作成・紐付け」を行っていきます！

# Elastic IPの作成

まずはElastic IPを取得するために、左側の選択欄から「Elastic IP」をクリックしましょう。画面の表示が変わったら「Elastic IP アドレスの割り当て」をクリックします。

画面が遷移したら、「Amazon の IPv4 アドレスプール」にチェックが入ってることを確認します。確認後、「割り当て」をクリックします。

# Elastic IPの紐付け

「取得したElastic IPアドレス」と「EC2インスタンス」を紐付けします。
まずは、右上にある「アクション」をクリックし、表示されたプルダウンから「Elastic IP アドレスの関連付け」を選択します！

画面が遷移したら、インスタンスにチェックが入っていることを確認しましょう。
次に、その下にあるインスタンスの入力欄をクリックすると、メモしたインスタンスIDが表示されるので、表示されたインスタンスIDを選択します。
「最後に関連付ける」をクリックします。
再びインスタンス一覧画面に戻り、作成したインスタンスの「Elastic IP」が設定されていることを確認します。

# EC2インスタンスの設定変更

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

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

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

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

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

それでは実際にポートを設定していきます！

# セキュリティグループのポート設定

以下の手順で、セキュリティグループのポートを設定します。

まず、インスタンスの概要画面下部にある、「セキュリティ」のタブをクリックします。表示が変わったらセキュリティグループの下にある文字列をクリックします。
すると、インスタンスの属するセキュリティグループの設定画面に遷移します。
次に、「インバウンドルール」をクリックし、右上の「インバウンドのルールの編集」をクリックします。
ページが切り替わるので、「ルールの追加」をクリックし、タイプ「HTTP」のポート範囲「80」を追加します。
最後に、右下の「ルールを保存」を押して、ポートの開放は完了です。

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

```:ターミナル
% cd .ssh/
```

pemファイルが存在するか確認します。

```:ターミナル
% ls
```

```:ターミナル
% chmod 600 ダウンロードした鍵の名前.pem
```

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

ssh接続（以下のコマンド）を実行すると以下の様なメッセージが表示されることがありますが、「yes」と入力し、実行してください。

```:ターミナル
% 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)? 

（ここで「yes」を入力し、実行する）
```

ssh接続は、一定時間操作をせずにいるとタイムアウトしてしまいます。その場合は、「ssh -i 〜」のコマンドを再度実行することでサーバーに接続できます。

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

ここからは、EC2インスタンスの環境構築をするためにさまざまなツールをインストールします。
まずは`yumコマンド`というコマンドを使ってこのサーバに元々あるプログラムをアップデートします。

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

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

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

# Node.jsのインストール

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

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo curl -sL https://rpm.nodesource.com/setup_10.x | sudo bash -
```

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install nodejs
```

これで`Node.js`のインストールができました！

# Yarnのインストール

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

ターミナルで以下のコマンドを実行してインストールします。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install wget
```

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo wget https://dl.yarnpkg.com/rpm/yarn.repo -O /etc/yum.repos.d/yarn.repo
```

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ sudo yum -y install yarn
```

`Yarn`のインストールは以上です!

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

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

ターミナルで以下のコマンドを実行してインストールします。

gitから`rbenv`をクローンします。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
```

パスを通す（どのディレクトリからもアプリケーションを呼び出せる状態にする）ために必要なコマンドです。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
```

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
```

設定したパスを読み込みます。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ source .bash_profile
```

gitから`ruby-build`をクローンします。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
```

使用しているRubyのバージョンにおいて、gemのコマンドを使えるようにするために必要なコマンドです。

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash
```

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

# Rubyのインストール

最後は`Ruby`をインストールします。
今回は「2.6.5」をインストールしていきます。

Ruby 2.6.5のバージョンをインストール

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ rbenv install 2.6.5
```

EC2インスタンス内で使用するRubyのバージョンを決める

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ rbenv global 2.6.5
```

rehashを行う

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ rbenv rehash
```

Rubyのバージョンを確認

```:ターミナル（EC2内で実行）
[ec2-user@ip-172-31-25-189 ~]$ ruby -v
```

以上で`Ruby`のインストールが完了しました！

# 最後に

かなり長くなりましたが、以上で初期設定は完了です。
次回はデータベースの設定です。[【AWS】EC2でのデプロイ（データベースの設定）](https://qiita.com/oak1331/items/4bba171c74be654e0feb)
では。