# 【概要】
現職の会社にとって一大プロジェクトである、新規CRM/SFAサービスのクラウドインフラチームのリーダーを担当し、商用リリースまで達成しました。
クラウドインフラ担当としてAWS,Terraformを利用した構築を担当しており、VPCの構築からプロダクトリリースまでの全範囲を構築することが可能です。クラウドチーム5名のリーダーを担当しており、要件からタスクの細分化・アサイン・チームの進捗管理をしています。2023年1月~現在まで、ラウドチームリーダーとして1年10ヶ月の経験があります。
# 【期間】
2023年1月
~
現在
# 【体制・役割】
## 体制
- インフラエンジニア: 5名
## 役割
- リーダー: (2023年1月~現在)
# 【プロダクトのフェーズ】
プロダクトのユーザー数の想定としては、最大5000ユーザーを想定しています。(20人 * 250テナント)
そのプロダクトの、0-1の開発フェーズにジョインしております。
# 【担当業務】
## 1. 開発環境の構築・運用
開発環境の構築・運用を担当しました。また、リーダーとしては、要件からタスクの細分化・アサイン・チームの進捗管理、複数のAWSアカウントとインフラリソースの管理担当しました。また、コスト試算、コスト削減の実施などビジネスに大きく関わる部分も担当しました。
### 使用技術とレベル感
#### AWS
クラウドインフラ担当としてAWSを利用したインフラ構築を担当しており、本プロダクトのVPCの構築からプロダクトリリースまでの全範囲を構築することが可能です。
本プロダクトのAWSの主なリソースとして、
- ECS(Fargate)
複数サービスをデプロイし、タスクのcpu,memoryの使用率に応じてスケールアウト・スケールインの設定をすることが可能です。また、開発環境に対しては、`Fargate`: `Fargate Spot`を `1:3` の割合で適用することによりコストを抑えた構成を採用しています。
- ELB(ALB)
デフォルトの`ラウンドロビンアルゴリズム`で運用した際に、特定タスクに負荷が集中してしまうという課題が発生したため、`最小未処理リクエスト (LOR) アルゴリズム`を採用することで、複数のタスクに負荷を分散できる対応をしました。
- Amazon Aurora Postgres
プロダクトの想定負荷(cpu使用率・メモリ使用率)・コネクションを考慮し、インスタンスタイプを選定することが可能です。また、PostgreSQLのパラメータ(RDS`クラスターパラメータグループ`・`インスタンスパラメータグループ`)を設定することが可能です。
保有資格
- 2022年2月: AWS Certified Cloud Practitioner
- 2022年6月: AWS Certified Solutions Architect – Associate
#### Terraform
上記、AWSと同様、本プロダクトのVPCの構築からプロダクトリリースまでの全範囲を構築することが可能です。`s3`にtfstateファイルを配置、`dynamoDB`にtflock情報を保持させることにより、マルチユーザーでTerraformを使用できる環境を構築可能。
また、[atlantis](https://www.runatlantis.io/)サーバーを使ったプルリク作成時のauto planなどをTerraform実行基盤として運用しています。
保有資格
- 2024年4月: HashiCorp Certified: Terraform Associate (003)
## 2. 本番環境(社内本番・商用本番)の構築・運用
開発環境同様、本プロダクトのVPCの構築からプロダクトリリースまでの全範囲を構築を担当しました。
また、開発環境同様にコスト試算、コスト削減の実施なども対応しました。使用技術とレベル感は開発環境の構築・運用で記載した内容と同様です。
開発環境と異なる点としては、
- アプリケーションで使うID,Passをセキュアな値に設定する
- ネットワークのセキュリティを本番用の設定にする
- IAMの権限管理を厳格にする
などの対応をしました。
## 3. 運用・監視の設計・構築
本番環境の運用の仕組みかとして、以下のトピックを構築しました。
### 死活監視・定常監視
#### 死活監視
そのイベントが発生したら、サービスが停止するリスクがあるものを監視し、サービス停止を防ぐ仕組みの構築しました。
例えば、
- ECSタスクのcpu,memory使用率
- RDSインスタンスのcpu,memory, connection数
- ALBのunhealthyHostCount
など、特定のメトリクスの使用率が80%を超えた場合にslack通知をする + 自動でスケーリングする仕組みを作成しました。
具体的には、
各メトリクスの監視は、`CloudWatch metrics`で対象のメトリクスの状態を監視し、設定した閾値を超えた場合 `CloudWatch alerm`を使用して、slackに通知をする仕組みを作成、AutoScalingポリシーの設定として、cpuの使用率 または memoryの使用率が70%を超えた場合にスケールアウトする設定をしました。
#### 定常監視
サービスのメトリクスを常に監視し、パフォーマンスの状態などを可視化する仕組みの構築しました。
監視ツールとしては、`NewRelic`を使用しています。
例えば、
- サービスのエラーレート
- 各APIのパフォーマンス
など、`NewRelic`上でカスタムダッシュボードを作成し、常に状態を可視化しておき、ミーティングで状態を振り返り、改善点などを検討するための仕組みを作成しました。
### メンテナンスモードの設計・構築
アプリケーションを計画停止する際に、全てのリクエストを遮断して、画面上で「メンテナンス中です。」とメンテナンス用の画面を出す仕組みを設計・構築しました。
具体的には、
フロントエンドのリソースにアクセスする際の`CloudFront`
バックエンド(API)にリクエストする際の`CloudFront`
それぞれの`CloudFront`に、全てのリクエストを拒否する`WAF`を設定する。
+
その`WAF`の制御でフロントエンドにリクエストがきた際には通常の画面ではなく、メンテナンスようの画面を表示する。
WAFを切り替える用のロジックを`lambda`で実装しておき、
メンテナンスinする時刻とメンテナンスoutする時刻を指定し、`lambda`を実行すると、指定した時間にメンテナンスモードに入る。
### リビジョン戻しの設計・構築
マイクロサービスにおける、各サービスのリリースバージョンがあります。そのバージョンセットの組み合わせをリビジョンと呼んでいます。
例えば、この時間帯では、Aサービスはv1.0.3, Bサービスはv1.0.4 としたときに、リビジョンはその組み合わせを保存したものになります。
何か不具合が発生した時に、特定サービスのバージョンだけを戻すのでは、整合性が取れなくなるので、そうではなく全てのサービスのバージョンを戻したいケースが想定されます。各サービスをその時間帯の状態(バージョン)に戻す仕組みを設計・構築しました。
リビジョン戻しには大きく2つのトピックがあり、具体的には
#### アプリケーションモジュールのリビジョンを一括して戻す仕組み
アプリケーションの不具合が発生し、即座の原因特定・解決が困難な際に実施する。
1. 各サービスがリリースされるタイミングでの、gitのコミットハッシュ・リリースした時間を`dynamoDB`に保存しておく。
2. リビジョン戻しを実行する際に、戻したい時間帯を指定すると、その時間の各サービスのバージョン(コミットハッシュが取得できる)
3. それぞれのコミットハッシュにチェックアウトしてpushすると、指定した時間帯でリリースされていたリビジョンを再現した状態に戻すことができる。
#### 特定時間のDBの状態に戻す仕組み
データが壊れて立ち行かなくなった際に、最終手段としてDBの戻しを実施する。
具体的には、
1. 全てのテナントのデータを特定の時間に戻す場合は,RDSの`Point In Time Recovery(PITR)`の機能を利用する。
2. 特定テナントだけのデータを戻す際は、`PITR`をして稼働中のインスタンスとは別のインスタンスを作成する。PITRしたインスタンスから特定のテナントのデータをdump, 稼働中のインスタンスにrestoreする。(PostgreSQLの`pgdump`, `pgrestore`の機能を利用する。)
# 【プロジェクト課題】
このプロダクトをビジネスとする上での大きな課題として、「インフラコストの肥大化」がありました。
本サービスは、一番ベーシックなライセンスで、月額3,500円/1ライセンスであるのに対し、社内本番運用(ユーザー220人)に対して、コストが2,000,000円/月かかっていました。
※ 一人当たり、2,000,000 円/ 220人 = 9090円/人となるので、商用のライセンスを社内にも適用すると、5,590円/人ほどコストがオーバーしている。
このような状態であったため、このままのコストではビジネスを成立させるには大きな課題となっていました。
## 工夫・対応
上記の課題に対して、
- RDSの`RI`の試算・購入
- Fargate,Lambdaの`Compute SavingsPlans`の試算・購入
- 勤務時間外の開発環境の自動停止(開発環境のみ)
を導入することで結果、
年間30%のコスト削減を達成できる試算となったので、購入をすることでコスト削減を計った。
## 成果
対応した結果、
2,000,000 * 0.7 = 1,400,000円/月のコストとなったため、削除額としては、
※一人当たり、 1,400,000円/220人 = 6363円/人となった。
コストオーバーを解消するまでには至っていないが、プロジェクトの課題であるコストの肥大化に対して、
大きくコスト削減に成功した結果となった。
結果、24,000,000円/年だった 想定コストを16,800,000円/年とし、7,200,000円/ = 30%のコスト削減を達成しました。
## 残課題
ビジネスを成立させるために、月額3,500円/1ライセンスを成立させるためには、さらに大きくコストを下げる必要があります。
この残課題に対しては、アプリケーション開発エンジニアと協力して、アプリケーションロジックのチューニングをし、
- Amazon Aurora PostgreSQLのインスタンスタイプを小さくする。
- 各サービスをデプロイしているFargate(ECS)のcpu,memoryスペックにかかるコストを小さくする。
上記の対応をする必要があると思い、現在検討しております。