More Related Content Similar to Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話
Similar to Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話 (20) More from JustSystems Corporation
More from JustSystems Corporation (20) Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話1. Spring Boot の
Web アプリケーションを
Docker に載せて AWS
ECS で動かしている話
#jjug_ccc #ccc_g1
JJUG CCC 2018 Fall
2018/12/15
2. 自己紹介
• 株式会社ジャストシステム 福嶋 航
• Twitter @fukushiw
• Java歴約20年、JavaでWebサービス作っています
• #Java100 本ノックの人
https://github.com/JustSystems/java-100practices
7. JJUG CCC 2018 Springの資料
UI
コア機能 外部連携
RDB
キャッシュ
キャッシュ
キャッシュ
主要機能3 RDB
主要機能2 RDB
主要機能1 RDB
サブ機能3
サブ機能2
サブ機能1
サブ機能6
サブ機能5
サブ機能4
RDB
キャッシュ
キャッシュ
キャッシュ
RDB
キャッシュ
サブ機能7 RDB
各機能(コンテキスト)は
それぞれDockerコンテナとして動作
(複数配置しALBで分散)し、
REST APIでやりとり
:
11. Dockerコンテナにしなかったもの
• 将来 AWS Fargate にスムーズに移行できる
自信がなかったもの
• 他ファイルシステムのボリュームをマウントしたり、バッ
チやWebサービスが協働して動作する機能
• crontabに慣れ親しんでいているため、精神的に
「EC2インスタンスだからいざとなればなんとかなる」と
安心したかった機能
当然、Dockerコンテナにしてもできる。できるのだが、なんか、保険的な・・・。
24. マージ後
• GitLab CIで開発環境にデプロイ
• 特定のブランチへのPUSHで以下を自動実行
jarビルド (mvn clean install)
↓
Dockerイメージビルド (docker-compose build)
↓
ECRに登録 (docker push)
↓
ECSのタスク定義&サービス更新 (ecs-deploy)
↓
Mattermostに通知 (curl)
• GitLabでそのブランチにPUSHできる人を限定
• 複数の環境ごとにブランチを用意(後述)
43. ブランチの切り替え
• ブランチポリシーは Git Flow を採用
• master, develop, feature, release, hotfix
• GitLab CI でビルドする際は、環境ごとに別々
のブランチにPUSH
• β環境1ビルド・デプロイ用ブランチ、同2用、同3用
• 本番環境ビルド・デプロイ用ブランチ
ブランチを分けることでミス防止
44. 環境変数の利用
• Spring Framewok はプロパティファイルよりも
環境変数を優先してくれるので、Docker イメー
ジを作り直すことなく、ECSタスクの環境変数の
変更(とサービスの更新)だけで動作設定を
変更できる
• Dockerイメージビルドして、ECRにアップロードし
て、・・・は、数分~十数分かかることも
• ECSタスクの変更だけであれば数十秒のWeb画面
操作だけで更新完了
48. ログファイル2種
• 全行のファイルとエラーだけの行を分けたい
• エラーだけの行を Zabbix agent で監視
• コンテナの標準出力は以下のように設定
(見やすいように改行していますが実際は1行です)
ENTRYPOINT [ "/bin/bash", "-c", "
$JAVA_HOME/bin/java $JAVA_OPTS -jar ./program.jar
--spring.profiles.active=$SPRING_PROFILE
| tee >
(grep --line-buffered -e "^[0-9-]* [0-9:.]* ERROR.*" >>
/path/to/error.log)
| tee -a /path/to/main.log
" ]
54. まとめ
• Spring Bootアプリケーションのマイクロサービス
はAWS ECSで普通に使える
• Webサーバと入口のコンテナだけ1つのタスクに同居
させ、他は別々のタスクにした
• Dockerコンテナ入れ替え時の待ち時間に注意
• 3つのβ環境を含めた4環境で別々にGitLab
CIでビルド・デプロイ、環境変数を活用
• ログはコンテナから母艦経由S3へ
• 監視はプログラムの外側と内側の両方