Dockerでrailsアプリ作ったけど、awsってどう使うの？

独学未経験４ヶ月。
ポートフォリオをECSデプロイ目指し、現在勉強中！
間違っている内容ありましたら、ご指摘よろしくお願いいたします！

**必要な前提知識**
1. docker hubアカウントあるよ
2. githubアカウントあるよ
3. awsアカウントあるよ(osは、amazon linux 2)
4. awsでec2インスタンスを起動できるよ



>[AWSのOS、amazonlinux2とは何？？](https://dev.classmethod.jp/cloud/aws/amazon-linux-2-now-available/)
今からaws始めるならこれが良いのでは、
awscliなど付属してるし


**寸劇**
(業界未経験の筆者が勝手な想像で書いております。。失礼ありましたらエンジニア界隈のかた申し訳ありません。。)


筆者
>
　　「あーやっと、railsでtodoappが作れたぞ！」
>
　　「次は、herokuでデプロイしてみるか！」
　　「えherokuって案外......ムズ！」
　　「あ、でもこうやったら、、、デプロイできたぞ！」
>
　　「デプロイって、結構むずいな。笑（挫折しそう）」




エンジニア界隈
>
「やー、でもさー。今更、railsのアプリをherokuでデプロイしました！」
>
　「ていうレベル感のポートフォリオ持ってこられてもねー。」
>
　「正直、反応に困るよね！」



筆者
 > 「 ..... 」



エンジニア界隈
>
 「どうせなら、aws使ってデプロイしました！くらいじゃないと通用しないぜ！」





筆者
>
　「どうせawsなんて簡単だろ。herokuだってデプロイできたし!」
>
　「上等！やってやんよ！」
>


後日、、
>
　「ええーと。awsアカウント作成してっと。ログインしてっと。。」
>
　「ん、なにこれ？ herokuと全然違う！」
　「無事awsに、デプロイできるかな？？」
こうして筆者の「awsのデプロイ奮闘劇」が始まるのです。


こんにちは、筆者です！
前置き長くなりました！
ポートフォリオに導入しなければという危機感から、aws始めました。
難しいですね。


# awsのデプロイとは？

複数の方法があります。

1. EC2: 自分で作成した、アプリをEC2という場所に設置する
2. ECS: 自分で作成した、複数のdockerイメージをコンテナ管理する手法

今回は
1.のEC2というサービスを用いて、デプロイまでしたいと思います。






# 使用するrailsアプリ

[railsアプリ：todoappだよ](https://github.com/uechikohei/todoapp)

git cloneして使用ください。






# aws 初期設定















### ec2インスタンス起動
awsでログインして、ec2インスタンスを起動しましょう！
パブリックIPアドレスを控えておいてください！
後に必要です！












### sshログイン
1. ローカルのターミナルで操作

```
cd ~
cd .ssh
ssh [作成したkey名].pem ec2-user@[ec2インスタンスのIPアドレス]

```








### awscli設定

**インストール**
amazon linux 2選択済みなら必要ないと思います。
インストール必要なかたはこちらで
↓
[awscliをpip3でインストール](https://docs.aws.amazon.com/ja_jp/streams/latest/dev/kinesis-tutorial-cli-installation.html)



**設定**

1. accesskey
2. secretkey(IAMユーザー作成時に控えておく）
3. リージョン(tokyoリージョンなら、ap-northeast-1)
4. 出力形式(defaultはJSON)
を聞かれる

```
aws configure

```









### dockerをインストール

**youtube参考動画(7分２０秒から8分58秒まで)**
[awsのec2インスタンスでdockerをインストール](https://www.youtube.com/watch?v=DS5HBTMG1RI&list=PLtpYHR4V8Mg-jbuk4yoXhXwJtreodnvzg
)

これが一番分かりやすい方法でした！
動画内に出てくるコマンド↓


```
sudo yum update -y
amazon-linux-extras install docker
sudo usermod -a -G docker ec2-user
docker info
(docker hub起動しておく)
docker login
(dockerコマンドが使える画面が表示されているかを確認)
```















### docker-composeをインストール

```
sudo curl -L "https://github.com/docker/compose/releases/download/1.25.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose
```

```
sudo chmod +x /usr/local/bin/docker-compose
```

```
docker-compose --version
```









# railsアプリを配置



## githubと接続しよう

**.gitconfigをかく**

```
vim ~/.gitconfig

以下を記載
[user]
  name = gitに登録した自分の名前
  email = git登録時の自分のメアド

[alias]
  a = add
  b = branch
  ch = checkout
  st = status

[color]
  ui = true

[url "github:"]
    InsteadOf = https://github.com/
    InsteadOf = git@github.com:

```

**sshkeyの作成**

```
cd ~
mkdir .ssh
chmod 700 .ssh
cd .ssh
ssh-leygen -t rsa

Enter file in which to save the key ():
=> ここでは、好きなファイル名を指定
Enter passphrase:
=> 空でエンター
Enter same passphrase again:
=> 空でエンター
```
```
ls

=> ファイルが２つ生成でok!
```
```
vim config

以下を記載
Host github
 Hostname github
 User git
 IdentityFile ~/.ssh/[好きなファイル名]_rsa
                       ↓
　　　　　　　　　　　　　ssh-keygenで生成した鍵を指定する

chmod 600 config
```




**作成したsshkeyをgithubに登録**


```
cat [好きなファイル名]_pud

=> コピーしておく。githubとの認証に使用。
   => githubへ
　　　　=> setting
         => SSH and GPG key
            => new-ssh-key
               => key欄で貼り付け。

```
<img width="573" alt="スクリーンショット 2020-01-30 12.34.13.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/c02343bf-54e6-03be-df4a-b54da5054e20.png">

```
ssh -T Github

<Hi,,,,,,と表示で成功
```




## githubからrailsアプリをclone


**railsアプリ配置ディレクトリの作成**

```
sudo su
cd ~
cd /var
mkdir www
(rootユーザーでない場合)
  ==>> chown [ユーザー名]:[グループ名] [ファイル名]
cd www
mkdir rails
cd rails

```


**git clone**

```
pwd /var/www/rails
git clone [githubリポジトリのURL]

成功すると
/var/www/rails/todoapp
となっているはず
```


**docker-composeで起動**

```
cd /var/www/rails/todoapp
docker-compose build
docker-compose up -d
```

**データベースを作成**
このままだと、こういうエラーが表示される。

<img width="550" alt="スクリーンショット 2020-01-21 17.50.10.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/2a8db7d6-3456-3ec0-4e05-b67d59a4292a.png">
や
![スクリーンショット 2020-01-23 12.03.03.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/bde2f918-b6a2-637e-6b3f-554af2dfc82e.png)
焦らずに↓打とう

```
docker-compose exec web bash
bundle exec rails db:create RAILS_ENV=production
bundle exec rails db:migrate RAILS_ENV=production
bundle exec rails assets:precompile RAILS_ENV=production

docker-compose down
docker-compose build
docker-compose up
```
[パブリックIP]にアクセス！
すると、、、



### エラー集
ある時作業していると
こんな物が、
<img width="525" alt="スクリーンショット 2020-01-22 21.47.44.png" src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/449720/70c37455-4739-0b6c-7fce-3b4ce0ce1b45.png">

**なんだこれ？？**
Forbidden？？
どうやらエラーメッセージから理解するに、index.htmlが読めないことが原因っぽい
作業時、rootユーザーであれば問題少ないと思います。しかし、作業ユーザーを作成する人はファイルやディレクトリに対して適切な権限やファイルの仕様になっていないとpermission error（権限エラーや拒否）が起こります。


### 例
**ファイルappleの仕様を700に変更**
`sudo chmod 700 apple`

**ディレクトリcoffeeの権限をユーザーtullysにグループをcafeに変更**
`sudo chown tullys:cafe coffee`