超初心者がDB接続するSpringBootアプリをAWSにデプロイする【前編】

# はじめに
駆け出しJavaエンジニアでインフラの知識もデプロイ経験もほぼ無い筆者が、Springで作成したアプリケーションをAWSにデプロイすることに成功した手順を、遭遇したエラーも交えながら記していきます。

長いので２部構成になっています。本記事は**前編**です。
### 【前編】AWS環境の構築
* VPCの構築
* EC2インスタンスの設置
* RDSの設置


**【後編】動作環境の構築とデプロイ**
* ミドルウェアのインストール
* Springアプリケーションのデプロイ

後編はこちら↓

https://qiita.com/sai-i/items/c7786653bfbd3f00218b


※この記事は2023年2月8日に書かれたものです。
AWSは更新が激しいようなので使用している画像のマネージメントコンソール等のUIが異なる可能性があります。ご了承ください。

# 前提
* AWSのアカウント登録
* Springアプリケーションの作成
* インフラの基礎知識

インフラの知識と環境構築方法については下記のUdemy教材で学習しました。
手順だけではなくインフラの基礎知識についても学習することができます。

https://www.udemy.com/course/aws-and-infra/

# 環境
* PCのOS：macOS Big Sur 11.2
* SpringBoot：2.7.0
* Java：OpenJDK 11.0.16.1
* DB：PostgreSQL 10.21

# 全体像
本記事では下図の状態を目指して環境を構築します。
（今回はドメインの取得は行いません。）
![AWS図2.drawio.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/4f39b320-b5ff-26ca-9e56-f1d27d4e7389.png)

# VPCの構築
まず初めにVPCの構築を行います。
ここで作成するものは以下の４つです。
* **VPC（Virtual Private Cloud）**：AWS上に仮想ネットワークを作成できるサービス
* **サブネット**：VPCを細かく区切ったネットワーク
* **インターネットゲートウェイ**：VPCとインターネットとの間の通信を可能にする窓口
* **ルートテーブル**：ルーティングのために『宛先のIPアドレス』と『次のルーター（ターゲット）』を登録
※ルーティング…ネットワーク上でデータを転送する際にその経路を導き出すこと

### 1.VPCの作成
マネジメントコンソール → VPC → VPCを作成 からVPCの作成をします。

任意の『VPC名』と『IPv4 CIDR』（今回は10.0.0.0/16としました）を入力し、その他はデフォルト値のまま「VPCを作成」を押下します。
![スクリーンショット 2023-02-08 10.15.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/c53dcada-8311-744a-61e2-803197b852f6.png)


### 2.サブネットの作成
VPCダッシュボード → サブネット → サブネットを作成 からサブネットの作成をします。

VPCには上記で作成したVPCを選択します。
全体像の図の通り「パブリックサブネット」と「プライベートサブネット」の2つのサブネットを作ります。(「新しいサブネットを追加」から2つ同時に作成可能です。)
それぞれ任意の『サブネット名』と『IPv4 CIDR ブロック』を入力し、「サブネットを作成」を押下します。



### 3.インターネットゲートウェイの作成
VPCダッシュボード → インターネットゲートウェイ → インターネットゲートウェイの作成 から作成します。

『名前タグ』を入力し、「インターネットゲートウェイの作成」を押下した後、作成したインターネットゲートウェイを選択して「アクション」の「VPCにアタッチ」を選択し、上記で作成したVPCにアタッチします。
状態がattachedになっていれば、紐付け完了です。
![スクリーンショット 2023-02-08 10.40.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/b6f95f8f-e00a-735a-c592-6d61c7696833.png)


### 4.ルーティングの設定
VPCダッシュボード → ルートテーブル → ルートテーブルの作成 からルートテーブルを作成します。

任意の名前を入力、上記で作成したVPCを選択して「ルートテーブルの作成」を押下します。
作成したルートテーブルを選択 → サブネットの関連づけ → サブネットの関連づけを編集　からパブリックサブネットとの関連づけを行います。
![スクリーンショット 2023-02-08 11.20.14.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/09f2c92a-4ad1-e399-471c-b057d1f21303.png)


