Movatterモバイル変換


[0]ホーム

URL:


PDF, PPTX17,720 views

Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話

JJUG CCC 2018 Fall 登壇時の資料です。 #jjug_ccc #ccc_g1

Embed presentation

Download as PDF, PPTX
Spring Boot のWeb アプリケーションをDocker に載せて AWSECS で動かしている話#jjug_ccc #ccc_g1JJUG CCC 2018 Fall2018/12/15
自己紹介• 株式会社ジャストシステム 福嶋 航• Twitter @fukushiw• Java歴約20年、JavaでWebサービス作っています• #Java100 本ノックの人https://github.com/JustSystems/java-100practices
このセッションについて• 人生で初めて、WebサービスをDockerコンテナ化してAWS ECSを使ってプロダクションリリースしたものについての話です• AWS ECS や Dockerコンテナ について、基本的なところは把握されている前提になっています• まだまだ慣れていないことやわかっていないことがあるため、セッション後や懇親会でぜひ情報交換させてください
セッションの流れ1. システム構成(Dockerコンテナにしたもの、しなかったもの)2. 各自の開発環境とビルド・デプロイの流れ(マージリクエストの前にやることと後にやること)3. β環境と本番環境、環境ごとの設定の切り替え(Gitのブランチ・プロファイル・環境変数をうまく使う)4. 本番運用に向けた「その他」の必要なこと(ログ出力設定、監視設定)5. まとめ
1システム構成(Dockerコンテナにしたもの、しなかったもの)
サービスの性質• 企業向けWebサービス• 24/7稼働• 個人向けWebサービスに比べ、アクセス頻度は高くない• 取り扱うデータ量は多い(数百GB~数TB)
JJUG CCC 2018 Springの資料UIコア機能 外部連携RDBキャッシュキャッシュキャッシュ主要機能3 RDB主要機能2 RDB主要機能1 RDBサブ機能3サブ機能2サブ機能1サブ機能6サブ機能5サブ機能4RDBキャッシュキャッシュキャッシュRDBキャッシュサブ機能7 RDB各機能(コンテキスト)はそれぞれDockerコンテナとして動作(複数配置しALBで分散)し、REST APIでやりとり:
もうちょっと具体的に(抜粋)InternetWeb Server /UI containerothercontainersIndependentInstance2IndependentInstance 1GitLab
AWS ECSの採択経緯• 弊社はAWSをよく使っていた• Kubernetes の学習コスト懸念• AWS Fargate のランニングコスト懸念
Dockerコンテナにしたもの• ほぼすべての機能(十数種類のコンテナ)• Availability Zone A とAvailability Zone C にそれぞれ1つずつ配置(一部は2つずつ配置)• WebサーバのコンテナとUIのコンテナは同じタスク定義にして、他は別々のタスク定義にした(理由は後述)
Dockerコンテナにしなかったもの• 将来 AWS Fargate にスムーズに移行できる自信がなかったもの• 他ファイルシステムのボリュームをマウントしたり、バッチやWebサービスが協働して動作する機能• crontabに慣れ親しんでいているため、精神的に「EC2インスタンスだからいざとなればなんとかなる」と安心したかった機能当然、Dockerコンテナにしてもできる。できるのだが、なんか、保険的な・・・。
WebサーバとUIのコンテナInternetWeb Server /UI containerothercontainersIndependentInstance2IndependentInstance 1GitLab
WebサーバとUIのコンテナ(拡大図)こうなっていますWeb Server UI containerInternet宛先 https:443 http:80 http:8080Web Server UI container
WebサーバとUIのコンテナWeb Server UI containerInternet宛先 https:443 http:80 http:8080 http:8080本当はこうしたかったWeb Server UI container
WebサーバとUIのコンテナX-Forwaded-ForX-Forwaded-ProtoX-Forwaded-Port---オリジナルIPhttps443オリジナルIPhttps443Web ServerのIPhttp8080Web Server UI containerInternet宛先 https:443 http:80 http:8080 http:8080Web Server UI container
WebサーバとUIのコンテナX-Forwaded-ForX-Forwaded-ProtoX-Forwaded-Port---オリジナルIPhttps443オリジナルIPhttps443Web ServerのIPhttp8080Web Server UI containerInternet宛先 https:443 http:80 http:8080 http:8080Web Server UI container
WebサーバとUIのコンテナX-Forwaded-ForX-Forwaded-ProtoX-Forwaded-Port---オリジナルIPhttps443オリジナルIPhttps443Web ServerのIPhttp8080UI container にいる Spring Boot のリダイレクト応答(http:8080宛て)を 右側のALB が戻してくれず詰んだ(解決方法がわからなかった)Web Server UI containerInternet宛先 https:443 http:80 http:8080 http:8080Web Server UI container
WebサーバとUIのコンテナで結局こうしたInternet宛先 https:443 http:80 http:8080Web Server UI containerWeb Server と UI container の Dockerコンテナを分けずに同一にするのは、「1コンテナ1アプリケーション」のベストプラクティスに反するので、踏みとどまったWeb Server UI container
再掲InternetWeb Server /UI containerothercontainersIndependentInstance2IndependentInstance 1GitLab
2各自の開発環境とビルド・デプロイの流れ(マージリクエストの前にやることと後にやること)
各自の開発環境• PC• メモリは16GB以上必須(24~32GBは欲しい)• Windowsが多数派、Macな人もちらほら• IDEはほぼ皆何かしら使っている• Eclipse• IntelliJ IDEA• Visual Studio Code• など• Git• 一番早いのはコマンド :nerd_face:
マージリクエストまで• Issueを作る/アサインする• 粒度はまちまち• コーディング、テスト• ローカル用プロファイルで動作させる Spring Bootアプリケーションが入った Dockerコンテナをビルド・起動• 単体テストは、他マイクロサービスのところはモック• コードの自己レビュー
マージリクエスト• 担当者以外が保守できるか、を最重視• 実装理由のコメントや、APIドキュメントも重視• 複雑なロジックはじっくり読む• マージ前の動作確認まではできなかった• 相当な量がやってくるので、時間的に無理• マージ後の確認でSpring Boot起動時にエラーになるとか、コンパイルエラーになるものもまれに……このあたりはシステム化したかったが、できなかった
マージ後• GitLab CIで開発環境にデプロイ• 特定のブランチへのPUSHで以下を自動実行 jarビルド (mvn clean install)  ↓ Dockerイメージビルド (docker-compose build)  ↓ ECRに登録 (docker push)  ↓ ECSのタスク定義&サービス更新 (ecs-deploy)  ↓ Mattermostに通知 (curl)• GitLabでそのブランチにPUSHできる人を限定• 複数の環境ごとにブランチを用意(後述)
マージが終わったらデプロイ 
すぐにデプロイされない罠• Dockerコンテナをホストポート固定で動作させる場合、1つのEC2インスタンスでは同一タスクは1つしか起動できない。ここで EC2インスタンス数=タスク数 にすると、デプロイ時の動作は  タスク停止→draining→タスク起動となる。新しいタスクの起動が前のタスクのdrainingが完了するまで待たされるのですぐに新Dockerコンテナが起動しない。• ホストポートをダイナミックにすれば関係ない
CASE 1EC2インスタンス数>タスク数の場合もうちょっと詳しく
Case1 インスタンス数>タスク数Container A1タスク定義= A1:1Instance 2(1)Instance1でA1:1タスク実行中Instance 1
Case1 インスタンス数>タスク数Container A1タスク定義= A1:1(2)新しいタスクA1:2はすぐにInstance2にデプロイ  され、A1:1 は draining に。Instance 1Container A1タスク定義= A1:2Instance 2draining
Case1 インスタンス数>タスク数(3)drainingされたコンテナは消えるInstance 1Container A1タスク定義= A1:2Instance 2
CASE 2EC2インスタンス数=タスク数の場合もうちょっと詳しく
Case2 インスタンス数=タスク数Container A1タスク定義= A1:1(1)Instance1とInstance2でA1:1タスク実行中Instance 1Container A1タスク定義= A1:1Instance 2
Case2 インスタンス数=タスク数Container A1タスク定義= A1:1(2)片方のインスタンスでdraining、もう一方は  A1:1のままInstance 1Container A1タスク定義= A1:1Instance 2draining
Case2 インスタンス数=タスク数Container A1タスク定義= A1:2(3)drainingが完了すると新しいタスクがデプロイ  され、もう一方がdrainingになる。Instance 1Container A1タスク定義= A1:1Instance 2draining
Case2 インスタンス数=タスク数Container A1タスク定義= A1:2(4)drainingが完了すると新しいタスクがデプロイ  される。Instance 1Container A1タスク定義= A1:2Instance 2
drainingにかかる時間• ターゲットグループの属性「登録解除の遅延」で指定• 新しいタスクをデプロイすると、すぐには置き換わらず、ここで指定した時間が経過するまで待たされる• タイムアウトを長くすれば、処理中が途中で中断されるリスクは下がるが、デプロイに時間がかかってしまう
3β環境と本番環境、環境ごとの設定の切り替え(Gitのブランチ・プロファイル・環境変数をうまく使う)
複数のβ環境と1つの本番環境本番環境β環境1 β環境2 β環境3
β環境1• 各マイクロサービスが最初に結合を行う環境• 更新サイクルが早い• 本線には取り込まない可能性があるものもここで試すことは可能(敷居が低い)• とはいえ影響のあるものは Mattermost で声を掛けてから
β環境2• 第三者評価を行う環境• 開発チームがβ環境1で確認を終えているものがデプロイされる• デプロイ手順も含めて本番環境に投入する前のリハーサルの場となる
β環境3• 性能評価を行う環境• インスタンスタイプや台数は本番環境と同じ• 負荷を掛けて、本番環境に必要なインスタンスタイプやECSタスクの個数、割り当てメモリ等を導き出すための材料を得る
プロファイルの切り替え• 各β環境や本番環境用はそれぞれプロファイルを分けて定義micro-service-1/src/main/resources/application-beta1.propertiesapplication-beta2.propertiesapplication-beta3.propertiesapplication-production.properties@Profile("application-beta1")
ブランチの切り替え• ブランチポリシーは Git Flow を採用• master, develop, feature, release, hotfix• GitLab CI でビルドする際は、環境ごとに別々のブランチにPUSH• β環境1ビルド・デプロイ用ブランチ、同2用、同3用• 本番環境ビルド・デプロイ用ブランチブランチを分けることでミス防止
環境変数の利用• Spring Framewok はプロパティファイルよりも環境変数を優先してくれるので、Docker イメージを作り直すことなく、ECSタスクの環境変数の変更(とサービスの更新)だけで動作設定を変更できる• Dockerイメージビルドして、ECRにアップロードして、・・・は、数分~十数分かかることも• ECSタスクの変更だけであれば数十秒のWeb画面操作だけで更新完了
4本番運用に向けた「その他」の必要なこと(ログ出力設定、監視設定)
ログ出力(要件)• 同一種類のコンテナのログは時系列に見たい• あとで分析に使えるようにしたい• エラーレベルのものは監視アラートを出したい
ログ出力(構成)Log ServerS3 Bucketcontainerson EC2filefluentdmountEC2instancemainerrorZabbixagent
ログファイル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" ]
監視内容(プログラムの外側)• エラーログ監視• Zabbix agent がエラーログファイルの変更を監視• EC2インスタンス監視(CPU/メモリなど)• ECS監視(リザーブ領域との対比等)• Docker space は特に重要• Webアクセス監視などなど
監視内容(プログラムの内側)• ヘルスチェック• ALBからのヘルスチェックのエンドポイントを作成• 各マイクロサービスが依存するRDBやキャッシュへの通信の疎通まで確認。204 or 500 で応答。• アプリケーションメトリクス• 処理キューの長さ、動作スレッド数、など• 重要処理の処理時間も入れたかったが、これから
未解決事件 
コンテナ間通信が502エラーInternetWeb Server /UI containerothercontainersIndependentInstance2IndependentInstance 1GitLabここの通信が502になる1日に数回から十数回発生原因不明リトライで対処中誰か教えてください:pray:
5まとめ
まとめ• Spring BootアプリケーションのマイクロサービスはAWS ECSで普通に使える• Webサーバと入口のコンテナだけ1つのタスクに同居させ、他は別々のタスクにした• Dockerコンテナ入れ替え時の待ち時間に注意• 3つのβ環境を含めた4環境で別々にGitLabCIでビルド・デプロイ、環境変数を活用• ログはコンテナから母艦経由S3へ• 監視はプログラムの外側と内側の両方

