スクラム開発が導入されており、フロントエンド、アプリエンジニアなど含め10人ほどのチーム構成でした。業務内容としては以下の3つのサービスの保守・運用を主軸に、そこから派生したマイクロサービスの開発におけるバックエンド・インフラ領域を主に担当。
1. インフルエンサー向けのスマホアプリ
2. 広告主向けのウェブアプリ
3. 社内スタッフ向けのウェブアプリ
### 担当した業務例
- 社内スタッフ向けのWebサービスをRuby on Rails→NestJS・Prismaにリプレイス
- SAMを使ったマイクロサービスの仕様策定・実装(関数にはGolangを使用)
- プッシュ通知一斉送信サービス
- ワードクラウドの自動生成サービス
- AWS各サービスのバージョンマイグレーションを担当
- Amazon Auroraのアップデート(メンテナンスを伴う)
- Amazon ElastiCacheのアップデート
- コスト削減
- datadogにて不要なメトリクスの取得を停止。年間約60万円ほど削減
- 開発用のDocumentDBをMongoDBイメージのECSコンテナに置き換え。年間約6万円ほど削減
## 特徴的なエピソード
### 1. 複数の役割を持ったモノレポを役割ごとの専用サービスにリプレイス
CTOに仕様やコードレビューの依頼はしておりましたが、仕様策定から実装まで基本的に私一人で進行したプロジェクトです。
「DBマイグレーション」・「cronスケジュールタスク」・「非同期処理用のワーカー」と、3つの役割が一つのRailsプロジェクトにまとまっているリポジトリが存在しました。Railsにはそれぞれ便利なプラグインも用意されているので、これらが一つのリポジトリにまとまっていること自体は大きな問題ではなかったのですが、以下2点については早急に解決すべき問題であると考え、できる部分からリプレイスを進めていきました。
1. Rubyのバージョンが既にサポート終了済みであること
1. 加えて型のないRubyが真価を発揮できる開発フェーズは終わっていた
2. 唯一ECSではなくAWS OpsWorksで管理されていたこと
1. 自動デプロイの仕組みがなく、デプロイ履歴をスクリーンショットで残す必要があった(監査対応)
2. DBマイグレーションやスケジュールタスクなど、役割的に常にサーバーが起動している必要がないのに常に稼働している
技術的負債の返済よりも新しい機能の追加が優先される雰囲気が強いフェーズであったため、以下の順にスプリントタスクの合間を縫ってリプレイスを進めており、3に関しては現在進行中。
1. 非同期処理用のワーカー
1. 最新のRubyバージョンにしたワーカー専用のサービスにリプレイス。既存の複数のRailsサービスから実行されるワーカー群のため、そのままRailsを使用。
2. DBマイグレーション
1. CodeBuild上でDBマイグレーションを実行する専用サービスにリプレイス。併せてこのタイミングでインフラ定義にAWS CDKを導入(それまではCloudFormationを利用していた)。VPC外のCodeBuildからVPC内のDBにアクセスするためにNATGatewayを利用しました。
3. cronスケジュールタスク
1. ECS Scheduled Task を利用した専用サービスにリプレイス。既存のタスクはまずRubyのDockerイメージを利用してECS Scheduled Taskに移行。徐々にGolangに書き換えていく予定。
こういったタスクはビジネスサイドから見ると目に見えて変わることがないためつい後回しにされがちかと思いますが放置するわけにもいかないため、スプリントの隙間にタスクを入れ込めるようになるべく細分化し、最小限のコストになるよう心がけて使用策定を行いました。
### 2. エンドユーザー間の紹介機能 仕様策定・バックエンド実装
PdM1名・アプリエンジニア1名・私という3名体制のプロジェクトでした。新規のユーザー獲得を推進したいという狙いのもと、ユーザー間の紹介機能を作成しました。私の役割としては仕様策定・バックエンド実装です。
機能としては、被紹介ユーザーがアカウント新規登録を行った上でプロフィールの初期設定を完了させると紹介が成立し紹介特典を送付する、というシンプルなものでしたが、不正な紹介が発生すると直接的に現金を失うリスクがあったため不正な紹介成立をどのように防ぐべきか入念に検討しました。
まずやったことは最大リスクの洗い出しとその対策の検討です。今回のケースの場合、一人のユーザーが異なる電話番号の携帯端末を複数所持している場合は、相互に紹介し合うことで不正に紹介特典を受け取れる可能性がありました。大量に携帯電話を持っている業者からの不正利用などは十分考えられたので、インフルエンサーとして審査通過できるSNSアカウントが存在しないと紹介特典が受け取れないようにするという仕様にすることで対策をしました。
一方で審査通過可能なSNSアカウントを大量に用意するというのはハックするのが困難、かつ既存の認証の仕組みを改変する必要があったため許容可能なリスクと判断しました。
技術的に特筆すべきことはありませんがリリース以降一度もバグを生んでいない、かつ、オペレーション上の大きな問題も発生していないため、リスク管理がうまくできた一例だったかと考えています。一バックエンドエンジニアではありますが、仕様策定・実装・テストケースの作成・ビジネスサイドとのオペレーションや仕様の擦り合わせなど全ての工程を通しで担当できた事例でもあるので、その点が私の特徴でもあるかと考えております。