AWSのElastic Beanstalkを使って簡単なWEBアプリ開発環境を構築する（Apache+Tomcat+DB)

# 初めに
WEBアプリの開発環境を一から構築するのは何かと手間がかかります。
AWSのElastic Beanstalkを使うとボタンをポチポチするだけで簡単に作成可能です。
開発や検証環境などちょっと試したいなといった場合にはとても便利ですので構築方法についてまとめました。


# 大まかな構築手順
1. VPC
1. Elastic Beanstalk
1. DB (PostgreSQL)
1. S3（EC2とのファイル送受信用）

構成図イメージ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/8ef55f2b-c471-8052-b72a-32c805beb26a.png)

 
# 1. VPCの構築
さっそくやってみましょう。

## VPCの作成
作成したいリージョンを選択する。
サービスの「VPC」を検索し、「VPCを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/53b5d431-ba44-29e6-f75f-8d6b5bb1a229.png)

作成するリソース：VPCのみ
名前：適宜入力
IPv4 CIDR：適宜入力
⇒「VPCを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/e0663025-9606-6189-531b-16a9ff61aa54.png)

## インターネットゲートウェイの作成
VPCのダッシュボードより、「Internet gateways」を選択のうえ、「インターネットゲートウェイの作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/87f46016-4387-5ad1-4b52-9a23c79d1020.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/ed653620-d921-c80b-05b2-71dde96e3b83.png)

名前タグ:適宜入力
⇒「インターネットゲートウェイの作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/b99a82ee-9800-84c3-0213-633106ba44a9.png)

作成が成功したら「VPCへアタッチ」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/a7f790d6-dab3-22a1-6b4e-ee3c840f40b5.png)
アタッチしたいVPCを選択のうえ、「インターネットゲートウェイのアタッチ」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/e23acded-5c8c-668a-99b0-77671d33484d.png)

## サブネットの作成

VPCのダッシュボードより、「Subnets」を選択のうえ、「サブネットを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/9bb286fc-1d7a-7152-b1b3-0517a3931555.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/f315a215-872c-7888-e33f-40b1b78ee555.png)

VPC ID:先ほど作成したVPCを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/d3accfd6-94f5-d092-991f-e4f844562492.png)

サブネット名：適宜入力
IPv4 subnet CIDR block：適宜入力
⇒「サブネットを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/8eb24feb-2604-90b3-8c5d-f37a9b6c9cc3.png)

## ルートテーブルの作成
先ほど作成したサブネットを開き、「ルートテーブル」を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/4b44bbf9-4035-22a8-88c0-fecd1079c79d.png)
「ルートテーブルID」を押下下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/f0b58f2b-926b-8dee-bb56-7267ddd9c8a3.png)

「ルートを編集」を押下する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/ffd9d4d2-ee4a-596f-84be-ed21e8340fe6.png)

先ほど作成したインターネットゲートウェイをルートへ追加します。
送信先：0.0.0.0/0
ターゲット：先に作成した「インターネットゲートウェイ」を選択のうえ、「変更を保存」する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/b98c8468-11ed-da6d-a739-2f14f790c8cb.png)

# 2. Elastic Beanstalkの構築

サービスから「Elastic Beanstalk」を検索し、「環境を作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/ebd1e7c8-f3d9-8bb3-a49e-0133434a70ef.png)

### ステップ1：環境を設定
環境枠：ウェブサーバー環境
アプリケーション名：適宜入力
プラットフォーム：Tomcatを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/9d4812ba-f81e-8f09-efb1-15a89b014634.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/beb1ceeb-5508-fbfe-9b1d-75cef5be9a7b.png)
プリセット：単一インスタンス (無料利用枠の対象)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/f939bb19-24df-2d53-a5dd-727b9d6e6275.png)


### ステップ2：サービスアクセスの設定
既存のサービスロールを使用を選択
EC2 キーペア：適宜作成
EC2 インスタンスプロファイル：次のステップで作成するロールを指定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/330ae5f0-4b4c-d205-b5c7-4f10c387a1a5.png)

### ロールの作成