さらに、作成したルートテーブルを選択 → ルート → ルートを編集　からルーティングを編集します。
![スクリーンショット 2023-02-08 11.28.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/84494d77-1361-3e6b-53fe-819d16985394.png)
ここに、「送信先：0.0.0.0/0、ターゲット：作成したインターネットゲートウェイ」を追加することで、10.0.0.0/16以外の通信の場合、インターネットゲートウェイに通信するようになります。
![スクリーンショット 2023-02-08 11.27.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3127048/3736b232-df62-3e28-2afc-d6bfef55b228.png)

# EC2インスタンスの設置
次に、Webサーバーの構築を行います。

マネジメントコンソール → EC2 → インスタンスを起動　で作成したVPCのパブリックサブネットの中にEC2インスタンスを設置します。
今回の設定は以下の通りとしました。
* AMI（インスタンスの起動に必要なソフトウェア設定を含むテンプレート）：Amazon Linux
* インスタンスタイプ：t2.micro
* キーペア（インスタンス接続時に使用）：任意の名前を入力、その他はデフォルト値で新規作成
※再ダウンロードができないため、管理に注意しましょう。
* ネットワーク設定：「編集」を押下し、作成したVPC及びパブリックサブネットを設定、『パブリックIPの自動割り当て』を有効化
* セキュリティーグループ：デフォルト値のまま作成
* ストレージ：サイズは8GB、ボリュームタイプは汎用SSD(gp2)を選択

設定の入力が終了したら「インタンスを起動」を押下します。
しばらくして『インスタンスの状態』が実行中になったら成功です。

# RDSの設置
### 1.セキュリティグループの作成
マネジメントコンソール → VPC → セキュリティグループ → セキュリティグループを作成 から作成します。

任意の『セキュリティグループ名』を入力し、作成したVPCを選択します。
次に、『インバウンドルール』にタイプ：PostgreSQL、ソース：EC2作成時のセキュリティグループ のルールを追加します。

### 2.サブネットグループの作成
RDSを設置する際は、VPC内でDBサブネットグループを指定する必要があります。
これはDBの可用性を担保するためで、特定のリージョンの異なる２つのアベイラビリティゾーンにそれぞれサブネット（＋DBサーバ）を作成して冗長化します。

まずVPCの作成時と同様の手順で、１つ目とは異なるアベイラビリティゾーンにプライベートサブネットをもう１つ作成します。
次に、マネジメントコンソール → RDS → サブネットグループ → DBサブネットグループを作成 からサブネットグループを作成します。
任意の名前を入力して作成したVPCを設定した後、作成した２つのプライベートサブネットを追加し、「作成」を押下します。

### 3.RDSの設置
RDS → ダッシュボード → データベースの作成 からDBインスタンスの作成を行います。
今回の設定は以下の通りとしました。

* 作成方法：標準作成
* エンジン：PostgreSQL
* テンプレート：開発/テスト
* マスターユーザ名、パスワード：postgres
* インスタンスの設定：バースト可能クラス
* ストレージ：汎用SSD(gp2),20GiB
* ストレージの自動スケーリング：無効
* VPC、DBサブネットグループ：作成したものを指定
* パブリックアクセス：なし
* セキュリティグループ：１で作成したセキュリティグループを指定

全ての設定を終えたら、「データベースの作成」を押下します。
DBの作成が始まりますので、ステータスが『利用可能』になったら完了です。（数分かかります）


# 終わりに
【前編】AWS環境の構築 は以上です。
理解や環境構築の一助となれば幸いです。

後編↓ではミドルウェアのインストールとアプリケーションのデプロイを行います。

https://qiita.com/sai-i/items/c7786653bfbd3f00218b

# 参考

https://www.udemy.com/course/aws-and-infra/

https://midorigame-jo.com/aws-deploy1/