AWS EC2, RDS, S3を使った簡単なサーバー構築

## はじめに
この記事はLaravelでwebサービスを公開するときに調べたものをまとめた記事になります。
ローカルのDockerでnginx, PHP, MySQLコンテナを作成したものをAWS上にデプロイしました。
利用サービスについてはすべて無料枠での利用です。

## EC2
**【ざっくりとした流れ】**

- VPC/サブネットを作る
- インターネットゲートウェイを作る
- EC2（サーバー）を立てる
- ルーティングとセキュリティグループを設定
- SSHでEC2にアクセスする

VPCはAWSの中に作成するため、作成しただけではインターネットに接続できない。
インターネットに接続させるために作成したVPCとインターネットゲートウェイを紐付ける必要がある。
インターネットゲートウェイを作成後、画面上部の`アクション`ボタンから`VPCにアタッチ`を選択
その後、対象となるVPCを選択する。

### AMIの選択  
作成するインスタンスのマシンイメージを選択
どういうサーバーを起動するか
※今回はAmazon Linux 2 AMI(HVM)を選択
### インスタタンスタイプの選択  
サーバーのスペックを選択する
スペックが高くなるほど料金も高くなる
※今回はt2.miroを選択
AWSではスペックの可変が楽なため、スモールスタートができる。
必要に応じてスペックを上げていく。
### インスタンスの詳細の設定
今回は基本的なインスタンスの作成のため特に変更点はなし
`ネットワーク`を作成したVPCを選択
グローバルIPアドレスを割り当てるため`自動割り当てパブリックIP`を`有効`
### タグの追加
設定しなくても問題はないが、複数サーバーを立ち上げる際などネーミングをしておくことによって管理がしやすくなる。
### セキュリティグループの設定
どのポートの通信を許可するかを設定する。
セキュリティグループ名に任意の名前を入力する。
今回は`80(http)` `22(ssh)`の2つをルールに追加
ソースを`0.0.0.0/0`に設定するとすべてのIPアドレスからインスタンスへのアクセスが許可される。
### キーペアの作成
EC2にsshでアクセスするときにキーペアが必要となる。公開鍵と秘密鍵みたいなもの。
`新しいキーペアの作成`を選択後、`キーペア名`を入力する。
`キーペアのダウンロード`ボタンを押しローカルの任意場所に保存する。
※ssh接続するときにこのキーのパスを入力するため覚えておく

`インスタンス作成`を押すとインスタンスが作成される
### ルーティングの設定
VPCからルートテーブルを選択。
`ルートテーブルの作成`から新たにルートテーブルを作成し、作成したVPCを選択する。
`ルートの編集`からルートを追加し、`ターゲット`を作成したインターネットゲートウェイを選択する。
通信を行うときに設定したインターネットゲートウェイをめがけて通信することでインターネットに接続できる。
`サブネットの関連付けの編集`から作成したルートテーブルのルートをどのサブネットに適応させるかを選択する。

### sshでEC2にアクセス


```
ssh -i [ダウンロードしたキーペア] ec2-user@[IPv4パブリックIP]
```
[ダウンロードしたキーペア]：ダウンロードしたキーペアの絶対パス
[IPv4パブリックIP]：対象インスタンスの`説明`に記載されているIPv4パブリックIP
Amazon Linuxのsshのデフォルトで接続するユーザーが`ec2-user`
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/464231/eb5a55c6-05bf-067b-436f-6e2a78387611.png)
接続成功！

### 参考記事
[AWSでのEC2構築](https://qiita.com/yo_dazy/items/3846915e4db21fe04537)
[【AWS 入門】EC2とDockerでHello Worldしよう](https://www.youtube.com/watch?v=HvrIPQ77xRY)
[ポートとは？](https://www.cman.jp/network/term/port/)

## RDS
**【ざっくりとした流れ】**

- DB用のサブネットグループ作成
- セキュリティグループの設定
- DB（MySQL）構築
- LaravelのDB設定変更

### DB用サブネットグループ作成
RDSでDBサーバを構築するときに、インスタンスを所属させるためのサブネットグループというものを用意する必要がある。
>各 DB サブネットグループには、特定の AWS リージョン内の少なくとも 2 つのアベイラビリティーゾーンにサブネットが必要です。VPC に DB インスタンスを作成するときに、DB サブネットグループを選択する必要があります。

### セキュリティグループの設定
EC2からRDSへ接続するために通信許可の設定を行う。
上記で設定した`80番ポート`と`22番ポート`に加え、`3306(MySQL)番ポート`も追加することでEC2からRDSへ接続が可能となる。

### DB構築
- エンジン選択  
- DB詳細の指定   
マスターユーザー名とマスターパスワードはDB接続の際に必要
- [詳細設定]の設定  
`VPC` インスタンスが作られるVPC  
`サブネットグループ` 上記で作成したサブネットグループ  
`データベースの名前` 任意データベース名※DB接続で必要

### LaravelのDB接続設定

Laravelアプリケーションの`.env`に下記を設定

| 項目 | 設定値 | 説明 |
|:-----------|:------------|:------------|
|DB_HOST     | 作成した[データベース]のRDSのエンドポイント|作成したRDSインスタンスの詳細ページで確認する。|
|DB_DATABASE | データベース名      |自分で設定したデータベース名|
|DB_USERNAME | ユーザー名        |自分で設定したDBマスターユーザ名|
|DB_PASSWORS | 作成した[データベース]のマスターパスワード|自分で設定したDBマスターパスワード|

設定完了後`php artisan migrate`実行


### 参考記事
[RDS作成(無料枠)](https://qiita.com/Inon/items/59c04e4680046f4df66c)
[AWSでウェブアプリケーション環境構築：②RDSでDBを作成し、Laravelサンプルアプリを動かす最小構成を構築](https://qiita.com/minato-naka/items/03f9dbd09eb3919a501f)

## S3
*【ざっくりとした流れ】*
- S3用のIAMを作成
- Bucketの作成
- LaravelからS3利用

### S3用のIAM作成
ユーザー追加画面からユーザー名を入力し、`プログラムによるアクセス`を選択。
`既存のポリシーを直接アタッチ`タブから`S3`を検索し、`AmazonS3FullAccess`にチェックを入れて作成。
作成後`アクセスキーID`と`シークレットアクセスキー`が表示される。
ストレージ接続時に必要。

### Bucket作成
`バケットを作成する`から新規バケットを作成
バケット名とリージョンを選択
オプションは一旦すべてオフ
アクセス権限については作成後に設定

### LaravelからS3利用
S3用のパッケージをインストール

```
 composer require league/flysystem-aws-s3-v3
```

.envに下記情報を記載

```
AWS_ACCESS_KEY_ID= ユーザーを作成した際に表示されたアクセスキーID
AWS_SECRET_ACCESS_KEY= 上記手順でユーザーを作成した際に表示されたシークレットアクセスキー
AWS_DEFAULT_REGION= ap-northeast-1 （東京リージョンで作成したため）
AWS_BUCKET= 作成したbucket名
```

### 参考記事
[超簡単！LaravelでS3を利用する手順
](https://qiita.com/tiwu_dev/items/ecb115a92ebfebf6a92f)