AWSを用いてrailsアプリをデプロイするプロセスを頑張って噛み砕いてみるvol.1

### 近況報告
　やあ,転職活動を目前にして，ついに個人アプリのデプロイを行なっていきます。テックのカリキュラムは離れると見られなくなるのでこういう場所に自分のやってきたことをメモできたらなあと思っています。個人アプリに関してはDockerを導入して完成としたかったのですが，時間的にとりあえずデプロイを行うことにしました。テックエキスパートのカリキュラムを元に書いてるのでそれと互換性があります。この記事は後々制限つけようかな。
#今回の目的
・**インフラ整備での各アクションの言語化**
・**コードを単に打っているだけでは理解しきれないし，他に応用できないので言語化して整理**
・AWSでアカウント作成，ほか諸々の準備は割愛してターミナルでの操作をメインに
・テックキャンプ受講生支援
## おおまかな流れ
・本番環境をリモートで操作する準備
・本番環境の構築
・rubyインストール
###事前準備
awsのアカウント作成
インスタンス作成
インスタンスとEPアドレス紐付け
セキュリティでポートのスタンバイ
キーペア作成

以下キーペアDL後から書いていきます
### 本番環境をリモートで操作する準備

```
ターミナル
$ .ssh yasypikotanji$ cd ~　←カレントディレクトリに移動
mkdir ~/.ssh
// move A ⏩ B
$ mv Downloads/***.pem .ssh/　move A ⏩ B
$ cd .ssh/
$ ls
***.pem
// ***.pemに対して６００（所有者のみ中身の編集を許可）にchmod（権限変更）
$ chmod 600 ***.pem　
$ ssh -i ***.pem ec2-user@IP0000

The authenticity of host 'IP0000 (IP0000)' can't be established.
ECDSA key fingerprint is "Important Key Name".
Are you sure you want to continue connecting (yes/no)? yesと記入
Warning: Permanently added '***' (ECDSA) to the list of known hosts.
⇨おう，知らねえ顔だな。通行許可証は持ってるみたいだな，今後ssh使ってEC2にアクセスしていくのかい？
       __|  __|_  )
       _|  (     /   Amazon Linux AMI
      ___|\___|___|
https://aws.amazon.com/amazon-linux-ami/2018.03-release-notes/
4 package(s) needed for security, out of 7 available
Run "sudo yum update" to apply all updates.
⇨遠隔操作していくためのツールが手に入る
[ec2-user@IP0000 ~]$ ←放置してると締め出される
```

　**sshはSecure Shellの略で，クラウドにある自分のサーバーをターミナルで遠隔操作するための端末のイメージ。**開発環境ならパソコンの中に擬似サーバーを作ってそれをターミナルで操作できるんだけど，みんなが使う本番環境でそれをやっちゃうとたくさんのアクセスをあなたのパソコンが捌き切れず，機能不全に陥っちゃう。水流をアクセスにたとえると，バケツを家の蛇口に置いても溜まるのはゆっくりだけど，バケツを華厳の滝の下に置いたら一瞬で溢れちゃうでしょw　だから，ネットのクラウドっていう巨大なバケツをお借りして本番環境を構成していく。

補足[chmodについて](https://qiita.com/aaabb6211/items/30ddad48773f37affcb9)

### 本番環境の構築
本番環境はAWSによってリーズナブルに効率的に提供されますが，サーバーの中身は開発環境がまんま複製されることはありません。ここから環境の整備を行なっていきます。

**サーバーにもともとあるバージョンをアップデート**
・yumはクラウドのLinuxのソフトウェア管理の仕組みらしい
・「sudo」はで「substitute user（もしくはswitch user） do」の略，C言語由来　[＊引用](https://wa3.i-3-i.info/word11269.html)
⇨他のユーザー権限でサーバーを動かす時に用いる。自分のパソコンと離れたサーバーをいじるから必要なのかな。
・パッケージ　LinuxOS下における、ある役割/機能をもったプログラムの集合。

```
EC2
$ sudo yum -y update
$ 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


**Node.jsのインストール**
Node.jsは本番環境でJSを用いるために利用するパッケージ，ほか，CSSや画像の圧縮などにも利用

```
EC2
$ sudo curl -sL https://rpm.nodesource.com/setup_6.x | sudo bash -
$ sudo yum -y install nodejs
```
node.jsはサーバー上に存在しないライブラリなのでウェブから調達する必要があるみたい。
上のコードを噛み砕くと，
bash君，「悪い，外野からが指示出しするけど堪忍な。node.jsをインストールできるサイトをサーバー内に持ってきて」ってサーバーに伝えてきてくんね？よし，伝えてきたな。じゃあ，また外野からの指示出しで悪いんだけどインストールして。
。。。って感じ。bash君はPCの操作の命令をうけるシェル，**パシリみたいな感じ**。

### rubyインストール
rubyを導入する前に土台のrbenvとruby-buildをインストールします。
rbenvとruby-buildは、Rubyのバージョンを管理する際に組み合わせて使うツールで，これらはRubyをインストールする前にインストールする必要があるみたい。
ruby-buildはrbenvのプラグインでありruby-buildによってRubyの様々なバージョン(2.0.0など)をインストールすることができて，rbenvを使用することでrubyのバージョンを切り替えることできるそう。

```
EC2
$ git clone https://github.com/sstephenson/rbenv.git ~/.rbenv ←rbenvのインストール
$ echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile 
$ echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
$ source .bash_profile
$ git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build ←ruby-buildのインストール
$ rbenv rehash ←更新
```
echoはLinuxのコマンド。文字を読み込ませています。ここでは，rbenvのパスを読み込ませて，本番環境でrbenvを使うための書き込みを環境変数に行なっています。
bash_profileはサーバーにログインした時に実行されるもの。システムを動かす重要なもの，キーやパスを格納するので環境変数になっている。

イメージは，「おれ焼きそばパン好きだからサァ，昼休みのたびに買ってきてくんね？」て陰で命令されたbash君が毎日パシッている感じ。

そして，Rubyをインストールします。

```
EC2
$ rbenv install 2.5.1 ←時間かかる。バージョンは各々のバージョンに変更
$ rbenv global 2.5.1 ←サーバー全体に適用されるrubyのバージョンを設定
$ rbenv rehash 
$ ruby -v ←うまくインストールできてるかバージョンを確認 
```
サーバー内の環境で多くのプロジェクトを動かすなら，ピンポイントのプロジェクトのみに対してrubyを適用させるlocalでもいいんだけど，このサーバーではrubyしか使わないからglobalで反映。

### おわりに
以上,本番環境の構築，ruby導入まででした。vol.2ではデータベース，ユニコーンを用います（多分）。

微量でも参考になったらLGTM，ご指導はコメント欄にお願いします！