Recommended

PDF
WebSocket / WebRTCの技術紹介
PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
さくっと理解するSpring bootの仕組み
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
マイクロサービス 4つの分割アプローチ
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
マイクロにしすぎた結果がこれだよ!
PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
イミュータブルデータモデル(世代編)
PDF
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
PDF
例外設計における大罪
PDF
マルチテナント化で知っておきたいデータベースのこと
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
文字コードに起因する脆弱性とその対策(増補版)
PDF
Javaのログ出力: 道具と考え方
PPTX
イベント・ソーシングを知る
PDF
SQL大量発行処理をいかにして高速化するか
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
The Twelve-Factor Appで考えるAWSのサービス開発
PDF
Serverless時代のJavaについて
PDF
3分でわかるAzureでのService Principal
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
ソーシャルゲームのためのデータベース設計
PDF
マイクロサービスに至る歴史とこれから - XP祭り2021
PDF
ドメイン駆動設計 本格入門
PDF
AWSでDockerを扱うためのベストプラクティス
PDF
Amazon ECS事始め

More Related Content

PDF
WebSocket / WebRTCの技術紹介
PDF
ドメイン駆動設計のための Spring の上手な使い方
PPTX
さくっと理解するSpring bootの仕組み
PPTX
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
PDF
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
PDF
マイクロサービス 4つの分割アプローチ
PDF
コンテナ未経験新人が学ぶコンテナ技術入門
PDF
マイクロにしすぎた結果がこれだよ!
WebSocket / WebRTCの技術紹介
ドメイン駆動設計のための Spring の上手な使い方
さくっと理解するSpring bootの仕組み
今こそ知りたいSpring Batch(Spring Fest 2020講演資料)
ツール比較しながら語る O/RマッパーとDBマイグレーションの実際のところ
マイクロサービス 4つの分割アプローチ
コンテナ未経験新人が学ぶコンテナ技術入門
マイクロにしすぎた結果がこれだよ!

