「集約」「自動化」「開発環境の最適化」による解決アプローチ
これらの課題を解決するためにマイナビが目指したのが、「数日間のリードタイムで環境を提供でき、開発時の手戻りが少なく、誰でも運用可能な集約基盤の開発」だった。具体的には、ALB(Application Load Balancer)やコンテナ、データベースなどをプラットフォーム化し、一元的に構築・管理できるとともに、複数のユーザーの要請に応じてクラウドリソースを素早く提供できる「マルチテナント型集約基盤」の実現を目指すことにした。
この仕組みを実現する上で重要なポイントになったのが、「集約」「自動化」「開発環境の最適化」の3つの取り組みだった。まず「集約」については、AWSアカウントとリソースの集約を実施。アカウント発行までのリードタイムを短縮し、サービスや環境ごとに作成される大量のAWSアカウント管理の負荷も軽減した。さらに、環境ごとに作成して複数サービス間で共有して利用する「共有リソース」と、サービスごとに個別に作成する「専有リソース」を切り分け、一部の共有可能なリソースを節約することにした。
「自動化」においては、コンテナ構成のパターン化とパラメータファイルの自動生成を実現した。コンテナ構成をパターン化することで、ヒアリングや構成検討にかかるリードタイムを短縮するとともに、プロジェクト独自の構成がなくなることで誰もが運用可能になり、「運用の属人化」という課題も解決できた。
さらには、インフラ構築のリードタイムを短縮するため集約基盤の新規サービス作成依頼をGoogleフォームから受け付け、CDKをデプロイする際に必要なプロジェクト独自の設定を記述したパラメータファイルを自動生成する仕組みも構築した。その実装を担当した同社 デジタルテクノロジー戦略本部 ビジネスイノベーション統括本部 クラウドインテグレーション統括部 クラウドエンジニアリング部 エンジニアリング1課 横尾風太氏は、具体的な仕組みと成果について次のように説明する。

「Googleフォームで入力したデータをGoogle Apps Scriptで連携してJSONに変換し、Amazon S3に保存します。その後AWS Lambdaが動作し、承認者の確認を経てCDKパラメータファイルを含むCDKコードが自動作成され、プルリクエストが投げられる仕組みを実装しました。これにより、後続のGithub ActionsとAWS CodePipelineによる自動デプロイを実現しました。さらに今まで手動で対応していたクロスアカウントでのACMのDNS検証についても、カスタムリソースを活用してCDKで対応できるようにし、自動化を実現したことでインフラのデプロイがCDKで完結するようになりました」
そして「開発環境の最適化」では、まずコンテナデプロイ方式のパターン化を実施した。これまでの内製開発ではプロジェクトごとにデプロイ方式を選定していたため、標準化されたデプロイ方式がなく、アプリチームでナレッジが蓄積されにくい状況だった。そこで、Amazon ECS用のデプロイツール「ecspresso」を使用したローリングデプロイと、AWS CodeDeployを使用したBlue/Greenデプロイの2パターンを用意。これによりプロジェクトごとの違いがなくなり、ナレッジの蓄積が進むとともにデプロイ時のトラブルも減少したという。
また、オブザーバビリティツールとしてNew Relicも新たに採用した。集約基盤ではAWSアカウントを集約している関係上、アプリチームのAWSコンソールへのアクセスを制限している。そのためコンソールに入れなくても開発に支障が出ないよう、コンテナログやCloudWatch Metricsなど、集約基盤で扱うAWSサービス関連のデータを収集でき、アプリログの収集・監視までも一元管理できる環境を整備した。