:::note info
以前は、デフォルトでロールも作成されていましたが、セキュリティの強化により別途作成する必要があるようです。
https://docs.aws.amazon.com/ja_jp/elasticbeanstalk/latest/dg/iam-instanceprofile.html

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/2b2390f9-9e3f-3fc0-02af-87519b47fd78.png)
:::

サービスから「IAM」を検索し、「ロールを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/4845f0e4-e3f9-a7df-533c-b09c3c8da68c.png)
サービスまたはユースケース:EC2を選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/933dad18-0271-e391-8bf2-3e0ef209dc1b.png)

以下の3つを選択する。
> AWSElasticBeanstalkWebTier 
  AWSElasticBeanstalkWorkerTier
  AWSElasticBeanstalkMulticontainerDocker

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/7100eadf-998f-d255-c4ef-646383650db2.png)


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/de65654e-d3a1-6739-5b66-5f0c03d563ce.png)
⇒ロール名を適宜入力のうえ、「ロールを作成」を押下

### ステップ3：ネットワーキング、データベース、およびタグをセットアップ - オプション

VPC：今回作成したVPCを選択
インスタンスの設定：今回作成したサブネットを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/065f6234-df32-23aa-043e-810df872e0e1.png)

データベース：RDSのデータベースを作成する場合はここで設定する。（今回はスキップ）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/3fbd5743-32ef-560a-889d-b64f156e4607.png)

### ステップ4:インスタンスのトラフィックとスケーリングを設定
設定変更なし

### ステップ5:更新、モニタリング、ログ記録を設定
ヘルスレポート：ベーシック（任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/0d33bfbb-fb37-05de-d62a-b57d2705b0ca.png)

マネージド更新：非アクティブ（任意）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/fdf44668-c776-5da8-8d26-353be0ca0620.png)

プロキシサーバー：Apache
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/9c046e84-91d0-714a-d108-cf5aee7e1f47.png)

### ステップ6:レビュー
設定情報を確認し、問題なければ「送信」押下。

あとは、エラーが出ないように祈りながら待つ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/23112d57-a7b3-331e-9b50-22e1cf6d2e35.png)

環境の概要のドメインをクリックすると・・・
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/42704dee-467c-f14d-5f86-ac178dcb51f8.png)

WEBブラウザから初期ページが表示されれば成功！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/f3cb0733-94ff-b779-1a6f-0537f12154d2.png)

## EC2への接続確認
サービス「EC2」を検索し、今回作成されたEC2を選択する。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/61a222d3-cc00-cf1d-022d-6be872617f79.png)


セキュリティグループのインバウンドルールにSSHの許可を追加する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/45d528d1-1621-1c1c-0791-cad0ee53b27f.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/321172e1-b202-a25c-54cf-05fe9a1608c1.png)
「SSH」を追加
ソースは適宜IPを絞るとよい。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/40e50005-21ae-784d-163d-e1064db04347.png)


EC2の「接続」より、
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/3a812142-9052-ba8f-d173-673ab1e49e2d.png)

「EC2 Instance Connect」 より接続ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/148d66ca-88cc-6408-af5a-b069c56367f7.png)

無事に接続できました！
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/0d8d10cf-df95-d78d-f9d3-68a5efe7a321.png)

## Elastic Beanstalkの操作
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/327e6c14-aedf-98aa-879f-4b87a2d7d1d3.png)
「アクション」から各操作を行えます。

- アプリケーションサーバーを再起動：その名の通り
- 環境を再構築：構築したElastic Beanstalk環境を一から再構築し直します。（EC2で作成したデータ消えます）
- 環境を終了：構築したElastic Beanstalkのリソースを削除します。

## Auto Scaling グループからの除外
この章の最後にAuto Scaling グループからの除外方法について記載します。
Elastic Beanstalkでは、自動でAutoScalingが作成されます。
便利ではあるのですが、EC2を一時的に停止したい時などは不便なので、除外してみます。

EC2のサービスから「Auto Scaling グループ」を選択し、Elastic Beanstalkにて自動作成されたグループを選択し開きます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/0d7d8cef-b0bc-0538-882e-57b2aad70044.png)

