初めてのAWSで、WebアプリケーションからプライベートサブネットのRDSへ接続までを実施した。

AWSの人気が非常に高いことは存じ上げておりました。
しかしながら、現職の業務上だと触る機会が皆無であるため、
プライベートで触ろうとしました。

しかし…
AWS、ぜんぜんわかりませーーーん。

# 何がわからん？
* ページに書いてある文字が分からん
    + EC2？ VPC？ MFA？
* どれから手を付ければよいのかわからん
* なにを設定すればよいのかわからん
* **書籍を購入しました**
    + [Amazon Web Services パターン別構築・運用ガイド 　一番大切な知識と技術が身につく](https://www.amazon.co.jp/gp/product/B00UWCYRZK/ref=oh_aui_d_detailpage_o05_?ie=UTF8&psc=1)


# 目標
* RDSを使用して、DBの構築、自作WebアプリケーションからDBアクセスを可能にする。

# 実施したこと
## AWSユーザー設定
1. アカウントを作成する
1. 仮想MFAデバイスをインストールする
    + 自分のiPhoneに「Google Authenticator」をインストールする
1. MFAを設定する
    + 2つの認証コードは、以下
        + 表示された6桁の番号を、「認証コード1」に入力する
        + 約30秒後、続けて表示された6桁の番号を、「認証コード2」に入力する
        + 2行表示されるものだ、と思ってはまった。
1. MFAを用いてサインインする
1. グループを作成する
1. IAMアカウントを作成する
    + キーなどが記載されたCSVをダウンロードできる。紛失しないようにする。
    + 一番最初に作成したアカウントは、ルートアカウントと呼ばれる。それで作業することは、基本的にしない。
1. パスワードポリシーを設定する
1. 作成したユーザへMFA割り当てる

### AWS 環境構築
アカウント登録は完璧！ さあ構築だ！ と思ったら…。

* 「サービスへのお申し込みはあと少しで完了です!」ページが表示されてしまうッッ！！

？？？ と思いましたが、以下が終わっていませんでした。
* クレジットカードの登録
* 電話により本人確認

アカウント登録、完璧ではありませんでした。
「サービスへのお申し込みはあと少しで完了です!」ページの「AWS への登録を完了してください。」をクリックし、
残りを登録・本人確認をしました。

#### 環境構成
* VPC
    + パブリックサブネット
        - EC2(踏み台)
    + プライベートサブネット
        - RDS

#### VPC作成
1. 項目を入力して作成する
    * ネームタグ
        + vpc-employee-mask-management
    * IPv4 CIDR Block
        + x.x.x.x/xx
    * テナンシー
        + デフォルト
1. 右クリックして「DNSホスト名の編集」を「はい」にする

#### サブネット作成
1. 項目を入力してパブリックサブネットを作成する
    + ネームタグ
        - EM-public-subnet
    + VPC
        - vpc-employee-mask-management
    + アベイラビリティーゾーン
        - ap-northeast-1a
    + IPv4 CIDR Block
        - x.x.x.y/xx
1. 項目を入力してプライベートサブネットを作成する
    + ネームタグ
        - EM-private-subnet
    + VPC
        - vpc-employee-mask-management
    + アベイラビリティーゾーン
        - ap-northeast-1a
    + IPv4 CIDR Block
        - x.x.x.z/xx
1. パブリックサブネットの「自動割り当てパブリックIP」を有効化する

#### インターネットゲートウェイ作成
1. 項目を入力してインターネットゲートウェイを作成する
    + ネームタグ
        - EM-internet-gateway
1. インターネットゲートウェイにVPCをアタッチする

#### ルートテーブル作成
1. 項目を入力してルートテーブルを作成する
    + ネームタグ
        - EM-root-table
    + VPC
        - vpc-employee-mask-management
1. ルートタブにて、新しいルートを作成する
    + 送信先
        - 0.0.0.0/0
    + ターゲット
        - EM-internet-gateway

#### サブネットへルートテーブルを割り当て
1. サブネット「EM-public-subnet」のルートテーブルタブで、ルートテーブルを割り当てる

#### セキュリティグループ作成
1. 項目を入力してパブリック用のセキュリティグループを作成する
    + ネームタグ
        - EM-public-DMZ
    + グループ名
        - EM-public-DMZ
    + 説明
        - Employee Management Public Security Group
    + VPC
        - vpc-employee-mask-management
1. 項目を入力してプライベート用のセキュリティグループを作成する
    + ネームタグ
        - EM-private-DMZ
    + グループ名
        - EM-private-DMZ
    + 説明
        - Employee Management Private Security Group
    + VPC
        - vpc-employee-mask-management
1. インバウンドを変更する
    + EM-public-DMZ
        - 1行目
            + タイプ
                - SSH
            + プロトコル
                - TCP
            + ポート
                - 22
            + 送信元
                - マイIP
        - 2行目
            + タイプ
                - PostgreSQL
            + プロトコル
                - TCP
            + ポート
                - 5432
            + 送信元
                - 0.0.0.0/0
    + EM-private-DMZ
        - 1行目
            + タイプ
                - PostgreSQL
            + プロトコル
                - TCP
            + ポート
                - 5432
            + 送信元
                - EM-public-DMZ

#### DBサブネットグループ作成
1. RDSを開き、項目を入力し、DBサブネットグループを作成する
    + 名前
        - EM-dbsubnet-mask
    + 説明
        - Employee management DB subnet
    + VPC
        - vpc-employee-mask-management
    + 追加するサブネット
        - ap-northeast-1a
            + アベイラビリティーゾーン
                - ap-northeast-1a
            + サブネットID
                - EM-private-subnetのID
        - ap-northeast-1c
            + アベイラビリティーゾーン
                - ap-northeast-1c
            + サブネットID
                - EM-private-subnet-CのID

#### RDSインスタンス作成
1. エンジンを選択する
    + PostgreSQL
1. インスタンスの仕様を入力する
    + ライセンスモデル
        - postgresql-license
    + バージョン
        - PostgreSQL 9.5.4-R1
    + インスタンスのクラス
        - db.t2.micro
    + DBインスタンス識別子
        - employee-mask-management
    + マスタユーザの名前
        - adminuser
    + マスターパスワード
        - ********
    + パスワードの確認
        - ********
1. 詳細設定の設定
    + VPC
        - vpc-employee-mask-management
    + サブネットグループ
        - EM-dbsubnet-mask
    + パブリックアクセス
        - いいえ
    + アベイラビリティーゾーン
        - 指定なし
    + VPCセキュリティグループ
        - EM-private-DMZ
    + データベースの名前
        - employeemanagement
    + データベースのポート
        - 5432
    + DB パラメータグループ
        - default.postgres9.5

#### EC2インスタンス作成
1. マシンイメージを選択する
    + Amazon Linux AMI 2016.09.1 (HVM), SSD Volume Type
1. インスタンスタイプを選択する
    + t2.micro
1. インスタンスの設定をする
    + インスタンス数
        - 1
    + ネットワーク
        - vpc-employee-mask-management
    + サブネット
        - EM-public-subnet
    + 自動割り当てパブリックIP
        - サブネット設定を使用
1. ストレージの設定をする
    + 全てデフォルトのまま
1. Add Tags
    + Name
        - EM-Server
1. セキュリティグループの設定をする
    + 既存のセキュリティグループを選択する
        - EM-public-DMZ
1. キーペアを作成、ダウンロードする
    + キーペア名
        + EM_Server_Key

#### EC2インスタンスへの接続
* ssh -i {key file name} {your user name}@{your address.com}

### ローカルの開発環境にあるWebアプリからRDSへ接続する方法
* Webアプリ側で、JSchを使用して、SSHポートフォワーディングする

# 結果
* ローカルのWebアプリから、プライベートサブネットのRDSへ接続することができた。

# わからないこと
* EC2によるポートフォワーディングが、AWS上に存在しないアプリケーションがRDSへ接続する方法として、適切なのか？
    + 別のAWSサービスを利用した、もっとよい方法があるのではないか？

# 参考にさせて頂きました
* [Amazon Web Services パターン別構築・運用ガイド 　一番大切な知識と技術が身につく](https://www.amazon.co.jp/gp/product/B00UWCYRZK/ref=oh_aui_d_detailpage_o05_?ie=UTF8&psc=1)
* http://cryptofreek.org/2012/06/06/howto-jdbc-over-an-ssh-tunnel/
* http://stackoverflow.com/questions/4932005/can-we-use-jsch-for-ssh-key-based-communication