What's hot

PDF
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
PDF
イミュータブルデータモデル(世代編)
PDF
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
PDF
例外設計における大罪
PDF
マルチテナント化で知っておきたいデータベースのこと
PPTX
SPAセキュリティ入門~PHP Conference Japan 2021
PDF
文字コードに起因する脆弱性とその対策(増補版)
PDF
Javaのログ出力: 道具と考え方
PPTX
イベント・ソーシングを知る
PDF
SQL大量発行処理をいかにして高速化するか
PPTX
ぱぱっと理解するSpring Cloudの基本
PDF
怖くないSpring Bootのオートコンフィグレーション
PDF
PlaySQLAlchemy: SQLAlchemy入門
PDF
The Twelve-Factor Appで考えるAWSのサービス開発
PDF
Serverless時代のJavaについて
PDF
3分でわかるAzureでのService Principal
PDF
ヤフー社内でやってるMySQLチューニングセミナー大公開
PDF
ソーシャルゲームのためのデータベース設計
PDF
マイクロサービスに至る歴史とこれから - XP祭り2021
PDF
ドメイン駆動設計 本格入門
[Aurora事例祭り]Amazon Aurora を使いこなすためのベストプラクティス
イミュータブルデータモデル(世代編)
[AWS EXpert Online for JAWS-UG 18] 見せてやるよ、Step Functions の本気ってやつをな
例外設計における大罪
マルチテナント化で知っておきたいデータベースのこと
SPAセキュリティ入門~PHP Conference Japan 2021
文字コードに起因する脆弱性とその対策(増補版)
Javaのログ出力: 道具と考え方
イベント・ソーシングを知る
SQL大量発行処理をいかにして高速化するか
ぱぱっと理解するSpring Cloudの基本
怖くないSpring Bootのオートコンフィグレーション
PlaySQLAlchemy: SQLAlchemy入門
The Twelve-Factor Appで考えるAWSのサービス開発
Serverless時代のJavaについて
3分でわかるAzureでのService Principal
ヤフー社内でやってるMySQLチューニングセミナー大公開
ソーシャルゲームのためのデータベース設計
マイクロサービスに至る歴史とこれから - XP祭り2021
ドメイン駆動設計 本格入門

