AWS EC2 RDS S3の組み合わせでインフラ構築する時にやること決めておくことリスト

# 概要

- AWSにてベーシックなWebサービスをデプロイする際に必要な内容をリストにしてまとめてみる

# ご注意

- 筆者はAWS初心者です。もっと良い構築方法は必ずあります。抜け漏れもあるはずです。

# 仕様

- AWS　EC2 AmazonLinux2インスタンスを用いてWebサービスを提供する。データはRDSのMySQLに格納する。
- 専用のVPCを作成する。
- VPCの中にパブリックサブネット1個とプライベートサプネットを2個を定義する。
- EC2インスタンスはパブリックサブネット内に設置
- 2個のプライベートサブネットはサブネットグループとしてグルーピングする。
- プライベートサブネットのサブネットグループはパブリックサブネットからのみ接続できる。
- EC2で提供するサービスはパブリックIPアドレスを用いてブラウザからアクセスするものとする（Route53でのドメインとIPの紐付けはしない）
- デプロイするアプリケーションでアップロードされるファイルなどはS3に格納する

# やること

1. ネットワーク部分の設定
    1. VPCの作成
        1. 作成前に決めておく内容
            1. リージョン
            1. VPCの名前
            1. IPアドレスの範囲（例: 10.0.0.0/16）
            1. IPv6の紐付け有無
                1. 特別必要にならない限り無し（IPv6 CIDRブロックなしを選択）
            1. テナンシーの設定
                1. 特別必要にならない限りデフォルト（デフォルトを選択）
    1. サブネットの作成
        1. 作成前に決めておく内容
            1. パブリックサブネット
                1. サブネットの名前（例: XXX-public-subnet-アベイラビリティゾーン名）
                1. このサブネットを所属させるVPCの名前
                1. アベイラビリティゾーン
                1. IPアドレスの範囲（例: 10.0.10.0/24）
            1. プライベートサブネット１つ目
                1. サブネットの名前（例: XXX-private-subnet-アベイラビリティゾーン名）
                1. このサブネットを所属させるVPCの名前
                1. アベイラビリティゾーン
                1. IPアドレスの範囲（例: 10.0.20.0/24）
            1. プライベートサブネット2つ目
                1. サブネットの名前（例: XXX-private-subnet-アベイラビリティゾーン名）
                1. このサブネットを所属させるVPCの名前
                1. アベイラビリティゾーン
                1. IPアドレスの範囲（例: 10.0.21.0/24）
    1. インターネットゲートウェイの作成
        1. 作成前に決めておく内容
            1. インターネットゲートウェイの名前（例: XXX-igw）
        1. 作成したインターネットゲートウェイと既に作成されているVPCのアタッチ
    1. ルートテーブルの作成
        1. 作成前に決めておく内容
            1. ルートテーブルの名前（例: XXX-route）
        1. 作成したルートテーブルと既に作成されているパブリックサブネットとの関連付け
        1. 作成したルートテーブルにデフォルトルート（0.0.0.0/0）と先に作成したインターネットゲートウェイと紐付けルートを追加
    1. IAMユーザー作成（S3アクセスで使用）
        1. 作成前に決めておく内容
            1. 名前（例: XXX-admin）
            1. AWSアクセスの種類
                1. プログラムによるアクセス（S3アクセスで使うので）
            1. アクセス許可の設定
                1. 既存のポリシーを直接アタッチ
                    1. AmazonS3FullAccessを選択
            1. 作成時に取得できるcsvファイルは大切に保管する
1. EC2部分の設定
    1. EC2インスタンスの作成
        1. 作成前に決めておく内容
            1. AMI（OSの種類など）
            1. インスタンスタイプ（スペック）
            1. ストレージ（EBS or インスタンスストア）
                1. 特別必要にならない限り汎用SSDを選ぶ
                1. 合わせて削除にチェックを入れる
            1. 当該EC2設置するVPC
            1. 当該EC2を設置するサブネット
            1. 自動割当パブリックIPの有無
                1. Webからアクセスしたいので「有効」
            1. 割り当てるプライベートIP（例: 10.0.10.10）
            1. インスタンスの名前
                1. タグの追加でキー → name、値 → インスタンス名
            1. セキュリティグループ
                1. 名前（例： XXX-web）
                1. 設定
                    1. 設定を割り当てるVPC
1. RDS部分の設定
    1. MySQLのRDSインスタンスの作成
        1. 作成前に決めておく内容
            1. セキュリティグループ名と設定
                1. 名前（例: XXX-db）
                1. 設定
                    1. 設定を割り当てるVPC
                    1. インバウンドにルールを追加（既に存在するEC2からのみ接続できるようにする。）
                        1. タイプ
                            1. MYSQL/Aurora
                        1. プロトコル
                            1. TCP
                        1. ポート範囲
                            1. 3306
                        1. ソース
                            1. EC2のセキュリティグループ
            1. サブネットグループ
                1. 名前（例: XXX-subnet-group）
                1. グループ化するサブネットが所属しているVPC
                1. グループ化するサブネットの詳細（名前とアベイラビリティゾーン）
            1. パラメータグループ
                1. グループファミリー
                    1. お使いのバージョンに合わせて決定
                1. 名前（例： XXX-mysql80 ←MySQL8.0を使う場合）
            1. オプショングループ
                1. 名前（例: XXX-mysql80 ←MySQL8.0を使う場合）
                1. エンジン
                    1. お使いのDBエンジンに合わせて決定
                1. メジャーエンジンのバージョン
                    1. お使いのDBエンジンのバージョンに合わせて決定
            1. インスタンス
                1. DBエンジン
                1. DBエンジンのバージョン
                1. テンプレート（本番稼働用？開発テスト用？無料利用枠？）
                1. 名前「DBインスタンス識別子」（例: XXX-web ←web用のDBなので）
                1. マスターユーザー名
                    1. 基本はroot
                1. マスターパスワード
                    1. 忘れない かつ セキュリティが高いものに設定
                1. インスタンスサイズ（標準mクラス？ メモリ最適化rクラス or xクラス？ バースト可能tクラス？）
                1. ストレージタイプ
                    1. 特別必要にならない限り汎用ssd
                1. ストレージの自動スケーリング有無
                1. マルチAZ配置有無（料金安くしたいなら「スタンバイインスタンスを作成しないでください」）
                1. RDSインスタンスを設置するVPC
                1. RDSインスタンスを設置するサブネットグループ
                1. パブリックアクセス可否
                1. セキュリティグループ
                    1. 先に作成したセキュリティグループ（DB用）
                1. アベイラビリティゾーン
                1. ポート
                    1. 特別理由が内限り3306
                1. 割り当てるパラメータグループ
                1. 割り当てるオプショングループ
                1. 自動バックアップの有無
                    1. 有効に設定 →　30日くらいの保持期間がおすすめ
                    1. バックアップ取得時の時間（UTCで設定）
                1. マイナーバージョン自動アップグレードの可否
                    1. 有効がおすすめ
                    1. バージョンアップの時間（UTCで設定）
1. S3部分の設定
    1. バケットの作成
        1. 作成前に決めておく内容
            1. 名前（例: 任意のわかりやすい名前）
            1. リージョン
            1. バージョニング
                1. 特別必要がなければ不要
            1. サーバーアクセスのログ記録
                1. 本番環境では必要かも？
            1. デフォルト暗号化
                1. 本番環境では必要かも？
            1. アクセス権限
                1. 画像や動画配信する場合はパブリックアクセス許可しておく