# プロジェクト概要
AWS環境にあるシステムをコンテナ化しGKEに移行するためのプロジェクトに設計から構築までメインの担当として、取り組みました。
コアとなるEC2上のアプリケーションとDBのサーバーがあり、コンテナを利用した運用への移行を進めました。
プロジェクト開始当初は、以下のような構成となっておりました。
- EC2上にコアとなるアプリケーションおよびDB(共有DB)がEC2上で稼働していた
- フロントエンドのアプリケーションと一部のAPIがECS上で稼働していた
- 比較的新しく構築された一部のAPIはGKE上で稼働していた
# 取り組んだ課題と改善に取り組んだ内容
## 1. EC2およびECSで稼働しているアプリケーションや古いGKE上にあるアプリケーションを新しいGKEへ移行
[課題]
- チームメンバーの学習コストが高い状況
当初のインフラ構成として、コアとなるアプリケーションはEC2上で動きつつも、一部のマイクロサービスはECSやGKEで稼働しており、構成として複雑な構成となっておりました。
また、既存で稼働しているGKEに関しても歴史的経緯により、組織としてメインで利用しているGCPのVPCとは別のVPCで稼働しておりました。
構成が複雑になっていることで運用するにあたりどの部分でどこと依存しているのかが分かりにくい状態でした。
[取り組んだ内容]
配属された組織では複数のプロダクトを運用していたのですが、全体の割合としてGCPのGKEを利用して運用してるシステムが多く存在している中で、このプロジェクトで改善したシステムに関してはAWS EC2をメインで利用している状況でした。
以下の点を考慮した結果、EC2およびECS(一部)、古いGKEを新しく構築したGKE(こちらのGKEは組織でメインで利用しているGCPのVPCを共有する形で構築)に移行しました。
- 学習コストを抑えるため
組織としてマイクロサービスを運用する方針かつ、組織全体としてGKEで運用する割合が多いことを考慮すると、組織内でのチーム移動があった場合などの学習コストを低減するためにも、GKEに移行することが妥当だと考え改善を進めました。
- 運用の簡単さ
マネージドサービスであるGKEを利用することで運用負荷をできるだけで削減できると考えました。
Upgradeなどの定期的な運用がほぼマネージドで完結するなどの利点があると考えました。また、すでに他のシステムでの運用実績もあり手順などが確立されていたのもGKEへの移行を決めた要因となっております。
- 別システムとの連携が簡単になる
今後の開発を考慮すると会社で運用している別システムとの連携が増えることが予想されたため、そこの連携を簡単にできるようにしていきたいと考えました。
そのため、移行先を既存のGKEではなく、メインで利用しているVPC内に新たに構築することによりネットワーク構成を統一化させるように進めました。
移行するにあたり全てのアプリケーションを一気に移行するのではなく、必要性に応じて移行対象を決定しました。
詳細は以下となります。
- EC2で稼働しているコアとなるアプリケーションをGKEに移行
比較的に新規機能開発において修正箇所が多いアプリケーションになることと、DBへのクエリが多いアプリケーションになるためレイテンシーを考慮し移行対象とした。
- ECSで稼働しているフロントエンドアプリケーションをGKEに移行
比較的に新規機能開発において修正箇所が多いアプリケーションになるため、移行対象とした。
- 別OrganizationにあるGKEの移行
こちらも同様に新規機能開発において修正箇所が多いアプリケーションになるため、移行対象とした。
- そのほかのECSで稼働しているアプリケーションは移行しないこととした
プロジェクト当初時点で、機能追加があまりないためこのプロジェクトでの移行では対象外とした。
このプロジェクトでは、GKEの構築や周辺MWの構築も合わせて取り組みました。
具体的には、GKE構築に伴うネットワーク周りの設定、Istio、各種IAM整備などを実施しました。
## 2. DBがシングルで稼働しており耐障害性が低い状態だった。
[課題]
DB (PostgreSQL) がEC2上で稼働しており、1台構成の状態でした。障害が発生した場合にフェイルオーバーできず、ダウンタイムが発生してしまう状況となっており、私がアサインされた際にその問題を発見したため、課題を共有し改善を進めました。
[取り組んだ内容]
GCP GKEへの移行を考慮すると、GCPのCloudSQLで運用するのが適切と判断し、移行を進めました。
冗長化構成にすることで、耐障害性を向上させることができました。
また、移行と合わせてQuery Insightsを有効化しクエリのパフォーマンス監視の強化も進めました。
## 3. 監視が不十分
[課題]
EC2, ECS, GKEと複数のインフラ基盤で稼働しつつも、トレースなどの監視が入っていない状態で、障害時にボトルネックになってる箇所の特定の時間がかかる状況でした。
[取り組んだ内容]
この課題に対応するために、監視強化としてDatadog APMの導入を進めました。
移行対象となるアプリケーションには基本的にAPMを導入する形で進めることにより、結果的に調査時間を短縮して運用することができました。
## 4. デプロイが複雑
[課題]
EC2やECS,GKEごとにデプロイ手順が異なることにより、運用コストが高くなっている状況でした。
GKEのデプロイについてはパイプラインが整備されておらず、手動によるコマンド実行でのデプロイとなっており、デプロイの安全性にも問題がある状態でした。
[取り組んだ内容]
別プロダクトですでにArgoCDを利用したデプロイを実施していたため、このプロジェクトでも同様にArgoCDによるデプロイの仕組みを導入しました。
# 全体を通して、移行に際して考慮した点
アプリケーションとDBの移行を踏まえてると大規模な作業となるが、移行後のトラブルが起きたときに問題箇所がわかりやすくなるように、段階的にできる限り慎重に段階的に移行することを考え取り組みました。
また、移行対象のDBが複数のアプリケーションから接続される状態となっており、移行前には同じDB Userを複数のアプリケーションで使い回す設定になっていたが、こちらも問題時の調査を簡単にするためアプリケーションごとにUserを作成し利用するようにすることでできる限り、トラブル時の調査を簡単にしました。
移行においては、移行によるトラブルが起きないように慎重に進めつつも、もしトラブルが起きた際も障害時間が短くなるに対策し進めました。
結果として、コアアプリケーション移行時に一部問題になったものの、問題箇所を特定し迅速に対応することができました。
チームとしてk8sのmanifest管理については開発者が担当する方針となっていたため、移行する際にk8s manifestの書き方や適切な設定方法などはSREとして知識を共有しながら一緒に行うように進めました。
具体的には、コンテナのCPU/Memoryのプロビジョニングや設定方法、Livenessprobe/Readinessprobe/Startupprobeの設定、Repricasの数の設定などをなぜ設定するのかや設定方法などを共有しながら移行しました。
また、今回のプロジェクトについては、私がアサインされてから最初に取り組んだものになるのですが、課題の発見から設計改善まで主導して進めることができました。