Similar to Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話

PDF
AWSでDockerを扱うためのベストプラクティス
PDF
Amazon ECS事始め
PDF
20180313 Amazon Container Services アップデート
PDF
AWS Blackbelt 2015シリーズ Amazon EC2 Container Service (Amazon ECS)
PDF
オトナのDocker入門
PDF
Single Command Deployのための gradle-aws-plugin講座
PDF
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
PDF
AWS Black Belt Online Seminar 2017 Docker on AWS
PDF
CloudSpiral 2014年度 Webアプリ講義(2日目)
PPTX
20140621 july techfesta (JTF2014) 突発**むけAWS
PDF
JAWS-UG Meets Windows (JAWS Days 2017)
PDF
捕鯨!詳解docker
PDF
Elastic beanstalk docker_support
PPTX
2019年度 CaaS ワークショップ @ NTTコム
PDF
20180220 AWS Black Belt Online Seminar - Amazon Container Services
PDF
コンテナ導入概要資料2018
PDF
Docker for Windows & Web Apps for Containers 実践活用技法
PDF
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
PPTX
ラズパイ2で動く Docker PaaSを作ってみたよ
 
PDF
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築
AWSでDockerを扱うためのベストプラクティス
Amazon ECS事始め
20180313 Amazon Container Services アップデート
AWS Blackbelt 2015シリーズ Amazon EC2 Container Service (Amazon ECS)
オトナのDocker入門
Single Command Deployのための gradle-aws-plugin講座
Dockerを使ったローカルでの開発から本番環境へのデプロイまで
AWS Black Belt Online Seminar 2017 Docker on AWS
CloudSpiral 2014年度 Webアプリ講義(2日目)
20140621 july techfesta (JTF2014) 突発**むけAWS
JAWS-UG Meets Windows (JAWS Days 2017)
捕鯨!詳解docker
Elastic beanstalk docker_support
2019年度 CaaS ワークショップ @ NTTコム
20180220 AWS Black Belt Online Seminar - Amazon Container Services
コンテナ導入概要資料2018
Docker for Windows & Web Apps for Containers 実践活用技法
Spring Boot on Kubernetes : Yahoo!ズバトク事例 #jjug_ccc
ラズパイ2で動く Docker PaaSを作ってみたよ
 
