--- title: Spring Boot + DockerでAWS Elastic Beanstalkにデプロイ tags: ["AWS", "AWS Elastic Beanstalk", "Docker", "Java", "Spring Boot"] categories: ["Programming", "Java", "org", "springframework", "boot"] date: 2014-12-01T12:47:49Z updated: 2014-12-01T12:47:49Z --- Spring Bootは実行可能jar形式でパッケージングするのが普通なので、CloudFoundryやHerokuといったPaaSにデプロイするのは簡単だけれども、AWS Elastic Beanstalkみたいにwarのみサポートしている環境だと、[warに変換する手間](http://spring.io/guides/gs/convert-jar-to-war/)があった(そんなに大変ではない)。 せっかくなのでjarを使いたい。warを捨てたい。なので、Dockerを使うことにした。 やり方はいろいろあるみたいだが、Docker初心者な自分には[この記事](http://blog.adaofeliz.com/2014/11/21/first-look-spring-boot-and-docker/)が分かりやすかった。 この記事を試し、書いてあるやり方がセットアップされている[maven archetype](https://github.com/making/spring-boot-docker-blank)を作ったので、使い方を紹介する。 ### Maven Archetypeの使い方 Bashの場合 mvn archetype:generate\ -DarchetypeGroupId=am.ik.archetype\ -DarchetypeArtifactId=spring-boot-docker-blank-archetype\ -DarchetypeVersion=1.0.0 コマンドプロンプト(Windows)の場合 mvn archetype:generate^ -DarchetypeGroupId=am.ik.archetype^ -DarchetypeArtifactId=spring-boot-docker-blank-archetype^ -DarchetypeVersion=1.0.0 たいしたことをやっていないので、もちろん自分で`Dockerfile`作ってもいい。 ### 使用例 #### プロジェクト作成 ``` $ mvn archetype:generate -B\ -DarchetypeGroupId=am.ik.archetype\ -DarchetypeArtifactId=spring-boot-docker-blank-archetype\ -DarchetypeVersion=1.0.0\ -DgroupId=com.example\ -DartifactId=hajiboot\ -Dversion=1.0.0-SNAPSHOT ``` #### アプリケーションのビルド ``` $ mvn clean package $ cd target $ sudo docker build -t spring-boot-docker-demo . ``` `mvn package`すると`Dockerfile`が`target`以下にコピーされるようになっている。 #### Dockerコンテナへデプロイ ``` $ sudo docker run -p 8080:8080 -t spring-boot-docker-demo ``` [http://localhost:8080](http://localhost:8080)にアクセスすれば「Hello World!」が表示されるはず。 ### AWS Elastic Beanstalkへデプロイ ここまでローカル開発環境のDockerを使ったけど、Elastic Beanstalkにデプロイするのであれば、ローカルのDockerは不要。 Elastic Beanstalkへのデプロイ方法もいろいろあるけど、ここでは簡単そうな`Dockerfile` + `Dockerrun.aws.json` + 実行可能jarファイルをzipに固めて送る方法をとる。(`Dockerrun.aws.json`もコピーされるようになっているので、この3点セットは`mvn package`で`target`以下に出来る) `mvn package`のあと、`target`ディレクトリに移動すると`app.zip`が出来ているのがわかります。 これは以下のコマンド実行結果を同じです。 ``` $ zip app.zip Dockerfile Dockerrun.aws.json *.jar ``` これだけであればDockerインストールは不要ですね! あとはこのzipをAWSにデプロイする。 "AWS Elastic Beanstalk Management Console"に行って、 ![Beanstalk01](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-01.png) Platformに"Docker"を選択。 ![Beanstalk02](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-02.png) 「Launch Now」をクリックして、環境が出来上がるまで数分待つ。 ![Beanstalk03](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-03.png) "Health"が"Green"になったら準備OK。 ![Beanstalk04](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-04.png) さっき作った、`app.zip` を選択して、アプリケーションのバージョンを適当に記入し、"Deploy"をクリック。 ![Beanstalk05](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-05.png) アプリケーションがデプロイされたら、"Health"が再び"Green"になる。 ![Beanstalk06](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-06.png) Elastic Beanstalkのエンドポイント(default-environment-XXXXXXXX.elasticbeanstalk.com)にアクセスすると"Hello World!"が表示されるはず! ![Beanstalk07](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-07.png) この雛形プロジェクトには"Spring Boot Actuator"が設定されているので、デプロイされた環境の情報もすぐに見れる。 ![Beanstalk08](https://github.com/making/spring-boot-docker-blank/raw/master/images/beanstalk-08.png) 意外と簡単。 元々高いポータビリティがさらに高まりました! これではっきり言える War is over! --- 地味なファイルアップロード方式でデプロイしたが、CUIでのデプロイはまた今度! Twitterで http://stackoverflow.com/questions/27185671/elastic-beanstalk-docker-and-continuous-integration をお勧めされた。 アプリの作り方に関しては「はじめてのSpring Boot」を読みましょう!