詳細タブのページ下部に「高度な設定」の項目があるので「編集」ボタンを押下
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/6448db3f-58b4-d08c-6086-35e7a03b4dec.png)

中断されたプロセス：Health Check　にチェックをいれ「更新」ボタンを押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/3bdc4092-d397-1d26-8aca-b25aaef3f4fd.png)

これで、EC2を停止しても新たなインスタンスは生成されません。

# 3. DB構築
DB構築は２通りあります。
- 構築したEC2内にDBを構築する方法
- RDSを利用する方法

# 構築したEC2内にDBを構築する方法
Amazon Linux 2023には、PostgreSQL15のパッケージが既に用意されているため、簡単にインストールは可能です。
手順は以下の通り。

1. インストール
    ```
    sudo dnf install -y postgresql15-server
    ```
1. 初期化
    ```
    sudo postgresql-setup initdb
    ```
1. postgresユーザのパスワードを設定
    ```
    sudo passwd postgres
    ```
1. サーバーを起動
    ```
    sudo systemctl start postgresql
    ```
1. postgresユーザへ切り替え
    ```
    su - postgres
    ```
1. データベース一覧を確認
    ```
    psql -l
    ```
以下が表示されれば成功。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/54931768-7208-b5b2-8a0e-d3d3c8ee9fba.png)

<!--
# RDSを利用する方法
### データベースの作成
PostgreSQLを選択
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/5f0789ba-9413-7c35-2c6d-a29892e5dd00.png)

テンプレート：無料利用枠
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/028145af-4846-57c7-31fd-ff258a8829a1.png)

DB インスタンス識別子：適宜
パスワードの自動生成：チェック
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/94785236-3a8d-102e-9de0-c7bc8d067139.png)

「EC2コンピューティングリソースに接続」を選択し、先に作成したEC2を選択する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/7ee4664f-3305-2c17-df25-03eb4240b47a.png)

チェックを外す
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/a68380b3-93db-310b-7560-761ef67fcf51.png)
⇒「データベースの作成」を押下して作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/2cbf0455-c486-f01e-9410-17b79d9877f8.png)

:::note warn
作成完了後には以下の画面が表示されます。
DBのパスワードはこのタイミングでしか表示されません。
「接続の詳細の表示」を選択してパスワードはメモしておきましょう！

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/ea3cd0e6-9da0-bf13-3d0c-c0621fd33bed.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/c18260bd-1904-d507-77a0-8e80e2f917cc.png)
:::

以上で、構築はすべて完了です。

以下のコマンドで接続できれば成功です。
```
psql -h [エンドポイント] -d [DB名] -U postgres
```
-->

# S3の構築
最後にEC2とのファイルのやり取りをするために、S3を構築します。
サービスから「S3」を選択し、「バケットを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/35722b1b-2741-6aa0-2cf8-6995a7c65420.png)

設定画面にて、任意のバケット名を入力し、「バケットを作成」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/da37fb87-4a52-0b8e-2beb-e7a5d1b2677a.png)

これでS3の作成は完了です。
作成したS3を開き、「アップロード」ボタンから任意のファイルをアップロードできます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/fcc26424-5dc3-820b-eb6f-41bc88c74b27.png)


このままだと、EC2からS3へのアクセス権限が無いため、ロールを追加します。
前ステップで作成したロールを開き、「許可の追加」から「ポリシーのアタッチ」を押下。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/3ca9b3b4-5de0-6a5c-b8d1-2ae41a119233.png)
「AmazonS3FullAccess」を検索のうえ選択し、「許可を追加」
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188825/4e86bd64-1733-7073-bdb6-e9cb9dcd1923.png)


以上で構築は完了です。
S3のファイルをEC2へダウンロードするには、以下のコマンド「aws s3 cp」でできます。
```
aws s3 cp s3://{バケット名}/{パス} {コピー先のEC2ファイルパス} 
```

お疲れさまでした。

# お掃除
一通り動作確認が終わったら後片付けをします。
1. Elastic Beanstalkのアクションから「環境を終了」を選択し、リソースを削除する
1. RDSでDBを構築した場合は、RDSのインスタンスを削除する
1. 作成したVPCを削除する
1. 作成したS3を削除する