Docker と ECS と WebSocket で最強のマルチプレイ・ゲームサーバを構築

More from JustSystems Corporation

PDF
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
PDF
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
PDF
現役23名のPM:タイプ別マネジメントパターン
PPTX
JavaでインメモリSQLエンジンを作ってみた
PDF
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
PDF
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
PDF
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
PDF
最新のJava言語仕様で見るモジュールシステム #jjug
PPTX
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
PDF
JustTechTalk#10 React開発における自動テスト実践
PDF
JustTechTalk#10windowsアプリでのテスト自動化事例
PDF
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
PDF
AWS運用における最適パターンの徹底活用
PPTX
ジャストシステムのDevOps実例 今後の取り組み
PDF
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
PPTX
Kotlin is charming; The reasons Java engineers should start Kotlin.
PDF
CSSレイアウトでなぜ失敗するか?
PPTX
Selenium WebDriver + python で E2Eテスト自動化
PPTX
TypeScriptの大規模開発への適用
PDF
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-
「技術内閣制度」〜2年間やってきて得られた事とこれから〜 #devsumi
事業に貢献する商品開発と その成長の仕組み作り ~これからのエンジニアに必要とされるスキルとは~
現役23名のPM:タイプ別マネジメントパターン
JavaでインメモリSQLエンジンを作ってみた
DDDとクリーンアーキテクチャでサーバーアプリケーションを作っている話
JustTechTalk#11_スマイルゼミ顧客満足度への貢献
ピュアJavaだと思った?残念androidでした~いつからAndroidをJavaだと錯覚していた?~
最新のJava言語仕様で見るモジュールシステム #jjug
「書ける」から「できる」になれる! ~Javaメモリ節約ノウハウ話~
JustTechTalk#10 React開発における自動テスト実践
JustTechTalk#10windowsアプリでのテスト自動化事例
インパス! あのこれダメッス! ~Javaコードレビューの指摘ポイント10選~
AWS運用における最適パターンの徹底活用
ジャストシステムのDevOps実例 今後の取り組み
Javaチョットデキルへの道〜JavaコアSDKに見る真似したいコード10選〜
Kotlin is charming; The reasons Java engineers should start Kotlin.
CSSレイアウトでなぜ失敗するか?
Selenium WebDriver + python で E2Eテスト自動化
TypeScriptの大規模開発への適用
UX実現に向けた社内の取り組みについて-訴求ファーストによる商品開発-

Spring Boot の Web アプリケーションを Docker に載せて AWS ECS で動かしている話


[8]ページ先頭

©2009-2025 Movatter.jp