- このプロジェクトは開発しているRSSリーダーサービスのサーバーレスなバックエンドAPI部分です
- サーバーサイドの言語にGoを採用しており、SQLはGORMを使用しています。
- 関数コードをドッカーコンテナにしてECRにプッシュしてLambdaで動かしています
- インフラはAWSを採用しており、APIGW+Lambda+RDSProxy+RDS
- IaCはTerraform+Terragruntを採用しており、開発・運用を見据えて開発環境・本番環境を切り替えることが出来ます
APIGW->Lambda(Go)->RDSProxy->RDS(MySQL)
- DBパスワードはIaCでランダム生成してAWS SecretMangerに入れて管理しています
- ラムダ動作言語: Go (Ver.1.20.5)
- 実行速度などでもっとも効率がいい言語はRustだと思うが、Goが一番バックエンドとしてデファクトになりつつあるので、Goを採用
- Rustと似たような書き方・文法なので簡単に(一週間程度で)習得ができた
- IaC: Terraform+Terragrunt(IaCの保守・運用性を効率的にするツール)
- 素のテラフォームだとフォルダ分け・DRYがしづらいなど使い心地・保守・可読性が悪いのでTerragruntを採用
- これにより、素のテラフォームだと出来ない/しずらいフォルダ分けやDRYが出来るようになり、保守性・可読性が大きく向上
- API定義言語: OpenAPI
- AppSyncやGraphQLを使うという選択肢もあったが、密結合や学習コスト等を考えて、一番ハードルが低いであろうOpenAPIを採用
- API定義言語にそこまでのコストを払えないと判断
- データベースアクセス: GORM(ORM)
- データベースアクセスにはもっともメジャーなGORMを採用
- データベース: MySQL(Ver.8.0.31)
- ポートフォリオとしてメジャーなSQLエンジンであるMySQLを採用
- ユーザー登録・ログイン
- QRコードで設定を同期
- マルチプラットフォームで同じサービス体験をするためにQRコードで設定を同期する
- QRコードを読み込んだら、そのコードに紐づく設定を読み込んで返信
- アクティビティ(ユーザー行動履歴)の登録
- 後々サービスを改善する為に履歴を蓄積する
- サイト登録・編集・削除
- サイトのフィード取得/更新(バッチ処理)
- フィードの更新はバッチ処理で行う
- サイトのランキング集計(実装予定)
- 国ごとのランキングを取得する
- サイトのトレンド集計(実装予定)
- 記事・サイトのトレンドを取得する
- コンテンツ検索
- 記事タイトル・サイト名で検索する
- 後々マネタイズする為にアカウントタイプによって動作を変える
- Explore Categoryの取得
- サイトのカテゴリごとリストを取得する
- APIの機能を大きく四つ程度のLambda関数に分けて、リクエストタイプに応じてより細かく処理を分けることで、Lambda関数のコードをシンプルに保つことが出来た
- これにより、Lambda関数のコードがシンプルになり、可読性が向上した
- また、DIを導入することで、テストコードの実装がしやすくなった
- DBへの変更にはトランザクションを使うことで、データの整合性を極力保つことを意識した
- 途中でエラーが出てもロールバックしてデータの整合性を保ちつつ、エラーを返すことが出来る
- データベースの設計
- データベースの設計は初めてだったので、どのように設計すれば良いのか悩んだ
- データ型・正規化・アンチパターンなどの知識が必要だったので、それらの知識を学習する必要があった
- ググりまくりながら、情報をマークダウンでプログラミングノートに書き溜める事で、データベースの設計とその知見を得ることが出来た
- データベースの設計は初めてだったので、どのように設計すれば良いのか悩んだ
- Lambdaを使ったAPIのテスト・デバッグ
- Lambdaを使ったAPIのテスト・デバッグは初めてだったので、どのようにテスト・デバッグすれば良いのか悩んだ
- RDSも使っているのでローカルでは十分テストは出来ない
- そこで、ローカルでSQL(DB操作)関連のテストする際はRDSからSQLiteに切り替えてテストすることで、RDSのコストを抑えつつテストを行うことが出来た
- APIGW+Lambda+RDSの統合テストは実際にインフラをデプロイして
- テスト専用のクライアントアプリを作って、そこからAPIを叩くことでテスト・デバッグを行うことが出来た
- ラムダ関数のCI/CDはGithub Actionsで行っています
- サービス全体のCI/CDは実装予定
Dockerfileで開発コンテナを記述してVSCodeのRemote Containerで開発環境を構築しています。
PlantUMLでER図を作成しております
