AWSのCode三兄弟を使ってEC2にPlayFrameworkアプリケーションをデプロイする
やりたいこと
Githubのリポジトリでdevelopブランチが更新されたのをトリガーに
CodeBuildでPlayFrameworkアプリをビルドし
CodeDeployでEC2へのソース配布とアプリ再起動を行う
前提
- すでにEC2上でアプリを動かす環境は整っている
- 実行場所は/opt/my-app
手順
1. CodePipelineでパイプライン作成
2. CodeBuildのビルドプロジェクト作成
3. CodeDeploy利用の準備
4. デプロイ先のEC2インスタンス上の設定
5. CodeDeployアプリケーションの作成
6. CodePipelineでパイプライン作成(続き)
詳細
1. CodePipelineでパイプライン作成
サービスロール: 新しいサービスロール
高度な設定
アーティファクトストア: デフォルトのロケーション
ソースプロバイダ: GitHub
(GitHub認証して対象リポジトリのアクセス権限を与える)
(リポジトリと対象ブランチを指定)
検証オプション: Githubウェブフック
プロバイダー: CodeBuild
2. CodeBuildのビルドプロジェクト作成
環境イメージ: カスタム(Docker)
環境タイプ: Linux
イメージレジストリ: その他のレジストリ
外部レジストリのURL: eed3si9n/sbt:jdk11-alpine
(java11, sbt1.2が使いたかったのでこちらお借りしました)
ビルド仕様: buildspecファイルを使用する
buildspec.yml
version: 0.2
phases:
build:
commands:
- echo Build started on `date`
- sbt dist
post_build:
commands:
- echo Build completed on `date`
artifacts:
discard-paths: yes
files:
- target/universal/my-app-1.0-SNAPSHOT.zip
- deploy/*
cache:
paths:
- '/root/.m2/**/*'
- '/root/.sbt/**/*'
- '/root/.ivy2/**/*'
/.m2 /.sbt /.ivy2をローカルでキャッシュ
これでビルド時間が10→2分くらいになる。
dockerキャッシュも使う
3. CodeDeploy利用の準備
CodeDeploy用のIAMロールを作成
EC2用のIAMロールを作成
ソース解凍とアプリ再起動のスクリプト
deployディレクトリ以下にrestart.shとappspec.ymlを置くことにした(ビルド時にこれらのファイルを成果物zipに含めている)
restart.sh
#!/bin/sh
cd /home/ec2-user
unzip /var/tmp/my-app-1.0-SNAPSHOT.zip
rm -rf /opt/my-app/*
mv -f my-app-1.0-SNAPSHOT/* /opt/my-app
sudo service supervisord restart
appspec.yml
version: 0.0
os: linux
files:
- source: my-app-1.0-SNAPSHOT.zip
destination: /var/tmp
hooks:
ApplicationStart:
- location: restart.sh
4. デプロイ先のEC2インスタンス上の設定
EC2用のIAMロールをアタッチ
CodeDeployエージェントのインストール
EC2上のPlayframeworkアプリ実行をデーモン化
supervisordを使う
$ sudo yum install -y https://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm
$ sudo yum --enablerepo=epel install -y supervisor
$ sudo service supervisord start
$ sudo systemctl enable supervisord.service
$ sudo vi /etc/supervisord.d/my-app.ini
[program:my-app]
process_name=%(program_name)s
directory=/opt/my-app
command=/bin/bash -c "exec bin/my-app -J-Xms128M -J-Xmx1024m -Dhttp.port=9000 -Dconfig.file=/opt/my-app/conf/application.dev.conf -Dlogger.file=/opt/my-app/conf/logback.dev.xml -Dpidfile.path=/dev/null"
autostart=true
autorestart=true
user=ec2-user
redirect_stderr=true
stdout_logfile=/var/log/my-app/%(program_name)s.log
stdout_logfile_maxbytes=10MB
stdout_logfile_backups=10
5. CodeDeployアプリケーションの作成
コンピューティングプラットフォーム: EC2/オンプレミス
デプロイグループの作成
サービスロール: 手順3で作ったCodeDeploy用のIAMロール
デプロイタイプ: インプレース
環境: EC2
デプロイ設定: AllAtOnce
CodeDeployがこけたらこのあたりをチェックすればいける
6. CodePipelineでパイプライン作成(続き)
デプロイステージを追加
プロバイダ: CodeDeploy
アプリケーション名: 手順5で作ったやつ
デプロイグループ: 手順5で作ったやつ
ひとこと
Code兄弟はAWSサービス内で完結できるのが良いところです。インターフェースも見やすいし。