Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
現実世界でのコンテナの運び方
Search
Kazuma Watanabe
March 13, 2018
Programming
3
1.1k
現実世界でのコンテナの運び方
JAWS-UG コンテナ支部 #11
Kazuma Watanabe
March 13, 2018
Tweet
Share
More Decks by Kazuma Watanabe
See All by Kazuma Watanabe
SmartHRにおけるBiTemporal Data Modelの実践のその後 / After the practice of BiTemporal Data Model in SmartHR
wata727
1
2.5k
PHPを検査するPHPを書く / Write PHP inspection by PHP
wata727
1
2.1k
快適なコードレビューを目指して / For a comfortable code review
wata727
1
600
Lintの付き合い方とPahoutのご紹介
wata727
0
150
Querlyで始めるコードレビューの自動化
wata727
2
440
コンテナをSpot Fleetで起動するという選択肢
wata727
2
1k
エンジニア向けSaaSを支えるInfrastructure as Code
wata727
5
2.3k
SideCIのインフラ構築を自動化した話
wata727
1
2.1k
Other Decks in Programming
See All in Programming
テストケースの名前はどうつけるべきか?
orgachem
PRO
0
160
PHPで作るWebSocketサーバー ~リアクティブなアプリケーションを知るために~ / WebSocket Server in PHP - To know reactive applications
seike460
PRO
2
650
これが俺の”自分戦略” プロセスを楽しんでいこう! - Developers CAREER Boost 2024
niftycorp
PRO
0
200
fs2-io を試してたらバグを見つけて直した話
chencmd
0
240
103 Early Hints
sugi_0000
1
260
GitHubで育つ コラボレーション文化 : ニフティでのインナーソース挑戦事例 - 2024-12-16 GitHub Universe 2024 Recap in ZOZO
niftycorp
PRO
0
120
testcontainers のススメ
sgash708
1
130
生成AIでGitHubソースコード取得して仕様書を作成
shukob
0
530
Fibonacci Function Gallery - Part 1
philipschwarz
PRO
0
230
競技プログラミングへのお誘い@阪大BOOSTセミナー
kotamanegi
0
360
技術的負債と向き合うカイゼン活動を1年続けて分かった "持続可能" なプロダクト開発
yuichiro_serita
0
150
開発者とQAの越境で自動テストが増える開発プロセスを実現する
92thunder
1
200
Featured
See All Featured
Practical Orchestrator
shlominoach
186
10k
Evolution of real-time – Irina Nazarova, EuRuKo, 2024
irinanazarova
6
450
Building Your Own Lightsaber
phodgson
103
6.1k
The Psychology of Web Performance [Beyond Tellerrand 2023]
tammyeverts
45
2.2k
"I'm Feeling Lucky" - Building Great Search Experiences for Today's Users (#IAC19)
danielanewman
226
22k
Exploring the Power of Turbo Streams & Action Cable | RailsConf2023
kevinliebholz
28
4.4k
Building an army of robots
kneath
302
44k
Measuring & Analyzing Core Web Vitals
bluesmoon
4
180
Performance Is Good for Brains [We Love Speed 2024]
tammyeverts
6
530
How GitHub (no longer) Works
holman
311
140k
Code Reviewing Like a Champion
maltzj
521
39k
Designing for Performance
lara
604
68k
Transcript
現実世界での コンテナの運び方 @wata727 Mar 13, 2018 JAWS-UG コンテナ支部#11
Question
本番でコンテナ使ってますか?
なぜ我々は(苦労して)コンテナを運ぶのか • コンテナを使うから、どうやってイメージをビルドするか、とか、 どうやってデプロイするのか、を考えなくてはいけなくなる • rsyncでソースコードばらまく、じゃダメ?
なぜ我々は(苦労して)コンテナを運ぶのか • コンテナを使うから、どうやってイメージをビルドするか、とか、 どうやってデプロイするのか、を考えなくてはいけなくなる • rsyncでソースコードばらまく、じゃダメ? ⇛コンテナで解決する課題がある
アジェンダ • デプロイに求められるもの • Dockerイメージをどう作るか • どうやってECSにコンテナを配置するか
デプロイに求められるもの
デプロイに求められるもの • 信頼性 • ロールバックの容易さ
信頼性 • 安全に新しいアプリケーションを配置できること ◦ その際に、サービスダウンなどを伴わないこと • デプロイしたら、ちゃんとすぐに新しいアプリケーションに切り 替わること
信頼性 • 安全に新しいアプリケーションを配置できること ◦ その際に、サービスダウンなどを伴わないこと • デプロイしたら、ちゃんとすぐに新しいアプリケーションに切り 替わること コンテナ以前: Graceful
Restart
信頼性 • 安全に新しいアプリケーションを配置できること ◦ その際に、サービスダウンなどを伴わないこと • デプロイしたら、ちゃんとすぐに新しいアプリケーションに切り 替わること コンテナ以前: Graceful
Restart コンテナ時代: Rolling Deployment
ロールバックの容易さ • 問題があったら、すぐに前のバージョンに戻せること ◦ 言語やOSのバージョンを上げるとか
ロールバックの容易さ • 問題があったら、すぐに前のバージョンに戻せること ◦ 言語やOSのバージョンを上げるとか コンテナ以前: Golden Image
ロールバックの容易さ • 問題があったら、すぐに前のバージョンに戻せること ◦ 言語やOSのバージョンを上げるとか コンテナ以前: Golden Image コンテナ時代: Rolling
Deployment
デプロイに求められるもの • 信頼性 • ロールバックの容易さ
現実世界でのデプロイに求められるもの • 信頼性 • ロールバックの容易さ • 早さ • 簡単さ •
管理の容易さ
早さ • デプロイが遅いとデプロイに抵抗感が生まれる ◦ デプロイに30分かかるとかだと「夜も遅いし、デプロイは明 日に...」とかなる
簡単さ • デプロイの手順は簡単であるべき ◦ 手順が増えると、デプロイできる人が限られてしまう ◦ プルリクエストをマージしたり、git pushしたらすぐデプロイ できるくらいの方が良い
管理の容易さ • 快適なデプロイを維持するためのコストが高いと大変 • デプロイサーバとか持ち始めると、その面倒を見る必要があ る...
Dockerイメージをどう作るか
Dockerイメージをどう作るか • Jenkinsでビルド • Travis CIとかCodeBuildでビルド
Jenkins GitHubのWebhookを受けてジョブを実行 • Pros ◦ サーバがあるので、大体なんでもできる • Cons ◦ サーバがあるので辛い
Jenkins GitHubのWebhookを受けてジョブを実行 • Pros ◦ サーバがあるので、大体なんでもできる • Cons ◦ サーバがあるので辛い
◦ 管理の容易さ☓
Travis CIやCodeBuild masterの更新をhookしてジョブを実行 • Pros ◦ サーバ不要 • Cons ◦
イメージのキャッシュが効かないのでビルドが遅い
Travis CIやCodeBuild masterの更新をhookしてジョブを実行 • Pros ◦ サーバ不要 • Cons ◦
イメージのキャッシュが効かないのでビルドが遅い ◦ 早さ☓
キャッシュが効かない? 実はいくつかやりようがある
docker save/load • saveでtarを吐けるので、それをキャッシュしてloadすれば良い • CodeBuildでもファイルキャッシュが使える ◦ https://aws.amazon.com/jp/blogs/devops/how-to-enable-caching-for-aws- codebuild/
docker build --cache-from • 都度pullして--cache-fromで指定すれば、Jenkinsでbuildする のと同じようにキャッシュを効かせられる • 大きいイメージだとpullに時間がかかるのが問題だが... $ docker
pull your-app:latest $ docker build -t ${TAG} --cache-from your-app:latest . $ docker tag your-app:${TAG} your-app:latest $ docker push your-app:${TAG} $ docker push your-app:latest
どうやってECSにコンテナを配置するか
どうやってECSにコンテナを配置するか • docker runとか直接できないのでAPI経由になる • APIを叩くツールは山ほどある • https://github.com/nathanpeck/awesome-ecs ◦ ここにあるだけで14種類
◦ ecs-deployという名前だけで4つある ◦ みんなが使う定番っぽいものは無い...
Amazon ECS CLI (おすすめ) • https://github.com/aws/amazon-ecs-cli • docker-compose likeにデプロイできる ◦
ローカルではdocker-composeで大体検証可能 • ecs-cli compose runでワンオフも可能 • スケールアウトもできる $ ecs-cli compose service up $ ecs-cli compose run oneoff bundle exec rake db:migrate $ ecs-cli compose service scale 2
Cronジョブの配置 • サーバーは無いので、従来のcronは使えない • Railsならresque-schedulerとかを使う手もある ◦ https://github.com/resque/resque-scheduler • ECSのScheduled Tasksが代わりに使える
◦ https://docs.aws.amazon.com/AmazonECS/latest/developerguide/schedu led_tasks.html
Amazon ECS CLI + Elastic Whenever • https://github.com/wata727/elastic_whenever ◦ Rubyで書かれたschedule.rbからScheduled
Tasksを生 成する • ecs-cliで最新のTask Definitionを作って、それを元に Scheduled Tasksを更新する $ ecs-cli compose create cronjob $ elastic_whenever -i myapp
より早いデプロイのために • ALBのderegistration delay ◦ https://docs.aws.amazon.com/ja_jp/elasticloadbalancing/latest/applicatio n/load-balancer-target-groups.html#deregistration-delay • ローリングデプロイ時に古いコンテナがALBから外れるのを待 つ時間
• デフォルト300秒だが、Herokuは50秒でタイムアウトするの で、短くて良い場合も多い ◦ https://devcenter.heroku.com/articles/request-timeout
大変じゃないですか? • ここまでにアプリケーション独自の事情はほとんどなし ◦ では、もっと汎用的な基盤を作れるのでは? • 例えば... ◦ git pushしたら雑にデプロイしてほしい
◦ EC2足りないからスケールアウトできないとか考えたくない
Herogate • https://github.com/wata727/herogate ◦ Heroku + AWS Fargate • Heroku
likeな操作でAWSのマネージドなサービスを操作でき るようになれば、裏側で何が起きているのか考えなくても済む のでは?という実験 • herogate createでCFn経由でCodePipeline, CodeBuild, CodeCommit, Fargate, ALBを全部作る
構成図
課題1: createが遅い • herogate createの裏側はCFnのcreate stackなので5分くら いかかる • heroku createは5秒くらいで終わるよ!
課題2: デプロイが遅い • git pushして変更検知して、CodeBuildが走って、ECSの更新 完了までにかかる時間が10分 • デプロイに10分はちょっと厳しいでしょ...
まとめ • コンテナのデプロイは複雑だが、複雑さを受け入れるだけの 価値がコンテナにはある • 現実的にはデプロイの早さやビルドサーバのメンテなど、考え るべき問題もあるが、各位工夫して頑張りましょう • 銀の弾丸は無いです