AWS内の環境構築(AWSの設定とEC2インスタンスの生成と環境構築)

##AWSのアカウントを登録
まずは[AWSのサイト](https://aws.amazon.com/jp/)で**アカウントを登録**してください。
順番としてはサインアップボタンを押し、AWSアカウント情報を登録してください。
AWSアカウント情報を登録したら次にサポートプランを選択するのですが、最初は無料のベーシックプランでいいと思います。
これでアカウントが作成されました。数分後に、登録したメールアドレスに確認メールがきます。
[AWSコンソールにサインイン](https://aws.amazon.com/jp/)すると、アカウント情報を登録する最初の画面に戻ってきます。今回は、先ほど登録したメールアドレスとパスワードを入力して、サインインします。
##AWSアカウントのリージョン設定
リージョンとは、AWSの物理的なサーバの場所を指定するものです。
リージョン間でEC2の設定は独立していて、あるリージョンのEC2を他のリージョンへ移動することはできません。なので、EC2を立ち上げる際には、「どのリージョンの設定か」を意識しておきます。
リージョンは**アジアパシフィック(東京)**を選びます。
##EC2インスタンスの作成
「サーバーを生成する」といっても、AWSが全てのサーバを物理的に用意しているわけではなく、実際には「仮想マシン」と呼ばれるソフトウェアを利用して、仮想的に一つのLinuxサーバを利用できる仕組みを利用します。この「仮想マシン」のことをAWSでは「EC2インスタンス」と呼んでいます。
ちなみにEC2インスタンス作成の作業が2回目以降は、費用が発生する場合があります。
[こちら](https://aws.amazon.com/jp/)でAWSアカウントにログインし、トップページに遷移したら、左上の「サービス」から「EC2」を選択します。
操作画面を旧バージョンに切り替えるときは、左上のスイッチのアイコンをクリックします。今回は旧バージョンで作業します。
次に、アンケート用のダイアログが開くのでキャンセルします。
次に、「インスタンスの作成」をクリックしてください。
左上にAMIの選択が出てるか確認したら、今回は**Amazon Linux AMI**を選んでいきます。
ちなみにAMIとは、サーバのデータをまるごと保存したデータのことです。この中には、OSやWEBサーバなどが事前にインストールされているものもあり、自分でゼロからインストールする手間を削減することができます。
次に、**EC2インスタンスのタイプ**を選択します。EC2ではさまざまなインスタンスタイプが用意されており、CPUやメモリなどのスペックを柔軟に指定することができます。
今回は、無料枠で利用できる**t2.micro**を選択します。
次に、**起動をクリック**します。
次に、**キーペアのダウンロード**をします。
内容を確認する際に、「キーペア」をダウンロードすることが出来ます。こちらはインスタンスにSSHでログインする際に必要となる「秘密鍵」です。これがないとEC2インスタンスにログインできないので、必ずダウンロードしてパソコンに保存しておきます。また、間違って他人に渡さないよう気をつけましょう。
キーペアの名前はご自身で決めて大丈夫です。
ちなみにキーペアの名前にスペースが含まれているとこの後の作業でエラーが発生する可能性があります。スペースを含まない名前の秘密鍵を作成するようにしましょう。
次は、**インスタンスの作成**をします。
キーペアのダウンロードが完了すると、クリック出来ない状態になっていた**インスタンスの作成**が、クリックできるように変更されます。そちらをクリックして、EC2インスタンスを作成します。
その後、インスタンス一覧画面に戻り、作成した**インスタンスID**をコピーしてメモしておきましょう。
##Elastic IPの作成と紐付け
先ほど作成したEC2インスタンスには、作成時にIPアドレスが自動で割り振られています。これをパブリックIPと言います。しかし、サーバーを再起動させるたびにこのパブリックIPが変わってしまうという欠点を持っています。IPが変わってしまうということは、設定ファイル等をその都度書き換えなければいけません。これを解決してくれるのが、Elastic IPです。
Elastic IPとはAWSから割り振られた固定のパブリックIPアドレスのことを言います。このパブリックIPアドレスをEC2インスタンスに紐付けることで、インスタンスの起動、停止に関わらず常に同じIPアドレスで通信をすることが可能になります。
**Elastic IP**をクリックして、**新しいアドレスの割り当て**をクリックします。
次に、**Amazonプール**を選択し、**割り当て**をクリックし、確認してから**閉じる**をクリックしてください。
次に、取得したElastic IPアドレスを、作成したEC2インスタンスと紐付けます。
**アクション**をクリックし、**アドレスの関連付け**をクリックします。
次に、**プルダウンで先ほどメモしたインスタンス**を選択し、**関連付け**をクリックします。プライベートIDは入力しません。
再びインスタンス一覧画面に戻り、作成したインスタンスの「パブリック IP」と「Elastic IP」が同じものに設定されていることを確認します。
以降、このIPアドレスはあなたの所有物のようになり、意図的にAWSに返却しない限り、変更されることはありません。
##ポートを開く
立ち上げたばかりのEC2インスタンスはSSHでアクセスすることはできますが、HTTPなどの他の接続は一切つながらないようになっています。そのため、WEBサーバとして利用するEC2インスタンスは事前にHTTPがつながるように「ポート」を開放する必要があります。
ポートの設定をするためには、「セキュリティグループ」という設定を変更する必要があります。
セキュリティグループとは、EC2インスタンスが属するまとまりのようなもので、複数のEC2インスタンスのネットワーク設定を一括で行うためのものです。
次は、セキュリティグループのポートを設定します。
まず、EC2インスタンス一覧画面から、対象のインスタンスを選択し、**セキュリティグループ**のリンクをクリックします。
次に、インスタンスの属するセキュリティグループの設定画面に移動するので、**インバウンド**タブの中の**編集**をクリックします。
次に、モーダルが開くので、**ルールの追加**をクリックします。
タイプを**HTTP**、プロトコルを**TCP**、ポート範囲を**80**、送信元を**カスタム / 0.0.0.0/0, ::/0**に設定し、**保存**をクリックします。「0.0.0.0」や「::/0」は「全てのアクセスを許可する」という意味です。
これで、ポートの開放が完了です。
この作業が終わっていないと、WEBサーバを起動した時にアクセスできなくなります。
##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ディレクトリに移動します。

$ cd .ssh/

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

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

$ ssh -i ダウンロードした鍵の名前.pem ec2-user@作成したEC2インスタンスと紐付けたElastic IP
#（例えばElastic IPが123.456.789であれば、shh -i ダウンロードした鍵の名前.pem ec2-user@123.456.789 というコマンドになります）
#（ダウンロードした鍵を用いて、ec2-userとしてログイン）
```
**ダウンロードした鍵の名前**の部分は、直前にご自身がダウンロードした.pemというファイルの名前に置き換えてください。
pemキーが本当にDownloads以下に存在するかFinderで確認できます。
Elastic IPの確認は**インスタンス**をクリックし、**Elastic IP**の値をターミナルに入力します。
以下の様なメッセージが表示されることがありますが、「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)? 
```
ターミナルのコマンド待ちの際の左側の表示が
[ec2-user| ...
となればログイン成功です。ターミナル(ローカル)が今までのターミナルで、[ec2-user| ...は今後ターミナル（サーバー）と表記していきます。ターミナルを間違えないようにお願いします。
ちなみに、ssh接続は一定時間操作をせずにいると、タイムアウトしてしまいます。その場合は、同じコマンドを実行することで、サーバに接続できます。
次に、EC2インスタンスの環境構築を行います。
##設定用のツールをインストール
最初にyumというコマンドを使ってこのサーバに元々あるプログラムをアップデートします。こうしたプログラムをパッケージと呼びます。
###yumコマンド
Linuxにおけるソフトウェア管理の仕組みです。MacOSにとってのhomebrewと同じ役割を果たします。yumコマンドを利用することで、yumの管理下にあるプログラムのバージョンを管理したり、一括でアップデートしたりできます。
###パッケージ
LinuxOS下における、ある役割/機能をもったプログラムの集合です。ソフトウェアとも、ライブラリとも呼べます。
あくまでもLinuxOSでは、ある役割/機能をもったプログラムの集合のことをパッケージと呼ぶよ、ということです。
ターミナルで以下のコマンドを実行しパッケージをアップデートします。
ターミナル（サーバー）

```
[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
```
###-yコマンドについて
-y はyumコマンドのオプションです。yum install などのコマンドでは、本当にインストールして良いのか [y/n]のようにYes or Noが問われます。この場合はYキーを押してEnterキーを押せば正常どおりインストールが行われます。しかし、初見であったり誤ってYキー以外を押してしまう場合もあります。 ここでは確実にインストールするために、予めオプションで-yを設定する事で全ての問いにYesで自動的に答えるように設定してコマンドを実行しましょう。
もし誤ってオプションを忘れてしまうと下記のような問いが発生しますので、Yキーを押し次にEnterキーを押してインストールを完了して下さい。
ターミナル（サーバー）

```
総ダウンロード容量: 120 M
Is this ok [y/d/N]:
```
無事に入力画面に戻れば、インストール完了です。
次に、EC2上でJavaScriptを動かすためにNode.jsというものをインストールします。
###Node.js
サーバーサイドで動くJavaScriptのパッケージです。今後のデプロイに向けた作業の中で、CSSや画像を圧縮する際に活用されます。
ターミナル（サーバー）

```
[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
```
こちらも確認画面が出てきた場合は、「y」→returnキーで確定してください。
これでNode.jsのインストールは完了です。
次に、rbenvとruby-buildをインストールします。
rbenvとruby-buildは、Rubyのバージョンを管理する際に組み合わせて使うツールになります。これらはRubyをインストールする前に、インストールする必要があります。
ruby-buildはrbenvのプラグインであり、ruby-buildによってRubyの様々なバージョン(2.0.0など)をインストールすることができます。
rbenvを使用することで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  
```
1つ目のコマンドは、gitからrbenvをクローンしています。
2つ目と3つ目のコマンドは、パスを通す際に必要なコマンドです。パスを通すとは、どのディレクトリからもアプリケーションを呼び出せる状態にするということです。
4つ目のコマンドで、設定したパスを読み込んでいます。
5つ目のコマンドは、gitからruby-buildをクローンしています。
最後のコマンドは、使用しているRubyのバージョンにおいて、gemのコマンドを使えるようにするために必要なコマンドです。
これでrbenvとruby-buildのインストールは完了です。
次は、Rubyをインストールします。
以下で実行するコマンド群は、インストールするRubyのバージョン、自身のアプリケーションで使っているRubyのバージョンによって適宜変更してください。
ここでは、2.5.1をインストールしていきます。
ターミナル（サーバー）

```
[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 # バージョンを確認
```
1つ目のコマンドで、Rubyの2.5.1のバージョンをインストールしています。
2つ目のコマンドは、EC2インスタンス内で使用するRubyのバージョンを決めるものになります。
3行目では再びRehashを行っています。
最後にruby -vコマンドを打ち込み、バージョンを確認しましょう。
以上で、EC2インスタンス内の環境構築ができました。