SpringBootで構築したアプリケーションをAWS CodePipelineを用いてEC2インスタンスに自動デプロイするための手順をまとめます。
構成
- Gitリポジトリ
- GitHub(なんでも良い)
- CI
- Jenkins
- Test & Build
- Maven(Gradleでもそんなに変わらない)
- APサーバ
- SpringBoot 1.4.x on EC2
大まかな流れ
基本的に以下で紹介していただいた内容をもとに実施した。
SpringBootで構築したアプリケーションがgitにpushされたらCodeDeployで自動デプロイされる仕組み
開発者
- 任意の(ここでは例としてmaster) branchにpush
Jenkins
- 5分毎にポーリングし、develop branchが更新されていればpull
- Test & Build(Maven)
- Test & Buildが成功したらS3にリビジョンをアップロード
CodePipeline
- S3からアップロードされたファイルを取得
- CodeDeployを起動
CodeDeploy
- jarファイルに実行権限を付与
- CodeDeployから各インスタンスにSpringBootアプリがdeployされ、新しいバージョンのアプリが起動する。
サンプルコード
CodeDeployを利用した自動デプロイを行ったサンプルコード(GitHub)
追加で実施した作業
以下は、更新した箇所のみ記載。
AWS EC2インスタンスのJavaバージョンを1.8にする。
AWS EC2インスタンスのJavaバージョンがOpenJDK1.7だった。
Oracle JDK1.8をインストールすることを前提としているため、JDKのアップデートを行う。
参照:Amazon Linuxにjdk1.7 or 1.8インストール
SpringBootアプリケーションのサービス化
以下のページを参考にSpringBootアプリケーションのサービス化を行う。
Spring Bootでwarファイル作成&jarのサービス化
- デプロイするjarファイル名:demo.jar
- 起動するサービス名:demo
CodeDeploy
- アプリケーション名:springboot-demo
- アプリケーショングループ名:springboot-demo-group
appspec.ymlは今回の構成は以下のようにした。
version: 0.0
os: linux
files:
- source: demo.jar
destination: /var/myapp/
overwrite: yes
hooks:
ApplicationStop:
- location: scripts/appstop.sh
timeout: 300
runas: root
ApplicationStart:
- location: scripts/appstart.sh
timeout: 300
runas: root
また、サービス停止・起動用スクリプトは以下のようにした。
サービス停止用スクリプト
#!/bin/sh
service demo stop
サービス起動用スクリプト
#!/bin/sh
chmod u+x /var/myapp/demo.jar # jarファイルに実行権限を付与
service demo start
AWS CodePipeline
CodePipelineの設定を行う。
1.パイプライン名の登録
3.ビルド設定
Jenkinsでビルド済みなので、ビルド設定はなし。
4.デプロイ設定
上記、CodeDeployで設定したアプリケーション名およびアプリケーショングループ名を選択
5.サービスロール設定
「ロールの作成」からロール名を登録する。
6.「パイプラインの作成」ボタンを押下して完了。
[Jenkins]S3にリビジョンをアップロードする
1.サンプルコードを利用する場合、S3にアップロードするファイル群をzip形式にまとめる。
JenkinsのJob設定画面でシェルの実行
を選択し、以下を追加する。
cd target
cp demo-0.0.1-SNAPSHOT.jar ../deploy/demo.jar
cd ../deploy/
jar -cMf demo.zip *
2.JenkinsのS3アップロードプラグインを利用して、zip化したファイルをS3にアップロードにする。
以下、設定画面の例。
[Destination bucket]には、CodePipelineで設定したS3バケットを指定する。
3.[保存]ボタンを押下して完了。