Retty Tech Blog

実名口コミグルメサービスRettyのエンジニアによるTech Blogです。プロダクト開発にまつわるナレッジをアウトプットして、世の中がHappyになっていくようなコンテンツを発信します。

アプリチームにおけるECS移行の作業範囲

アプリチームの松田です。
アプリチームではバックエンド専門の人やチームはおらず、Android/iOSを開発しながらバックエンドサーバーも開発、運用しています。そんなAndroid/iOSアプリ専用のAPIサーバーはAWS Elastic Beanstalk(以下EB)で運用されていました。古くはEBが社内で主に使用されていましたが、Amazon Elastic Container Service(以下ECS)を使用するという流れになっています。社内の他プロダクトと技術、知識を揃えるために、ECSへの移行を行いました。
移行作業はインフラチームと協力して行いますが、この記事ではRettyのアプリチームがどこまでの領域をカバーしているかの紹介をしていきます。

前準備

移行前の前準備として、以下を行いました。
尚、EBではJavaではなくDocker Platformを使用していました。

環境変数の整理

使用されていない環境変数の整理が行えていなかった為、使用状況の整理、削除を行いました。
この環境変数を元にインフラチームがタスク定義を作成しました。

AWSの権限の確認

EB環境の時はワイルドカードで権限が多めに付与されていました。今回のECS環境への移行時に、インフラチームからの要請で最小限の権限に絞る事になりました。その為に必要な権限を調査しました。

ログの整備

EB環境ではファイルに出力してそれをDatadogに送っていましたが、ECSではログドライバーを使用してコンテナの出力を送るので、ログをコンテナの標準出力に出すように改修しました。

アプリケーションの変更

アプリケーションはJVM環境なので、Amazon Correttoを使用するのがAWSサービスに最適化されていて良いと判断し、Temurinから変更しました。
メモリの設定も見直し、XmsXmxで設定していたものをMaxRAMPercentageInitialRAMPercentageでメモリの設定を行うようにしました。両方とも75で設定しました。

Docker Registory

今まではDocker Hubを使用していましたが、これも社内の方針に合わせてElastic Container Registry(以下ECR)にpushするように変更しました。
リポジトリはインフラチームが作成し、pushするCIはアプリチームが作成しました。CIの足りない権限についてはエラーログとそこから推定される権限をインフラチームに伝え、権限を追加してもらいました。

Graviton(ARM64)対応

Gravitonの方が料金が安いのと、個人的に使用したいと気になっていた為、Gravitonへの対応も行いました。最初はAMD64で移行し、ECSでのパフォーマンスを確認した後にARM64での移行を行う方針とした為、マルチアーキテクチャでビルドを行い、同一のImage IDで参照するためにECRへmanifestのpushを行うようにしました。
メインのコンテナだけでなく、社内で管理している同時に動かすsidecarのコンテナもARM64に対応していなかったので対応させました。
manifestの使用は社内でも初めてだった為、インフラチームに適切なライフサイクルポリシーを設定してもらうように依頼を行いました。

準備

リソース・インフラの準備

インフラチームがTerraformを作成し、アプリチームでは運用しているJVMのアプリケーションの特性に合わせたスケーリングポリシーの調整を行ったりしました。
RettyのTerraformに関しては以下のインフラチームが書いた記事を御覧ください。
https://engineer.retty.me/entry/2022/11/18/130000

CI

CIについてはアプリチームの運用に合わせてカスタマイズするため、インフラチームには最低限の状態の下書きで作成してもらい、最終的にアプリチームがカスタマイズしました。
Canary Deployを実現するためにecspressoというツールをインフラチームがが選定し、採用されています。

検証

QAチームが居るので、接続先をECSにしたアプリを作成し、それでQAチームに動作検証を依頼しました。

移行作業

環境の移行作業はインフラチームがRoute53のWeighted routingを使用して行いました。アプリチームではDatadogでエラーが無いかを確認し、数日かけて徐々にECSにアクセスを流していきました。
移行にあたってはめったに使用されない機能の権限漏れ等があり、一旦元の環境に戻したりしましたが、大きな障害はなく移行を終えることができました。
足りない権限はTerraformに記述し、インフラチームにレビューを貰って再度移行を進めました。

まとめとおわりに

以上がアプリチームが行ったECSへの移行作業となります。作業範囲としてはアプリケーション側はアプリチーム、AWS側はインフラチーム、Terraformは場合によって両方のチームが見るという当たり前の分割となっていると思います。
アプリチームではモバイルアプリ、アプリバックエンド、バックエンドマイクロサービス、インフラ等、様々な開発をやろうと思えばできる環境です。更に今回のTerraform化によって、インフラ側に更に関わっていきやすくなったと思います。