AWS(EC2)上にSpringBootアプリをデプロイする
Herokuといった選択肢もあるけど、せっかくならAWS上に作ったWeb アプリ(ここではSpringBootアプリ)をデプロイしたいよね。ということで、AWSを触ったことのない人でもAWS環境を構築して、デプロイできるように手順を書いてみました。 用語とか、設定値の説明はほとんど書いていないです。とりあえず手を動かしながら、覚えたい人向け。
目次
開発環境
Window10
Java1.8
Maven
Spring Boot 2.0.4
前提
<dependency> <groupId>mysql</groupId> <artifactId>mysql-connector-java</artifactId> <scope>runtime</scope> </dependency>
今回のゴール
以下AWS環境にSpring Bootアプリをデプロイする

手順
AWSインフラ構築
ざっくりとした用語説明
| 項目 | 説明 |
|---|---|
| EC2 | 仮想サーバー |
| RDS | DBサーバ |
| VPC | EC2やRDSを立てるための大枠のアドレス空間 |
| サブネット | VPCをさらに分割したアドレス空間 |
| ルートテーブル | 各サブネットのパケットの宛先を見て行先を決めるテーブル |
| パブリックサブネット | 0.0.0.0/0 (デフォルトゲートウェイへの通信) がインターネットゲートウェイに流れるような設定 |
| プライベートサブネット | 上記以外のサブネット |
| インターネットゲートウェイ | VPC、インターネット間の通信を実現するためのもの |
| Elastic IP | 静的な公開IPアドレス |
VPC、サブネットの作成
左上の[サービス]-[VPC]を選択後、[VPCの作成]より以下項目を入力して [作成]ボタンを押下
| 項目 | 設定値 |
|---|---|
| 名前タグ | testapp_vpc(適当に設定) |
| IPv4 CIDR ブロック | 10.0.0.0/16 |

VPC作成後、左上ペインより、 [サブネット]-[サブネットの作成]より以下項目を入力して[作成]ボタンを押下
| 項目 | 設定値 |
|---|---|
| 名前タグ | testapp_public_subnet(適当に設定) |
| VPC | testapp_vpc(先ほど作成したものを選択) |
| IPv4 CIDR ブロック | 10.0.0.0/16 |
| アベイラビリティゾーン | ap-northeast-1a |
| IPv4 CIDR ブロック | 10.0.1.0/24 |

同じようにして以下プライベートサブネットも作成
| 項目 | 設定値 |
|---|---|
| 名前タグ | testapp_private_subnet(適当に設定) |
| VPC | testapp_vpc(先ほど作成したものを選択) |
| IPv4 CIDR ブロック | 10.0.0.0/16 |
| アベイラビリティゾーン | ap-northeast-1a |
| IPv4 CIDR ブロック | 10.0.2.0/24 |

インターネットゲートウェイ作成及びVPCとの関連付け
左ペインより[インターネットゲートウェイ]-[インターネットゲートウェイの作成]より 以下項目を入力して[作成]ボタンを押下

| 項目 | 設定値 |
|---|---|
| 名前タグ | testapp_igw(適当に設定) |
作成後、作成したインターネットゲートウェイを選択し、[アクション]-[VPCにアタッチ]より作成したVPCを選び、アタッチボタンを押下

ルートテーブルの作成及びサブネットとの関連付け
左ペインより[ルートテーブル]-[ルートテーブルの作成]より 以下項目を入力して[作成]ボタンを押下
| 項目 | 設定値 |
|---|---|
| 名前タグ | testapp_igw(適当に設定) |
| VPC | testapp_vpc(先ほど作成したものを選択) |

作成後、作成済みのルートテーブルを選択し、下のルートタブから [ルートの編集]を押下し、以下のルートを追加
| 送信先 | ターゲット |
|---|---|
| 0.0.0.0/0 | testapp_igw(先ほど作成したインターネットゲートウェイを選択) |

