子育てメディア「トモニテ」
## サービスの概要 「育児をもっと楽しくもっと幸せに」をコンセプトとしたファミリー向け動画メディア ## サービスのカテゴリ webサービス・スマホアプリ・ 業務システム・自社プロダクト ## 担当した役割 - 企画・要件定義・設計・コーディング・テスト・コードレビュー・運用保守・データ分析を担当 - 開発リーダ・フルスタックエンジニアとして担当 ## 使用技術や開発環境 - フロントエンド:React.js, Next.js, JavaScript, TypeScript, Node.js, Express - バックエンド:Golang, Echo, swaggo, govalidator, sqlboiler, go-cmp, gomock, golangci-lint, lefthook, pyroscope, aws-sdk-go-v2 - インフラ:AWS (Route53, EC2, ECS on Fargate, CodeBuild, CloudFront, S3, RDS Aurora, Lambda, CloudWatch, Cognito, Step Functions), Elasticsearch - ログ/分析:BigQuery, Metabase ## 取り組み ### インフラ系・その他 - 本番環境にて運用中の `Amazon Aurora` を `MySQL 5.7` から `8.0` へアップグレード - アップグレードの手法の検討 (ex. スナップショット復元、ブルー/グリーンデプロイ) - `MySQL 8.0` の変更点の影響確認 (ex. 暗黙的ソート、照合順序) - メンテナンスに伴う AWS リソースの設定変更を `Terraform` および `AWS CLI` でコード化 - メンテナンス手順の標準化やマニュアル化・開発環境での検証 - サービス名称変更に伴う Web メディアのドメイン移行 - `AWS Route53`, `Certificate Manager` を利用した新ドメインでのホスト(公開) - `AWS ALB` を利用した旧ドメインへのアクセスの `301` リダイレクト設定 - SEO 影響を最小にするため `Google Search Console` のガイドラインを準拠したサイト移転 - ローカルでの作業ブランチの動作検証のため Slack 上から開発環境用の `ECS Service` コンテナイメージを切り替える `AWS Lambda `関数の作成 - `Lambda` に対して必要な `AWS IAM Role`・`Policy` を作成 - `aws-sdk-go-v2` を利用して `Lambda` 上で直接 `ECS` を更新 - Web メディアの CI/CD 高速化 - `codebuild 4.0` を `7.0` へアップデート - イメージサイズ削減・マルチステージビルドで不要なファイルの除去 - 依存関係のない job の並列化 - DWH (`BigQuery`) や BI ツール (`Metabase`) などのデータ分析基盤の運用・活用 - データを基礎とした開発施策の PDCA サイクルの実施 - データ例としては、アプリインストール数・`PageSpeedInsights`・`Search Console` 等 - 運用監視の対応 - システムの異常時に開発メンバーがすぐに気づき対応できるよう `Slack` へ必要な情報の通知を実施 - 主な監視対象は、`AWS Health` イベントや `Datadog` によるアラート (ex. サーバー・データベースの CPU 使用率、メモリ使用率)、`Sentry` によるサーバーエラーなど - 都度通知の詳細を確認しながら、事象の重要度・緊急度によって対応を決定 ### バックエンド系 - `Pyroscope` の Continuous Profiling により Go サーバーのメモリリークを調査・改善 - Go サーバーから `Pyroscope` サーバーへ profiling data を送付 - profileing の結果をもとに、 Go サーバーのメモリリークの発生箇所を追求・改修対応 - API サーバーで Go のアップグレード - v1.5 `TestMain`関数はos.Exitを呼び出しが不要に - v1.6 `io/ioutil` パッケージから io と os パッケージの新しい定義の使用を推奨 - v1.7 ベンチマーク的には5%のパフォーマンス向上、2%のバイナリサイズの削減 - v1.8 ジェネリックが利用可能に - `AWS Lambda` 関数で `go1.x` から `provided.al2` ランタイムへ移行 - 実行可能ファイル名として bootstrap を使用 - `lambda.norpc` タグを使用して、`lambda` ライブラリの` Remote Procedure Call (RPC)` コンポーネントを除外 - Go で API サーバーを設計・実装 - フレームワークとして `echo` を利用 - オニオンアーキテクチャで開発 (presentation層・domain層・datasource層) - `go-cmp`, `gomock` を活用した Go のテストコードの作成 - ORM 生成ツール `SQLBoiler` の導入・実装 - データベースのスキーマからモデルのコードを自動生成 - eager loading を簡単に実行 - パフォーマンスが優れている - OpenAPI からコード生成ツール `oapi-codegen` の導入・実装 - Open API からのコード生成により、ソースとドキュメントの定義の乖離を解消 - 必要なものだけコード生成可 ### フロントエンド系 - Web メディアサービスの テクニカル SEO の改善 - URL の正規化 - 構造化データの追加・更新 - サイトの階層構造の最適化 - Web メディアサービスへの `Web Interstitial` 広告の実装 - インターステーシャル広告のスロット定義および表示 - App・UM・CP同線にはインターステーシャル広告の非表示