スクリーンショット_2019-07-30_11

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でパイプライン作成

画像1

サービスロール: 新しいサービスロール
高度な設定
アーティファクトストア: デフォルトのロケーション

ソースプロバイダ: GitHub
(GitHub認証して対象リポジトリのアクセス権限を与える)
(リポジトリと対象ブランチを指定)
検証オプション: Githubウェブフック

プロバイダー: CodeBuild


2. CodeBuildのビルドプロジェクト作成

画像2

環境イメージ: カスタム(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アプリケーションの作成

画像3

コンピューティングプラットフォーム: EC2/オンプレミス

デプロイグループの作成
サービスロール: 手順3で作ったCodeDeploy用のIAMロール
デプロイタイプ: インプレース
環境: EC2
デプロイ設定: AllAtOnce


CodeDeployがこけたらこのあたりをチェックすればいける


6. CodePipelineでパイプライン作成(続き)

画像4

デプロイステージを追加
プロバイダ: CodeDeploy
アプリケーション名: 手順5で作ったやつ
デプロイグループ: 手順5で作ったやつ

ひとこと

Code兄弟はAWSサービス内で完結できるのが良いところです。インターフェースも見やすいし。

いいなと思ったら応援しよう!