Spring Boot のアプリケーションを AWS EC2 にデプロイする手順


Spring Boot でサーバプログラムを作り、 AWS EC2 Amazon Linux にデプロイしました。 その時のサーバ設定等を記録しています。

環境

Maven ではなく gradle を使います。

  • Spring Boot 1.2.3
  • Tomcat 8
  • Java 1.8
  • MySQL 5.6 (AWS RDS)
  • gradle 3.4
  • Kotlin 1.0.0

ビルド関連設定

必須の設定

Spring Boot のドキュメント にも記載されている必須の設定を行います。

アプリケーションコードの追加

mainメソッドを含むクラスが SpringBootServletInitializer を継承するように変更します。 そして、 configure メソッド を オーバライド します。 Spring Boot のドキュメントでは Applicationクラス となっていますが、 私はMainクラスにしていました。

gradle の設定

build.gradle にも設定を加える必要があります。

baseNameversion の設定はなくても構いません。 apply plugin: 'war' は war を作るために必要です。

そして、 更に次の記述を追加します。

きっと dependencies のところには他にもいくつかの行が存在していると思います。 そこに providedRuntime の行を追加してください。

この部分の詳しい説明は Spring Boot のドキュメント をご参照ください。

結果、私の使っている build.gradle は次のようになりました。

ここまでの変更で、 ./gradlew build を実行すると warファイル が build/libsディレクトリ内に生成されるようになりました。

環境ごとの設定

環境ごとに設定ファイルを作っていない場合は考慮する必要がありません。

Spring Boot では、 application.properties というファイルに server.addressspring.datasource.url などの設定値を書くことができます。 私はここで下の3つのファイルを追加して、開発をしていました。

  • application-develpment.properties
  • application-local.properties
  • application-production.properties

./gradlew build で jar や war を作った場合は、 java -jar -Pspring.profiles.active=xxxxx xxxx.jar といったように実行できるのですが、 Tomcat にデプロイした後はパラメータを設定できないので、ビルド時に設定しておく必要があります。

そこで、 build.gradle に次の記述を追加します。

Gradle 3.0 以上 で、 build.gradle を Kotlin で書くことができるようになっています。 Kotlin で書く場合、 filter のところは次のようになります。

activeProfiles の値を ?: を使って書いているのは、 activeProfiles が設定されなかった場合にもビルドを成功させるためです。 そうしておかないと、 Intellij IDEA などでプロジェクトを開いた場合に、 ビルドに失敗してプロジェクトを開くことができません。

そして、 application.propertiesspring.profiles.active=@activeProfiles@ を書き加えます。 私の application.properties は次のようになりました。

これにより、ビルド時のコマンドは ./gradlew -PactiveProfiles=xxxxx build となります。 xxxxx のところには、 私の場合は local, development, production が入ります。

サーバ構築

AWS EC2 Amazon Linux でサーバを構築します。

必要なプログラムのインストール

Apache や Nginx はインストールしないやり方です。

Java

EC2 から gitリポジトリ を取得し、 EC2内でビルドして同一サーバ内にデプロイする方法をとったため、 Java は 1.8 の SDK をインストールしました。 Oracle のサイトから rpm パッケージ をダウンロードしてインストールします。 私は、 ダウンロードした rpm ファイル は /usr/local/src に入れるようにしています。

git

git コマンド が必要なので次のコマンドでインストールします。

Tomcat

Tomcat をインストールします。 Spring Boot は Tomcat を内蔵しているので、 sudo nohup java -jar ... というコマンドで起動することもできますが、 今回は Tomcat を使用します。

Amazon Linux 上 で次のコマンドを実行します。

これにより Tomcat がインストールされ、 Tomcat は service コマンド を使って起動できるようになります。

サーバ起動時に Tomcat が自動で起動するように、 次のコマンドを実行しておきます。

Tomcat 設定

Tomcat で 80番ポートをリッスンするようにしたいので 次の変更を行います。 Nginx等を使って 80番ポートへのリクエストを8080番ポートにつなぐ場合は必要ありません。

そして、 /usr/share/tomcat8/conf/server.xml を変更します。 ファイルの所有者が tomcat になっているので sudo -u tomcat vim /usr/share/tomcat8/conf/server.xmltomcatユーザとして変更を行います。 ファイルの途中、 <Connector port="8080" ... というノードがあるので、 そこに proxyPort="80" という属性値を追加します。

この変更が終わったら、 Tomcat を再起動しておきます。

デプロイ

手作業でデプロイを行います。 コマンドで自動デプロイをする場合は Gradle: 自動デプロイ もご参照ください。

コンパイル

プロジェクトディレクトリに移動して ./gradlew build または ./gradlew -PactiveProfiles=xxxx build でビルドします。

Tomcat への配置

Tomcat のディレクトリに war を配置します。

Tomcat の再起動

Tomcat を再起動します。

この後でサーバの80番ポートにアクセスすると、 ページが表示されます。