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
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築 / F...
Search
Sponsored
·
Your Podcast. Everywhere. Effortlessly.
Share. Educate. Inspire. Entertain. You do you. We'll handle the rest.
→
コドモン開発チーム
December 23, 2024
1.7k
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築 / From EC2 to ECS: Migrating to Containers and Rebuilding a Massive Legacy PHP Application
コドモン開発チーム
December 23, 2024
More Decks by コドモン開発チーム
See All by コドモン開発チーム
アラート疲れからの脱却 - リソースタグで仕分けるSlack通知戦略 / Breaking Free from Alert Fatigue – A Slack Notification Strategy Using Resource Tags for Routing
codmoninc
0
11
SREに優しいTerraform構成 modulesとstateの組み方 / terraform-modules-state-for-sre
codmoninc
0
180
モノリスなプロダクトの「ほどよい」リプレイス戦略 / A "Just Right" Replacement Strategy for Monolithic Products
codmoninc
0
78
Don't Just Patch — MOTTAINAI! Learn Security from Laravel CVE Diffs
codmoninc
0
200
ソースコードで比較する React / Vue / Svelte の セキュリティ設計思想 / security design philosophy react vue svelte
codmoninc
5
620
少人数SREチームが、長寿なシステムを構築・運用するための取り組み / Efforts by a Small SRE Team to Build and Operate Long-Lived Systems
codmoninc
0
190
フルリモートのその先へ〜パパね、いつも家にいるけどちゃんとこうして働いてるよ〜 / Beyond Full Remote
codmoninc
0
610
多様な働き方を支えるチーム開発カルチャーと 今後の展望 / Team Development Culture Supporting Diverse Workstyles and Future Outlook
codmoninc
0
520
ペアプロ未経験・未知のスキル領域・フルリモートからでも挑戦できる? 40代転職者の実態 / pair-programming-remote-career-change
codmoninc
0
530
Featured
See All Featured
Neural Spatial Audio Processing for Sound Field Analysis and Control
skoyamalab
0
330
The untapped power of vector embeddings
frankvandijk
2
1.8k
How to build a perfect <img>
jonoalderson
1
5.6k
Building Applications with DynamoDB
mza
96
7.1k
The Hidden Cost of Media on the Web [PixelPalooza 2025]
tammyeverts
2
330
Chasing Engaging Ingredients in Design
codingconduct
0
220
Paper Plane (Part 1)
katiecoart
PRO
0
8.8k
Agile Leadership in an Agile Organization
kimpetersen
PRO
0
160
The State of eCommerce SEO: How to Win in Today's Products SERPs - #SEOweek
aleyda
2
11k
Cheating the UX When There Is Nothing More to Optimize - PixelPioneers
stephaniewalter
287
14k
RailsConf 2023
tenderlove
30
1.5k
The Pragmatic Product Professional
lauravandoore
37
7.3k
Transcript
EC2からECSへ 念願のコンテナ移行と 巨大レガシーPHPアプリケーションの再構築 2024年12月22日 江口 純矢 PHP Conference Japan 2024
2 経歴 2021年、コドモンにエンジニアとして新卒で入社し請求関連のプロ ダクトを作成するチームに所属。その後、プッシュ通知の基盤を新し く作り直すプロジェクトを経て、SREにジョイン。 最近ハマっていること 早起きしてスーパー銭湯に行った後、ハッピーアワーで昼飲み。 自己紹介 江口 純矢
えぐち すみや X:@egusumi1219
3 Mission
4 すべての先生に 子どもと向き合う 時間と心のゆとりを こんなプロダクトを開発しています メインプロダクトは、保育・教育施設向けWebアプリケーション。 保護者と施設のやり取りを支えるモバイルアプリケーションや、施設職員向けモバイル版 アプリケーション、外部サービスと連携するAPIなども開発しています。
5
6 レガシーシステムの運用に頭を悩ませている方 手を上げてください
7 コドモンでは長年このような状態でした
8 少し長めの導入ですが、お付き合いください
9 1. 環境ごとに差異が生じやすくなっている 2. 本番リリースの時間が長く、リリース頻度を増やすのが困難
10 1. 環境ごとに差異が生じやすくなっている 2. 本番リリースの時間が長く、リリース頻度を増やすのが困難
11 CONFIDENTIAL - © 2022 CoDMON Inc. 11 ローカル環境と本番環境が異なる方法で構成管理される 環境ごとに差異が生じやすくなっている
ローカル環境 本番環境 コンテナ 仮想サーバー (EC2)
12 CONFIDENTIAL - © 2022 CoDMON Inc. 12 環境ごとに差異が生じやすくなっている ローカル環境と本番環境が異なる方法で構成管理される
Docker Ansible ローカル環境 本番環境 差分が生まれやすい状態
13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 ローカル環境と本番環境が異なる方法で構成管理される 環境ごとに差異が生じやすくなっている
Docker Ansible ローカル環境 本番環境 SRE team 機能開発 team 設定変更の度に依頼 変更 時間と共に構成が複雑化
14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 ローカル環境と本番環境が異なる方法で構成管理される 環境ごとに差異が生じやすくなっている
Docker Ansible ローカル環境 本番環境 管理責務が別れてしまい SREと機能開発チームの双方に作業のコストが発生
15 1. 環境ごとに差異が生じやすくなっている 2. 本番リリースの時間が長く、リリース頻度を増やすのが困難
16 CONFIDENTIAL - © 2022 CoDMON Inc. 16 メインのEC2は複数チームで開発 本番リリースの時間が長く、リリース頻度を増やすのが困難
team B team C team A team D 開発に携わる関係者が多い EC2のデプロイ時間が長い
17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 メインのEC2は複数チームで開発 開発に携わる関係者が多い
EC2のデプロイ時間が長い リリース頻度が増やしづらい team B team C team A team D 本番リリースの時間が長く、リリース頻度を増やすのが困難
18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 本番リリースまでの流れ 本番リリースの時間が長く、リリース頻度を増やすのが困難
ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境
19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 関係者が多い分、本番リリース頻度を増やす効果が大きい 本番リリースまでの流れ
ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境 本番リリースの時間が長く、リリース頻度を増やすのが困難
20 CONFIDENTIAL - © 2022 CoDMON Inc. 20 二つの課題を整理 コドモンにおけるレガシーシステムの課題
21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 二つの課題を整理 コドモンにおけるレガシーシステムの課題
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生
22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 二つの課題を整理 コドモンにおけるレガシーシステムの課題
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている
23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 二つの課題を整理 コドモンにおけるレガシーシステムの課題
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている コンテナ化すれば解決する!
24 とはいえ...
25 他の業務もある中 この状況に手をつけられず
26 数年の時が経過しました...
27 時が経ち
28 そこで一人の若手エンジニアが
29 CONFIDENTIAL - © 2022 CoDMON Inc. 29 「今期コンテナ化に取り組みたいです!」 若手SRE
30 ところが...
31 実際作業に取り掛かると
32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 メインのEC2は複数チームで開発 Apache
Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化
33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 メインのEC2は複数チームで開発 Apache
Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在
34 CONFIDENTIAL - © 2022 CoDMON Inc. 34 メインのEC2は複数チームで開発 Apache
Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在 複数チームからの協力が不可欠
35 今日伝えたいこと
36 巨大レガシーシステムのコンテナ移行は 総力戦
37 一人ではなくみんなの力で達成するもの
38 3 2 1 今日話すこと コンテナイメージの作成には横断的な協力が必要 安全に移行するための工夫 移行作業と多岐にわたる移行対象の監視
39 CONFIDENTIAL - © 2022 CoDMON Inc. 39 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている
40 CONFIDENTIAL - © 2022 CoDMON Inc. 40 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている →環境ごとの差異を減らす →本番リリース時間の短縮
41 CONFIDENTIAL - © 2022 CoDMON Inc. 41 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮
42 まずはインフラの全体構成図から
43 CONFIDENTIAL - © 2022 CoDMON Inc. 43 移行対象のEC2 EC2の時の構成
1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 Ansible CodeDeploy
44 CONFIDENTIAL - © 2022 CoDMON Inc. 44 移行対象のEC2 ECS移行後の構成
1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
45 CONFIDENTIAL - © 2022 CoDMON Inc. 45 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮
46 CONFIDENTIAL - © 2022 CoDMON Inc. 46 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決
47 CONFIDENTIAL - © 2022 CoDMON Inc. 47 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決 もう少し詳しく
48 CONFIDENTIAL - © 2022 CoDMON Inc. 48 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要
ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境
49 CONFIDENTIAL - © 2022 CoDMON Inc. 49 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要
ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 デプロイ ステージング環境 本番環境 ビルド
50 CONFIDENTIAL - © 2022 CoDMON Inc. 50 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要
ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境 ビルドの分だけ時間短縮
51 CONFIDENTIAL - © 2022 CoDMON Inc. 51 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決
52 CONFIDENTIAL - © 2022 CoDMON Inc. 52 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決 イメージの作成が最重要
53 CONFIDENTIAL - © 2022 CoDMON Inc. 53 まずは本番環境用のコンテナイメージの作成 1.コンテナイメージの作成には横断的な協力が必要
本番環境 Dockerfile ローカル環境
54 CONFIDENTIAL - © 2022 CoDMON Inc. 54 まずは本番環境用のコンテナイメージの作成 1.コンテナイメージの作成には横断的な協力が必要
本番環境 Dockerfile ローカル環境
55 CONFIDENTIAL - © 2022 CoDMON Inc. 55 まずは本番環境用のコンテナイメージの作成 1.コンテナイメージの作成には横断的な協力が必要
本番環境 Dockerfile ローカル環境 Amazon Linux ベースのOSの選定から
56 CONFIDENTIAL - © 2022 CoDMON Inc. 56 ベースイメージの選定 1.コンテナイメージの作成には横断的な協力が必要
debian:bookworm-slim ubuntu:noble amazonlinux:2023 イメージ全体の容量 1.8~2GBぐらい 1.8~2GBぐらい 2GB超 セキュリティアップデート頻度 多い 多い 少ない コミュニティ規模 開発コミュニティ大 開発コミュニティ大 AWSに閉じているため比較的 小 さい EOL 2026/6/10 2029/04/25 2025/6/30 その他 安定性重視傾向 DockerHubの公式イメージの多くは Debianベース スピード重視傾向 DebianベースのOS ・AWSと相性良し 安定性を重視して Debianを採用 採 用
57 ここからが大変な作業
58 CONFIDENTIAL - © 2022 CoDMON Inc. 58 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要
Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化
59 CONFIDENTIAL - © 2022 CoDMON Inc. 59 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要
Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在
60 CONFIDENTIAL - © 2022 CoDMON Inc. 60 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要
Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在 複数チームからの協力が不可欠
61 CONFIDENTIAL - © 2022 CoDMON Inc. 61 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
62 CONFIDENTIAL - © 2022 CoDMON Inc. 62 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
63 CONFIDENTIAL - © 2022 CoDMON Inc. 63 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
64 CONFIDENTIAL - © 2022 CoDMON Inc. 64 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
65 CONFIDENTIAL - © 2022 CoDMON Inc. 65 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す どこで使われているか そもそもわからない
66 CONFIDENTIAL - © 2022 CoDMON Inc. 66 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す どこで使われているか そもそもわからない アプリケーションエンジニアやQAに 都度相談して動作確認
67 CONFIDENTIAL - © 2022 CoDMON Inc. 67 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要
二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す アプリケーションエンジニアやQAに 都度相談して動作確認 地道な作業の積み重ねで コンテナイメージがなんとか形に 規模が大きく 依存ライブラリの数が膨大 どこで使われているか そもそもわからない
68 CONFIDENTIAL - © 2022 CoDMON Inc. 68 1.コンテナイメージの作成には横断的な協力が必要 元々は1人のタスクだったが、次第に協力してくれる人が増え、正式にPJに
69 CONFIDENTIAL - © 2022 CoDMON Inc. 69 次は出来上がったイメージを各環境で共通して使えるように 1.コンテナイメージの作成には横断的な協力が必要
とりあえず動作する イメージが完成
70 CONFIDENTIAL - © 2022 CoDMON Inc. 70 次は出来上がったイメージを各環境で共通して使えるように 1.コンテナイメージの作成には横断的な協力が必要
とりあえず動作する イメージが完成 次は他の環境で 動作するように変更
71 CONFIDENTIAL - © 2022 CoDMON Inc. 71 1.コンテナイメージの作成には横断的な協力が必要 •
ソースコードの環境依存をイメージから追い出す ◦ ビルド時に環境依存値を埋め込まない形に修正 • 追い出した環境依存値をコンテナ起動時に取得する ◦ 環境変数値はコンテナ(ECSタスク)起動時にSecrets Managerから取得可能 各環境でイメージを共通化する時にやること
72 CONFIDENTIAL - © 2022 CoDMON Inc. 72 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
環境変数 ファイル ?
73 CONFIDENTIAL - © 2022 CoDMON Inc. 73 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
シェルスクリプト SecretsManager github actions 環境変数 ファイル ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
74 CONFIDENTIAL - © 2022 CoDMON Inc. 74 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
シェルスクリプト SecretsManager github actions 環境変数 ファイル ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
75 CONFIDENTIAL - © 2022 CoDMON Inc. 75 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 シェルスクリプト SecretsManager github actions ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
76 CONFIDENTIAL - © 2022 CoDMON Inc. 76 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
開発環境にだけあるこの値はなんですか? ステージング環境にだけ この値が無いのはなぜでしょうか? 知ってそうな人にひたすら質問
77 CONFIDENTIAL - © 2022 CoDMON Inc. 77 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
78 CONFIDENTIAL - © 2022 CoDMON Inc. 78 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 シェルスクリプト SecretsManager github actions ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
79 CONFIDENTIAL - © 2022 CoDMON Inc. 79 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明
シェルスクリプト SecretsManager github actions 環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 環境変数をもとにファ イルを作成
80 CONFIDENTIAL - © 2022 CoDMON Inc. 80 1.コンテナイメージの作成には横断的な協力が必要 ECS移行後は環境変数の値を1箇所に
SecretsManager 環境変数 ファイル
81 CONFIDENTIAL - © 2022 CoDMON Inc. 81 1.コンテナイメージの作成には横断的な協力が必要 ステージング環境と本番環境で同じイメージが使えるように
ステージング環境 本番環境 同じイメージを 使用 環境依存の値は SecretsManagerから取得
82 CONFIDENTIAL - © 2022 CoDMON Inc. 82 ローカル環境と本番環境で同じイメージが使えるように 1.コンテナイメージの作成には横断的な協力が必要
本番環境 ローカル環境 ローカル用 Dockerfile ベースとなる Dockerfile 参照 不要な監視ツールの削除など 差分だけを記述 ローカル環境と本番環境の差分が最小限に 機能開発チームもサーバーの設定が変更できるように
83 CONFIDENTIAL - © 2022 CoDMON Inc. 83 イメージが各環境で共通して使えるように 1.コンテナイメージの作成には横断的な協力が必要
他の環境でも動作するように
84 CONFIDENTIAL - © 2022 CoDMON Inc. 84 まとめ 1.コンテナイメージの作成には横断的な協力が必要
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題
85 CONFIDENTIAL - © 2022 CoDMON Inc. 85 まとめ 1.コンテナイメージの作成には横断的な協力が必要
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題 🎉開発チームでApacheの設定が変更できるように🎉
86 CONFIDENTIAL - © 2022 CoDMON Inc. 86 まとめ 1.コンテナイメージの作成には横断的な協力が必要
複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
87 CONFIDENTIAL - © 2022 CoDMON Inc. 87 まとめ 1.コンテナイメージの作成には横断的な協力が必要
🎉本番リリースの時間が大幅短縮🎉 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
88 CONFIDENTIAL - © 2022 CoDMON Inc. 88 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮
89 CONFIDENTIAL - © 2022 CoDMON Inc. 89 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要
1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮
90 一区切りついたので 他のポイントも紹介させてください
91 CONFIDENTIAL - © 2022 CoDMON Inc. 91 開発環境以外の環境構築の苦労 開発環境
ステージング環境 開発環境を丸ごとコピー すればステージングはすぐ作れ るだろう 若手SREの鬼の頑張りでECS化
92 CONFIDENTIAL - © 2022 CoDMON Inc. 92 開発環境以外の環境構築の苦労 開発環境
ステージング環境 開発環境を丸ごとコピー すればステージングはすぐ作れ るだろう 開発環境とステージング環境で差分あり 若手SREの鬼の頑張りでECS化
93 CONFIDENTIAL - © 2022 CoDMON Inc. 93 移行対象のEC2 Apacheの処理を効率化するためPHPを変更
マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
94 CONFIDENTIAL - © 2022 CoDMON Inc. 94 移行対象のEC2 Apacheの処理を効率化するためPHPを変更
マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible workerを使用 apacheとPHPを分離 モジュール版 PHP FastCGI版PHP preforkを使用 CodeDeploy
95 CONFIDENTIAL - © 2022 CoDMON Inc. 95 Apacheの処理方式を見直し Apacheの処理方式
prefork worker event メモリ httpd プロセス httpd プロセス ・・・・・ スレッド1 スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト メモリ httpd プロセス ・・・・・ スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト スレッド2 スレッド3 httpリクエスト メモリ httpd プロセス ・・・・・ スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト スレッド2 スレッド3 httpリクエスト workerとほぼ同じ プロセス数不足をトリガーに ・新規プロセスを起動 ・既存プロセスを停止 処理効率 Apacheの処理を効率化するためPHPを変更 モジュール版PHPでは使用不可 モジュール版PHPでは使用不可
96 CONFIDENTIAL - © 2022 CoDMON Inc. 96 処理効率が最も良いevent方式では、502エラーとなるため、workerを採用 Apacheの処理を効率化するためPHPを変更
約0.5%の割合で 502エラー Apache MPM イベントモジュールは、ロードバランサーからの接続を早期に切断す る可能性があります。 接続が早期に切断されると、Application Load Balancer では HTTP 502 エラーが生成されます。抑制するためには、代わりに MPM ワーカーモ ジュールを使用するのがベストプラクティスです。 “ELB のバックエンドサーバーとして Apache または NGINX を使用するための最適な設定を教えてください。” https://repost.aws/ja/knowledge-center/apache-backend-elb
97 CONFIDENTIAL - © 2022 CoDMON Inc. 97 負荷試験の結果、Apacheの処理方式を変更 Apacheの処理方式
prefork worker event メモリ httpd プロセス httpd プロセス ・・・・・ スレッド1 スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト メモリ httpd プロセス ・・・・・ スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト スレッド2 スレッド3 httpリクエスト メモリ httpd プロセス ・・・・・ スレッド1 CPU コア コア コア コア httpリクエスト 命令 httpリクエスト スレッド2 スレッド3 httpリクエスト workerとほぼ同じ プロセス数不足をトリガーに ・新規プロセスを起動 ・既存プロセスを停止 採 用 Apacheの処理を効率化するためPHPを変更 モジュール版PHPでは使用不可 モジュール版PHPでは使用不可 処理効率 約0.5%の割合で502エラー
98 CONFIDENTIAL - © 2022 CoDMON Inc. 98 移行対象のEC2 ECS移行後の構成
1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
99 2 1 3 今日話すこと コンテナイメージの作成には横断的な協力が必要 安全に移行するための工夫 移行作業と多岐にわたる移行対象の監視
100 ここからが本番
101 ここまで総力を上げて作ったコンテナを 安全にリリースしたい
102 とはいえ、どこで問題が起きるかわからない
103 CONFIDENTIAL - © 2022 CoDMON Inc. 103 安全に移行するための工夫 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
104 CONFIDENTIAL - © 2022 CoDMON Inc. 104 安全に移行するための工夫 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
105 CONFIDENTIAL - © 2022 CoDMON Inc. 105 PRを大きくせず、ビッグバンリリースしないための工夫 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大
106 CONFIDENTIAL - © 2022 CoDMON Inc. 106 PRを大きくせず、ビッグバンリリースしないための工夫 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 巨大 Pull Request 非互換な変更のため 移行直前にマージ予定
107 CONFIDENTIAL - © 2022 CoDMON Inc. 107 なぜ非互換なPRになったのか? 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 モジュール版PHP FastCGI版PHP prefork worker
108 CONFIDENTIAL - © 2022 CoDMON Inc. 108 なぜ非互換なPRになったのか? 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 モジュール版PHP FastCGI版PHP prefork worker
109 CONFIDENTIAL - © 2022 CoDMON Inc. 109 なぜ非互換なPRになったのか? 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 変更をマージすると EC2で動作しなくなる モジュール版PHP FastCGI版PHP prefork worker
110 CONFIDENTIAL - © 2022 CoDMON Inc. 110 なぜ非互換なPRになったのか? 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 EC2とECSの両方で動く 書き方に変更し、PRをマージ モジュール版PHP FastCGI版PHP prefork worker preforkの時のみ 設定を読み込む書き方に変更
111 CONFIDENTIAL - © 2022 CoDMON Inc. 111 なぜ非互換なPRになったのか? 2.安全に移行するための工夫
移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 EC2とECSの両方で動く 書き方に変更し、PRをマージ モジュール版PHP FastCGI版PHP 巨大PRの解体をきっかけに 段階的な移行を意識するように
112 CONFIDENTIAL - © 2022 CoDMON Inc. 112 安全に移行するための工夫 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
113 CONFIDENTIAL - © 2022 CoDMON Inc. 113 移行前のEC2に影響を与えずにECSへリリースするための工夫 2.安全に移行するための工夫
移行前EC2 移行後ECS 両方を同じ状態に
114 CONFIDENTIAL - © 2022 CoDMON Inc. 114 移行前のEC2に影響を与えずにECSへリリースするための工夫 2.安全に移行するための工夫
移行前EC2 移行後ECS 両方を同じ状態に test slack slack call 既存ワークフロー
115 CONFIDENTIAL - © 2022 CoDMON Inc. 115 移行前のEC2に影響を与えずにECSへリリースするための工夫 2.安全に移行するための工夫
移行前EC2 移行後ECS 両方を同じ状態に test slack slack call 既存ワークフローに追加できない 合計20 1 つのワークフロー ファイルから最大 20 個の一意の再利用可能なワークフローを呼 び出すことができます。 “ワークフローの再利用 > 制限事項” https://docs.github.com/ja/actions/sharing-automations/reusing-workflows 既存ワークフロー
116 CONFIDENTIAL - © 2022 CoDMON Inc. 116 移行前のEC2に影響を与えずにECSへリリースするための工夫 2.安全に移行するための工夫
移行前EC2 移行後ECS 既存ワークフロー test slack slack call ECS用ワークフロー test slack call work flow run経由で実行 ECSへのデプロイ結果が既存ワークフローに影響しない
117 CONFIDENTIAL - © 2022 CoDMON Inc. 117 安全に移行するための工夫 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
118 CONFIDENTIAL - © 2022 CoDMON Inc. 118 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫
本番環境の作成はできたものの、実際に意図した動作をするか不安 特に、本番固有のインフラリソースなどはステージング環境で動作保証できない
119 CONFIDENTIAL - © 2022 CoDMON Inc. 119 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫
本番環境の作成はできたものの、実際に意図した動作をするか不安 特に、本番固有のインフラリソースなどはステージング環境で動作保証できない ユーザーに公開する前に動作確認したい
120 CONFIDENTIAL - © 2022 CoDMON Inc. 120 ルール1 target_group1に転送
移行対象のEC2 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫 移行対象のECS target_group1 ユーザー 開発者 443/ https
121 CONFIDENTIAL - © 2022 CoDMON Inc. 121 ルール1 target_group1に転送
移行対象のEC2 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫 移行対象のECS target_group1 ユーザー 開発者 443/ https xxxx/ https ルール2 target_group2に転送 target_group2 開発者以外はアクセスできない OIDCによる認証 ユーザーに公開する前に動作確認可能
122 CONFIDENTIAL - © 2022 CoDMON Inc. 122 安全に移行するための工夫 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
123 CONFIDENTIAL - © 2022 CoDMON Inc. 123 移行対象のEC2 当初考えていた移行の方法
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS
124 CONFIDENTIAL - © 2022 CoDMON Inc. 124 移行対象のEC2 当初考えていた移行の方法
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行
125 CONFIDENTIAL - © 2022 CoDMON Inc. 125 移行対象のEC2 当初考えていた移行の方法
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ
126 CONFIDENTIAL - © 2022 CoDMON Inc. 126 移行対象のEC2 当初考えていた移行の方法
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ 各マイクロサービスチームで ターゲットグループを作る手間が発生 既にターゲットグループが 3つ以上登録されている マイクロサービスが複数存在
127 CONFIDENTIAL - © 2022 CoDMON Inc. 127 移行対象のEC2 当初考えていた移行の方法
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ 各マイクロサービスチームで ターゲットグループを作る手間が発生 既にターゲットグループが 3つ以上登録されている マイクロサービスが複数存在 別の方法を検討
128 CONFIDENTIAL - © 2022 CoDMON Inc. 128 移行対象のEC2 リスナールールに着目し再検討
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS ルール1 target_group1:100% ルール2 target_group2:100% ルール3 target_group_3:100% target_group2 target_group3 target_group1
129 CONFIDENTIAL - © 2022 CoDMON Inc. 129 移行対象のEC2 リスナールールに着目し再検討
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS ルール1 target_group1:100% ルール2 target_group2:100% ルール3 target_group_3:100% target_group2 target_group3 target_group1
130 CONFIDENTIAL - © 2022 CoDMON Inc. 130 移行対象のEC2 リスナールールに着目し再検討
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS ルール1 target_group1:100% target_group4:0% ルール2 target_group2:100% ルール3 target_group_3:100% target_group2 target_group3 target_group1 target_group4 リスナールールによって ターゲットグループで加重設定
131 CONFIDENTIAL - © 2022 CoDMON Inc. 131 移行対象のEC2 リスナールールに着目し再検討
2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS ルール1 target_group1:100% target_group4:0% ルール2 target_group2:100% ルール3 target_group_3:100% target_group2 target_group3 target_group1 target_group4 リスナールールによって ターゲットグループで加重設定 各マイクロサービス用の ターゲットグループの新規作成が不要
132 CONFIDENTIAL - © 2022 CoDMON Inc. 132 まとめ 2.安全に移行するための工夫
1. PRを大きくせず、ビッグバンリリースしないための工夫 →EC2とECSの両方で動くようにソースコードを修正 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 →EC2へのデプロイが完了した後 ECSがデプロイされる仕組みを作成 3. ECS移行前に本番環境で動作確認するための工夫 →ALBに認証を設けて、開発者だけが ECSで動作確認できる仕組みを作成 4. 段階的に移行するための工夫 →ALBの加重設定を使用し、徐々にトラフィックを流せる仕組みを作成
133 ついでに
134 デプロイ方式について
135 CONFIDENTIAL - © 2022 CoDMON Inc. 135 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
フロントとバックエンドが同一のECSに
136 CONFIDENTIAL - © 2022 CoDMON Inc. 136 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに
137 CONFIDENTIAL - © 2022 CoDMON Inc. 137 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート ローリングアップデート中は 新旧のインスタンスが混在 フロントとバックエンドが同一のECSに
138 CONFIDENTIAL - © 2022 CoDMON Inc. 138 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 デプロイ期間中 フロントとバックエンドが で不一致が生じる
139 CONFIDENTIAL - © 2022 CoDMON Inc. 139 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する デプロイ期間中 フロントとバックエンドが で不一致が生じる
140 CONFIDENTIAL - © 2022 CoDMON Inc. 140 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する デプロイ期間中 フロントとバックエンドが で不一致が生じる
141 CONFIDENTIAL - © 2022 CoDMON Inc. 141 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する 採 用 デプロイ期間中 フロントとバックエンドが で不一致が生じる
142 CONFIDENTIAL - © 2022 CoDMON Inc. 142 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Blue Blue/Greenデプロイ
143 CONFIDENTIAL - © 2022 CoDMON Inc. 143 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Blue Green Blue/Greenデプロイ
144 CONFIDENTIAL - © 2022 CoDMON Inc. 144 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Blue Green Blue/Greenデプロイ トラフィックを一気に切り替える
145 CONFIDENTIAL - © 2022 CoDMON Inc. 145 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Blue Green Blue/Greenデプロイ トラフィックを一気に切り替える
146 CONFIDENTIAL - © 2022 CoDMON Inc. 146 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない
147 CONFIDENTIAL - © 2022 CoDMON Inc. 147 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない 段階移行期間中は Blue/Greenデプロイが使えない
148 CONFIDENTIAL - © 2022 CoDMON Inc. 148 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫
Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない Blue/Greenデプロイを使用する場合 対象のECSサービスに登録できる ターゲットグループは 1つまで デプロイ方式を ローリングアップデートから Blue/Greenに切り替える際 ECS Serviceを作り直す必要がある
149 制約の多いBlue/Greenデプロイは 基本的には採用しない方針に
150 フロントとバックエンドが分離されてない 今回のサービスではBlue/Greenデプロイを採用
151 CONFIDENTIAL - © 2022 CoDMON Inc. 151 最終的な移行計画 2.安全に移行するための工夫
152 CONFIDENTIAL - © 2022 CoDMON Inc. 152 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:100% target_group1
153 CONFIDENTIAL - © 2022 CoDMON Inc. 153 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 段階移行中はローリングアップデート
154 CONFIDENTIAL - © 2022 CoDMON Inc. 154 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:50% target_group4:50% target_group1 target_group4 段階移行中はローリングアップデート
155 CONFIDENTIAL - © 2022 CoDMON Inc. 155 最終的な移行計画 移行対象のEC2
2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:0% target_group4:100% target_group1 target_group4 段階移行中はローリングアップデート
156 CONFIDENTIAL - © 2022 CoDMON Inc. 156 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:0% target_group4:100% target_group1 target_group4 不要な加重設定を削除 段階移行中はローリングアップデート
157 CONFIDENTIAL - © 2022 CoDMON Inc. 157 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 不要な加重設定を削除 段階移行中はローリングアップデート
158 CONFIDENTIAL - © 2022 CoDMON Inc. 158 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 段階移行完了後 Blue/Greenデプロイに切り替え
159 CONFIDENTIAL - © 2022 CoDMON Inc. 159 移行対象のEC2 最終的な移行計画
2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 段階移行完了後 Blue/Greenデプロイに切り替え
160 3 2 1 今日話すこと コンテナイメージの作成には横断的な協力が必要 安全に移行するための工夫 移行作業と多岐にわたる移行対象の監視
161 いよいよ最後
162 CONFIDENTIAL - © 2022 CoDMON Inc. 162 移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視
移行完了後 Blue/Greenデプロイに切り替え EC2のトラフィックを徐々にECSへ
163 実はもう少し複雑
164 CONFIDENTIAL - © 2022 CoDMON Inc. 164 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4
165 CONFIDENTIAL - © 2022 CoDMON Inc. 165 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2
166 CONFIDENTIAL - © 2022 CoDMON Inc. 166 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2
167 CONFIDENTIAL - © 2022 CoDMON Inc. 167 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2 ×2 合計4種類のEC2インスタンスが ECSへの移行対象
168 CONFIDENTIAL - © 2022 CoDMON Inc. 168 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視
移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行
169 CONFIDENTIAL - © 2022 CoDMON Inc. 169 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視
移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行 移行完了後 Blue/Greenデプロイに切り 替え
170 CONFIDENTIAL - © 2022 CoDMON Inc. 170 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視
移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行 移行完了後 Blue/Greenデプロイに切り 替え フロントとバックエンドの不一致が 起きないサービスではローリングアップデートを採用
171 CONFIDENTIAL - © 2022 CoDMON Inc. 171 移行作業中の監視 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2 ×2
172 CONFIDENTIAL - © 2022 CoDMON Inc. 172 移行作業中の監視 4.移行作業と多岐にわたる移行対象の監視
移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2 ×2 EC2とECSの両方を監視
173 CONFIDENTIAL - © 2022 CoDMON Inc. 173 移行対象の監視ダッシュボードを確認 移行作業と多岐にわたる移行対象の監視
4.移行作業と多岐にわたる移行対象の監視
174 CONFIDENTIAL - © 2022 CoDMON Inc. 174 移行対象の監視ダッシュボードを確認 移行作業と多岐にわたる移行対象の監視
4.移行作業と多岐にわたる移行対象の監視 怪しいメトリクスがあれば、関係しそうなチームに確認
175 CONFIDENTIAL - © 2022 CoDMON Inc. 175 移行作業中注意したこと 4.移行作業と多岐にわたる移行対象の監視
• 移行作業のスケジュールを事前に開発部以外の他部署にも共有 • ECSへの加重は1%からスタートし、徐々に移行 • ログやALBのエラーをEC2と比較しながら常に監視 • 怪しい箇所は「EC2でも起きているか?」を観点に都度確認
176 CONFIDENTIAL - © 2022 CoDMON Inc. 176 移行作業中注意したこと 4.移行作業と多岐にわたる移行対象の監視
• 移行作業のスケジュールを事前に開発部以外の他部署にも共有 • ECSへの加重は1%からスタートし、徐々に移行 • ログやALBのエラーをEC2と比較しながら常に監視 • 怪しい箇所は「EC2でも起きているか?」を観点に都度確認 現在も移行作業中です
177 ですが
178 改めて今回の成果
179 CONFIDENTIAL - © 2022 CoDMON Inc. 179 まとめ コンテナ移行したことで得られた成果
ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題 🎉開発チームでApacheの設定が変更できるように🎉
180 CONFIDENTIAL - © 2022 CoDMON Inc. 180 まとめ コンテナ移行したことで得られた成果
🎉本番リリースの時間が大幅短縮🎉 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
181 最後に
182 移行作業を振り返って
183 CONFIDENTIAL - © 2022 CoDMON Inc. 183 AmazonLinuxで動いていたコンテナをDebianで再構築 二つのOSでphpinfo()を実行し
パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す アプリケーションエンジニアやQAに 都度相談して動作確認 地道な作業の積み重ねで コンテナイメージがなんとか形に 規模が大きく 依存ライブラリの数が膨大 どこで使われているか そもそもわからない
184 CONFIDENTIAL - © 2022 CoDMON Inc. 184 環境変数ファイルが存在するも、生成過程が不明 開発環境にだけあるこの値はなんですか?
ステージング環境にだけ この値が無いのはなぜでしょうか? 知ってそうな人にひたすら質問
185 CONFIDENTIAL - © 2022 CoDMON Inc. 185 元々は1人のタスクだったが、次第に協力してくれる人が増え、正式にPJに
186 多くの人に支えられていることを 実感するプロジェクトでした
187 皆さんも、大きな挑戦をしたとき周りの支えに 救われた経験があるのではないでしょうか?
188 今日伝えたいこと
189 巨大レガシーシステムのコンテナ移行は 総力戦
190 一人ではなくみんなの力で達成するもの
191 まだまだ多くの協力が必要です
192 コドモン採用ページ 開発ブログ コドモンでは一緒に働きたい仲間を募集しています!
193 ご清聴ありがとうございました!
None