ルート追加後、作成済みのルートテーブルを選択し、[アクション]-[サブネット関連付けの編集]より
作成した公開サブネット(testapp_public_subnet)を選択し、保存ボタンを押下
EC2の作成
左上の[サービス]-[EC2]を選択後、左ペインより[インスタンス]-[インスタンスの作成]より以下項目を入力して[作成]ボタンを押下
| 項目 | 設定値 |
|---|---|
| AMI | Amazon Linux2 |
| インスタンスタイプ | t2.micro |
| ネットワーク | testapp_vpc(作成したVPCを選択) |
| サブネット | testapp_public subnet |
ステップ6:セキュリティグループの設定において以下でセキュリティグループを新規作成する
| タイプ | プロトコル | ポート範囲 | ソース | 用途 |
|---|---|---|---|---|
| SSH | TCP | 22 | マイIP | サーバ接続用 |
| カスタムTCP | TCP | (SpringBootの接続ポート) | 0.0.0.0/0 | ブラウザからのアクセス用 |
ElasticIPの作成及び関連付け
左ペインより[ElasticIP]-[ElasticIPアドレスの割り当て]より [割り当て]ボタンを押下して、ElasticIPを取得する。
取得後、取得したElasticIPを選択し、[アクション]-[ElasticIPアドレスの割り当て] より作成したEC2インスタンスを選択後、[関連付ける]ボタンを押下
RDSのセキュリティグループの作成
左ペインより[セキュリティグループ]-[セキュリティグループの作成]より 以下項目を入力して、[作成]ボタンを押下。
| 項目 | 設定値 |
|---|---|
| セキュリティグループ名 | testapp_rdssg |
| 説明 | testapp_rdssg |
| VPC | testapp_vpc(作成したVPC) |
| タイプ | プロトコル | ポート範囲 | ソース | 用途 |
|---|---|---|---|---|
| MySQL/Aurora | 3306 | (EC2のプライベートIP) | DB接続用 |
RDSの作成
左上の[サービス]-[RDS]を選択後、[VPCの作成]より以下項目を入力して [作成]ボタンを押下
| 項目 | 設定値 |
|---|---|
| パラメータグループファミリー | MySQL5.7 |
| グループ名 | testapp-prgr(適当に設定) |
| 説明 | testapp-prgr(適当に設定) |
作成後、[パラメータグループアクション]-[編集]より以下パラメータを変更(日本語の文字化けを防ぐため)
| パラメータ | 説明 | 設定値 |
|---|---|---|
| character_set_client | クライアントの送信する文字コード | utf-8 |
| character_set_connection | 文字コードの情報がない時の文字コード | utf-8 |
| character_set_datebase | 参照しているデータベースの文字コード | utf-8 |
| character_set_results | クライアントへ送信する文字コード | utf-8 |
| character_set_server | 既定の文字コード | utf-8 |
以下構成でRDSを作成する
| 項目 | 設定値 |
|---|---|
| DBエンジン | MySQL |
| バージョン | 5.7.22 |
| テンプレート | 無料利用枠 |
| DB インスタンス識別子 | testapp-rds(適当に設定) |
| マスターユーザー名 | *******(適当に設定) |
| マスターパスワード | *******(適当に設定) |
| インスタンスタイプ | t2.micro |
| VPC | testapp_vpc |
| 最初のデータベース名 | *******(適当に設定) |
| セキュリティグループ | testapp_rdssg |
| パラメータグループ | testapp_prgr |
EC2に接続後、各種インストール
Powershellを開き、EC2にSSH接続する
> ssh -i "(キーペアのパス)" ec2-user@(公開IP) # EC2にSSH接続 $ sudo yum update # yumリポジトリアップデート $ yum install java-1.8.0-openjdk.x86_64 # SpringBootを動かすためのJavaをインストール $ yum install mysql # MySQLクライアントをインストール
RDSのエンドポイントを確認後、RDSに接続確認
> mysql -h (RDSのエンドポイント ) -P 3306 -u (マスターユーザ名) -p > 先ほど設定したマスターパスワード入力
環境変数を設定して、SpringBootアプリの接続情報を上書きする
※ 公式リファレンスを見るとapplication.propertiesよりも環境変数のほうが読み込み優先度が高いことがわかる
Spring Boot Reference Documentation
$ vim ~/.bach_profile # 環境変数の設定 export SPRING_DATASOURCE_URL=jdbc:mysql://(RDSのエンドポイント):3306/(作成したDB名) export SPRING_DATASOURCE_USERNAME=(設定したマスターユーザー) export SPRING_DATASOURCE_PASSWORD=(設定したマスターユーザーのパスワード) export SPRING_DATASOURCE_DRIVER_CLASS_NAME=com.mysql.jdbc.Driver $ source ~/.bash_profile # 反映
接続確認後、切断
ローカル環境でSpringBootアプリをMavenビルド
> cd (SpringBootアプリのパス) > mvnw package
EC2上にデプロイ
EC2にsftp接続後、デプロイ
> cd (ビルド後のjarファイルのあるフォルダパス) > sftp -i "(キーペアのパス)" ec2-user@(公開IP) sftp > put (jarファイル)
EC2に接続後、アプリ起動
> ssh -i "(キーペアのパス)" ec2-user@(公開IP) # EC2にSSH接続 $ java -jar ~/(jarファイル)
ブラウザからアクセス
http://(公開IPアドレス):(SpringBootの起動ポート番号)/にアクセスして DB接続できているかを確認する
参考
AWS EC2上で Spring Bootアプリ起動 - 闘うITエンジニアの覚え書き
Spring Boot Reference Documentation
Spring-Bootの設定プロパティと環境変数 - Qiita
雑感
AWSコンソール上でやるのはやっぱりしんどいし、手順も面倒くさい。あと、Paasの方が楽やん。