Upgrade to Pro — share decks privately, control downloads, hide ads and more …

EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築

すみや
December 23, 2024

EC2からECSへ 念願のコンテナ移行と巨大レガシーPHPアプリケーションの再構築

2024 PHP Conferenceの50分の枠で登壇した内容になります。

コンテナ化の機運はあったものの、巨大でレガシーなPHPアプリケーションであるため対応を先延ばしていました。リリースサイクルの高速化や環境間の差分解消などを目的としてコンテナ化とECSへの基盤移行に踏み切り、半年ほどかけて検証などを進めてきました。

本セッションでは、EC2からECSへの移行プロジェクトがどのように進行し、どのような成果を得たのかを話しています。

すみや

December 23, 2024
Tweet

More Decks by すみや

Other Decks in Programming

Transcript

  1. 5

  2. 13 CONFIDENTIAL - © 2022 CoDMON Inc. 13 ローカル環境と本番環境が異なる方法で構成管理される 環境ごとに差異が生じやすくなっている

    Docker Ansible ローカル環境 本番環境 SRE team 機能開発 team 設定変更の度に依頼 変更 時間と共に構成が複雑化
  3. 14 CONFIDENTIAL - © 2022 CoDMON Inc. 14 ローカル環境と本番環境が異なる方法で構成管理される 環境ごとに差異が生じやすくなっている

    Docker Ansible ローカル環境 本番環境 管理責務が別れてしまい SREと機能開発チームの双方に作業のコストが発生
  4. 17 CONFIDENTIAL - © 2022 CoDMON Inc. 17 メインのEC2は複数チームで開発 開発に携わる関係者が多い

    EC2のデプロイ時間が長い リリース頻度が増やしづらい team B team C team A team D 本番リリースの時間が長く、リリース頻度を増やすのが困難
  5. 18 CONFIDENTIAL - © 2022 CoDMON Inc. 18 本番リリースまでの流れ 本番リリースの時間が長く、リリース頻度を増やすのが困難

    ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境
  6. 19 CONFIDENTIAL - © 2022 CoDMON Inc. 19 関係者が多い分、本番リリース頻度を増やす効果が大きい 本番リリースまでの流れ

    ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境 本番リリースの時間が長く、リリース頻度を増やすのが困難
  7. 21 CONFIDENTIAL - © 2022 CoDMON Inc. 21 二つの課題を整理 コドモンにおけるレガシーシステムの課題

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生
  8. 22 CONFIDENTIAL - © 2022 CoDMON Inc. 22 二つの課題を整理 コドモンにおけるレガシーシステムの課題

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている
  9. 23 CONFIDENTIAL - © 2022 CoDMON Inc. 23 二つの課題を整理 コドモンにおけるレガシーシステムの課題

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている コンテナ化すれば解決する!
  10. 32 CONFIDENTIAL - © 2022 CoDMON Inc. 32 メインのEC2は複数チームで開発 Apache

    Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化
  11. 33 CONFIDENTIAL - © 2022 CoDMON Inc. 33 メインのEC2は複数チームで開発 Apache

    Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在
  12. 34 CONFIDENTIAL - © 2022 CoDMON Inc. 34 メインのEC2は複数チームで開発 Apache

    Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在 複数チームからの協力が不可欠
  13. 39 CONFIDENTIAL - © 2022 CoDMON Inc. 39 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている
  14. 40 CONFIDENTIAL - © 2022 CoDMON Inc. 40 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている →環境ごとの差異を減らす →本番リリース時間の短縮
  15. 43 CONFIDENTIAL - © 2022 CoDMON Inc. 43 移行対象のEC2 EC2の時の構成

    1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 Ansible CodeDeploy
  16. 44 CONFIDENTIAL - © 2022 CoDMON Inc. 44 移行対象のEC2 ECS移行後の構成

    1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
  17. 46 CONFIDENTIAL - © 2022 CoDMON Inc. 46 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決
  18. 47 CONFIDENTIAL - © 2022 CoDMON Inc. 47 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決 もう少し詳しく
  19. 48 CONFIDENTIAL - © 2022 CoDMON Inc. 48 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要

    ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境
  20. 49 CONFIDENTIAL - © 2022 CoDMON Inc. 49 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要

    ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 デプロイ ステージング環境 本番環境 ビルド
  21. 50 CONFIDENTIAL - © 2022 CoDMON Inc. 50 本番リリースまでの流れ 1.コンテナイメージの作成には横断的な協力が必要

    ビルド 動作確認 デプロイ 動作確認 リリースする人 それぞれで動作確認 同じ場所に集合して作業 ビルド デプロイ ステージング環境 本番環境 ビルドの分だけ時間短縮
  22. 51 CONFIDENTIAL - © 2022 CoDMON Inc. 51 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決
  23. 52 CONFIDENTIAL - © 2022 CoDMON Inc. 52 コンテナ化の目的 1.コンテナイメージの作成には横断的な協力が必要

    1. 環境ごとの差異を減らす 2. 本番リリース時間の短縮 ステージング環境と本番環境で 同一のイメージを使えれば解決 イメージの作成が最重要
  24. 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を採用 採 用
  25. 58 CONFIDENTIAL - © 2022 CoDMON Inc. 58 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要

    Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化
  26. 59 CONFIDENTIAL - © 2022 CoDMON Inc. 59 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要

    Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在
  27. 60 CONFIDENTIAL - © 2022 CoDMON Inc. 60 メインのEC2は複数チームで開発 1.コンテナイメージの作成には横断的な協力が必要

    Apache Source Code team B team C team A team D SRE team ソースコードを複数チームで開発 プロダクトの成長により ソースコードが複雑化 なぜ、誰が、いつ、入れたか わからないパッケージが複数存在 複数チームからの協力が不可欠
  28. 62 CONFIDENTIAL - © 2022 CoDMON Inc. 62 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
  29. 63 CONFIDENTIAL - © 2022 CoDMON Inc. 63 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
  30. 64 CONFIDENTIAL - © 2022 CoDMON Inc. 64 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す
  31. 65 CONFIDENTIAL - © 2022 CoDMON Inc. 65 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す どこで使われているか そもそもわからない
  32. 66 CONFIDENTIAL - © 2022 CoDMON Inc. 66 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    規模が大きく 依存ライブラリの数が膨大 二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す どこで使われているか そもそもわからない アプリケーションエンジニアやQAに 都度相談して動作確認
  33. 67 CONFIDENTIAL - © 2022 CoDMON Inc. 67 AmazonLinuxで動いていたコンテナをDebianで再構築 1.コンテナイメージの作成には横断的な協力が必要

    二つのOSでphpinfo()を実行し パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す アプリケーションエンジニアやQAに 都度相談して動作確認 地道な作業の積み重ねで コンテナイメージがなんとか形に 規模が大きく 依存ライブラリの数が膨大 どこで使われているか そもそもわからない
  34. 71 CONFIDENTIAL - © 2022 CoDMON Inc. 71 1.コンテナイメージの作成には横断的な協力が必要 •

    ソースコードの環境依存をイメージから追い出す ◦ ビルド時に環境依存値を埋め込まない形に修正 • 追い出した環境依存値をコンテナ起動時に取得する ◦ 環境変数値はコンテナ(ECSタスク)起動時にSecrets Managerから取得可能 各環境でイメージを共通化する時にやること
  35. 73 CONFIDENTIAL - © 2022 CoDMON Inc. 73 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    シェルスクリプト SecretsManager github actions 環境変数 ファイル ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
  36. 74 CONFIDENTIAL - © 2022 CoDMON Inc. 74 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    シェルスクリプト SecretsManager github actions 環境変数 ファイル ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
  37. 75 CONFIDENTIAL - © 2022 CoDMON Inc. 75 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 シェルスクリプト SecretsManager github actions ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
  38. 76 CONFIDENTIAL - © 2022 CoDMON Inc. 76 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    開発環境にだけあるこの値はなんですか? ステージング環境にだけ この値が無いのはなぜでしょうか? 知ってそうな人にひたすら質問
  39. 78 CONFIDENTIAL - © 2022 CoDMON Inc. 78 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 シェルスクリプト SecretsManager github actions ? 複数箇所で環境変数を定義 環境変数をもとにファ イルを作成
  40. 79 CONFIDENTIAL - © 2022 CoDMON Inc. 79 1.コンテナイメージの作成には横断的な協力が必要 環境変数ファイルが存在するも、生成過程が不明

    シェルスクリプト SecretsManager github actions 環境変数 ファイル 複雑なデプロイワークフローを 読み解きながら逆算 環境変数をもとにファ イルを作成
  41. 82 CONFIDENTIAL - © 2022 CoDMON Inc. 82 ローカル環境と本番環境で同じイメージが使えるように 1.コンテナイメージの作成には横断的な協力が必要

    本番環境 ローカル環境 ローカル用 Dockerfile ベースとなる Dockerfile 参照 不要な監視ツールの削除など 差分だけを記述 ローカル環境と本番環境の差分が最小限に 機能開発チームもサーバーの設定が変更できるように
  42. 84 CONFIDENTIAL - © 2022 CoDMON Inc. 84 まとめ 1.コンテナイメージの作成には横断的な協力が必要

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題
  43. 85 CONFIDENTIAL - © 2022 CoDMON Inc. 85 まとめ 1.コンテナイメージの作成には横断的な協力が必要

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題 🎉開発チームでApacheの設定が変更できるように🎉
  44. 86 CONFIDENTIAL - © 2022 CoDMON Inc. 86 まとめ 1.コンテナイメージの作成には横断的な協力が必要

    複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
  45. 87 CONFIDENTIAL - © 2022 CoDMON Inc. 87 まとめ 1.コンテナイメージの作成には横断的な協力が必要

    🎉本番リリースの時間が大幅短縮🎉 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
  46. 91 CONFIDENTIAL - © 2022 CoDMON Inc. 91 開発環境以外の環境構築の苦労 開発環境

    ステージング環境 開発環境を丸ごとコピー すればステージングはすぐ作れ るだろう 若手SREの鬼の頑張りでECS化
  47. 92 CONFIDENTIAL - © 2022 CoDMON Inc. 92 開発環境以外の環境構築の苦労 開発環境

    ステージング環境 開発環境を丸ごとコピー すればステージングはすぐ作れ るだろう 開発環境とステージング環境で差分あり 若手SREの鬼の頑張りでECS化
  48. 93 CONFIDENTIAL - © 2022 CoDMON Inc. 93 移行対象のEC2 Apacheの処理を効率化するためPHPを変更

    マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
  49. 94 CONFIDENTIAL - © 2022 CoDMON Inc. 94 移行対象のEC2 Apacheの処理を効率化するためPHPを変更

    マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible workerを使用 apacheとPHPを分離 モジュール版 PHP FastCGI版PHP preforkを使用 CodeDeploy
  50. 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では使用不可
  51. 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
  52. 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エラー
  53. 98 CONFIDENTIAL - © 2022 CoDMON Inc. 98 移行対象のEC2 ECS移行後の構成

    1.コンテナイメージの作成には横断的な協力が必要 マイクロサービス1 マイクロサービス2 移行対象のECS ecspresso docker Ansible CodeDeploy
  54. 103 CONFIDENTIAL - © 2022 CoDMON Inc. 103 安全に移行するための工夫 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
  55. 104 CONFIDENTIAL - © 2022 CoDMON Inc. 104 安全に移行するための工夫 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
  56. 106 CONFIDENTIAL - © 2022 CoDMON Inc. 106 PRを大きくせず、ビッグバンリリースしないための工夫 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 巨大 Pull Request 非互換な変更のため 移行直前にマージ予定
  57. 107 CONFIDENTIAL - © 2022 CoDMON Inc. 107 なぜ非互換なPRになったのか? 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 モジュール版PHP FastCGI版PHP prefork worker
  58. 108 CONFIDENTIAL - © 2022 CoDMON Inc. 108 なぜ非互換なPRになったのか? 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 モジュール版PHP FastCGI版PHP prefork worker
  59. 109 CONFIDENTIAL - © 2022 CoDMON Inc. 109 なぜ非互換なPRになったのか? 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 変更をマージすると EC2で動作しなくなる モジュール版PHP FastCGI版PHP prefork worker
  60. 110 CONFIDENTIAL - © 2022 CoDMON Inc. 110 なぜ非互換なPRになったのか? 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 EC2とECSの両方で動く 書き方に変更し、PRをマージ モジュール版PHP FastCGI版PHP prefork worker preforkの時のみ 設定を読み込む書き方に変更
  61. 111 CONFIDENTIAL - © 2022 CoDMON Inc. 111 なぜ非互換なPRになったのか? 2.安全に移行するための工夫

    移行前のEC2 移行後のECS 変更差分大 PHPの設定を .htaccessに記述 PHPの設定を user.iniに記述 EC2とECSの両方で動く 書き方に変更し、PRをマージ モジュール版PHP FastCGI版PHP 巨大PRの解体をきっかけに 段階的な移行を意識するように
  62. 112 CONFIDENTIAL - © 2022 CoDMON Inc. 112 安全に移行するための工夫 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
  63. 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 既存ワークフロー
  64. 116 CONFIDENTIAL - © 2022 CoDMON Inc. 116 移行前のEC2に影響を与えずにECSへリリースするための工夫 2.安全に移行するための工夫

    移行前EC2 移行後ECS 既存ワークフロー test slack slack call ECS用ワークフロー test slack call work flow run経由で実行 ECSへのデプロイ結果が既存ワークフローに影響しない
  65. 117 CONFIDENTIAL - © 2022 CoDMON Inc. 117 安全に移行するための工夫 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
  66. 118 CONFIDENTIAL - © 2022 CoDMON Inc. 118 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫

    本番環境の作成はできたものの、実際に意図した動作をするか不安 特に、本番固有のインフラリソースなどはステージング環境で動作保証できない
  67. 119 CONFIDENTIAL - © 2022 CoDMON Inc. 119 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫

    本番環境の作成はできたものの、実際に意図した動作をするか不安 特に、本番固有のインフラリソースなどはステージング環境で動作保証できない ユーザーに公開する前に動作確認したい
  68. 120 CONFIDENTIAL - © 2022 CoDMON Inc. 120 ルール1 target_group1に転送

    移行対象のEC2 ECS移行前に本番環境で動作確認するための工夫 2.安全に移行するための工夫 移行対象のECS target_group1 ユーザー 開発者 443/ https
  69. 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による認証 ユーザーに公開する前に動作確認可能
  70. 122 CONFIDENTIAL - © 2022 CoDMON Inc. 122 安全に移行するための工夫 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 3. ECS移行前に本番環境で動作確認するための工夫 4. 段階的に移行するための工夫
  71. 123 CONFIDENTIAL - © 2022 CoDMON Inc. 123 移行対象のEC2 当初考えていた移行の方法

    2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS
  72. 124 CONFIDENTIAL - © 2022 CoDMON Inc. 124 移行対象のEC2 当初考えていた移行の方法

    2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行
  73. 125 CONFIDENTIAL - © 2022 CoDMON Inc. 125 移行対象のEC2 当初考えていた移行の方法

    2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ
  74. 126 CONFIDENTIAL - © 2022 CoDMON Inc. 126 移行対象のEC2 当初考えていた移行の方法

    2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ 各マイクロサービスチームで ターゲットグループを作る手間が発生 既にターゲットグループが 3つ以上登録されている マイクロサービスが複数存在
  75. 127 CONFIDENTIAL - © 2022 CoDMON Inc. 127 移行対象のEC2 当初考えていた移行の方法

    2.安全に移行するための工夫 マイクロサービス1 マイクロサービス2 移行対象のECS Route53の加重ルーティング により段階移行 各マイクロサービスECSに 新しいALB用ターゲットグループが必要 ECS サービスに登録できる ターゲットグループの上限は5つ 各マイクロサービスチームで ターゲットグループを作る手間が発生 既にターゲットグループが 3つ以上登録されている マイクロサービスが複数存在 別の方法を検討
  76. 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
  77. 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
  78. 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 リスナールールによって ターゲットグループで加重設定
  79. 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 リスナールールによって ターゲットグループで加重設定 各マイクロサービス用の ターゲットグループの新規作成が不要
  80. 132 CONFIDENTIAL - © 2022 CoDMON Inc. 132 まとめ 2.安全に移行するための工夫

    1. PRを大きくせず、ビッグバンリリースしないための工夫 →EC2とECSの両方で動くようにソースコードを修正 2. 移行前のEC2に影響を与えずに ECSへリリースするための工夫 →EC2へのデプロイが完了した後 ECSがデプロイされる仕組みを作成 3. ECS移行前に本番環境で動作確認するための工夫 →ALBに認証を設けて、開発者だけが ECSで動作確認できる仕組みを作成 4. 段階的に移行するための工夫 →ALBの加重設定を使用し、徐々にトラフィックを流せる仕組みを作成
  81. 136 CONFIDENTIAL - © 2022 CoDMON Inc. 136 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに
  82. 137 CONFIDENTIAL - © 2022 CoDMON Inc. 137 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート ローリングアップデート中は 新旧のインスタンスが混在 フロントとバックエンドが同一のECSに
  83. 138 CONFIDENTIAL - © 2022 CoDMON Inc. 138 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 デプロイ期間中 フロントとバックエンドが で不一致が生じる
  84. 139 CONFIDENTIAL - © 2022 CoDMON Inc. 139 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する デプロイ期間中 フロントとバックエンドが で不一致が生じる
  85. 140 CONFIDENTIAL - © 2022 CoDMON Inc. 140 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する デプロイ期間中 フロントとバックエンドが で不一致が生じる
  86. 141 CONFIDENTIAL - © 2022 CoDMON Inc. 141 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    ローリングアップデート前 ローリングアップデート後 ローリングアップデート フロントとバックエンドが同一のECSに ローリングアップデート中は 新旧のインスタンスが混在 フロントのみS3などに分離 Blue/Greenデプロイに 変更する 採 用 デプロイ期間中 フロントとバックエンドが で不一致が生じる
  87. 146 CONFIDENTIAL - © 2022 CoDMON Inc. 146 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない
  88. 147 CONFIDENTIAL - © 2022 CoDMON Inc. 147 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない 段階移行期間中は Blue/Greenデプロイが使えない
  89. 148 CONFIDENTIAL - © 2022 CoDMON Inc. 148 ローリングアップデートとBlue/Greenの比較 2.安全に移行するための工夫

    Green Blue/Greenデプロイ ALBのリスナールールによる加重設定と Blue/Greenデプロイは併用できない Blue/Greenデプロイを使用する場合 対象のECSサービスに登録できる ターゲットグループは 1つまで デプロイ方式を ローリングアップデートから Blue/Greenに切り替える際 ECS Serviceを作り直す必要がある
  90. 152 CONFIDENTIAL - © 2022 CoDMON Inc. 152 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:100% target_group1
  91. 153 CONFIDENTIAL - © 2022 CoDMON Inc. 153 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 段階移行中はローリングアップデート
  92. 154 CONFIDENTIAL - © 2022 CoDMON Inc. 154 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:50% target_group4:50% target_group1 target_group4 段階移行中はローリングアップデート
  93. 155 CONFIDENTIAL - © 2022 CoDMON Inc. 155 最終的な移行計画 移行対象のEC2

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:0% target_group4:100% target_group1 target_group4 段階移行中はローリングアップデート
  94. 156 CONFIDENTIAL - © 2022 CoDMON Inc. 156 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group1:0% target_group4:100% target_group1 target_group4 不要な加重設定を削除 段階移行中はローリングアップデート
  95. 157 CONFIDENTIAL - © 2022 CoDMON Inc. 157 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 不要な加重設定を削除 段階移行中はローリングアップデート
  96. 158 CONFIDENTIAL - © 2022 CoDMON Inc. 158 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 段階移行完了後 Blue/Greenデプロイに切り替え
  97. 159 CONFIDENTIAL - © 2022 CoDMON Inc. 159 移行対象のEC2 最終的な移行計画

    2.安全に移行するための工夫 移行対象のECS ルール1 target_group4:100% target_group4 段階移行完了後 Blue/Greenデプロイに切り替え
  98. 162 CONFIDENTIAL - © 2022 CoDMON Inc. 162 移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視

    移行完了後 Blue/Greenデプロイに切り替え EC2のトラフィックを徐々にECSへ
  99. 164 CONFIDENTIAL - © 2022 CoDMON Inc. 164 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視

    移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4
  100. 165 CONFIDENTIAL - © 2022 CoDMON Inc. 165 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視

    移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2
  101. 166 CONFIDENTIAL - © 2022 CoDMON Inc. 166 多岐にわたる移行対象 4.移行作業と多岐にわたる移行対象の監視

    移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2
  102. 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への移行対象
  103. 168 CONFIDENTIAL - © 2022 CoDMON Inc. 168 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視

    移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行
  104. 169 CONFIDENTIAL - © 2022 CoDMON Inc. 169 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視

    移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行 移行完了後 Blue/Greenデプロイに切り 替え
  105. 170 CONFIDENTIAL - © 2022 CoDMON Inc. 170 本当の移行作業の流れ 4.移行作業と多岐にわたる移行対象の監視

    移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ EC2のトラフィックを徐々にECSへ 移行完了後 Blue/Greenデプロイに切り 替え EC2のトラフィックを徐々にECSへ 影響の範囲を抑えながら 順次実行 移行完了後 Blue/Greenデプロイに切り 替え フロントとバックエンドの不一致が 起きないサービスではローリングアップデートを採用
  106. 171 CONFIDENTIAL - © 2022 CoDMON Inc. 171 移行作業中の監視 4.移行作業と多岐にわたる移行対象の監視

    移行対象のEC2 移行対象のECS ルール1 target_group1:100% target_group4:0% target_group1 target_group4 ×2 ×2 ×2
  107. 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の両方を監視
  108. 174 CONFIDENTIAL - © 2022 CoDMON Inc. 174 移行対象の監視ダッシュボードを確認 移行作業と多岐にわたる移行対象の監視

    4.移行作業と多岐にわたる移行対象の監視 怪しいメトリクスがあれば、関係しそうなチームに確認
  109. 175 CONFIDENTIAL - © 2022 CoDMON Inc. 175 移行作業中注意したこと 4.移行作業と多岐にわたる移行対象の監視

    • 移行作業のスケジュールを事前に開発部以外の他部署にも共有 • ECSへの加重は1%からスタートし、徐々に移行 • ログやALBのエラーをEC2と比較しながら常に監視 • 怪しい箇所は「EC2でも起きているか?」を観点に都度確認
  110. 176 CONFIDENTIAL - © 2022 CoDMON Inc. 176 移行作業中注意したこと 4.移行作業と多岐にわたる移行対象の監視

    • 移行作業のスケジュールを事前に開発部以外の他部署にも共有 • ECSへの加重は1%からスタートし、徐々に移行 • ログやALBのエラーをEC2と比較しながら常に監視 • 怪しい箇所は「EC2でも起きているか?」を観点に都度確認 現在も移行作業中です
  111. 179 CONFIDENTIAL - © 2022 CoDMON Inc. 179 まとめ コンテナ移行したことで得られた成果

    ローカル環境と本番環境が異なる方法で構成管理される • 差分が生まれやすい • 管理責務が別れ、SREと機能開発チームの双方に作業のコストが発生 課題 🎉開発チームでApacheの設定が変更できるように🎉
  112. 180 CONFIDENTIAL - © 2022 CoDMON Inc. 180 まとめ コンテナ移行したことで得られた成果

    🎉本番リリースの時間が大幅短縮🎉 複数チームが関係するサービスがEC2で動いている • EC2のデプロイ時間が長く、リリース頻度を増やす障壁になっている 課題
  113. 183 CONFIDENTIAL - © 2022 CoDMON Inc. 183 AmazonLinuxで動いていたコンテナをDebianで再構築 二つのOSでphpinfo()を実行し

    パッケージの差分を地道に埋める Ansibleに書かれていたコマンドを 一つ一つDockerfileに移す アプリケーションエンジニアやQAに 都度相談して動作確認 地道な作業の積み重ねで コンテナイメージがなんとか形に 規模が大きく 依存ライブラリの数が膨大 どこで使われているか そもそもわからない
  114. 184 CONFIDENTIAL - © 2022 CoDMON Inc. 184 環境変数ファイルが存在するも、生成過程が不明 開発環境にだけあるこの値はなんですか?

    ステージング環境にだけ この値が無いのはなぜでしょうか? 知ってそうな人にひたすら質問