Skip to content

XRayZen/feedays_cloud

Repository files navigation

FeedaysのバックエンドAPI

  • このプロジェクトは開発しているRSSリーダーサービスのサーバーレスなバックエンドAPI部分です
  • サーバーサイドの言語にGoを採用しており、SQLはGORMを使用しています。
  • 関数コードをドッカーコンテナにしてECRにプッシュしてLambdaで動かしています
  • インフラはAWSを採用しており、APIGW+Lambda+RDSProxy+RDS
    • IaCはTerraform+Terragruntを採用しており、開発・運用を見据えて開発環境・本番環境を切り替えることが出来ます

AWSクラウド構成

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はGithub Actionsで行っています
  • サービス全体のCI/CDは実装予定

開発環境構築

Dockerfileで開発コンテナを記述してVSCodeのRemote Containerで開発環境を構築しています。

バックエンド開発に際してのプログラミングノート

ER図

PlantUMLでER図を作成しております

ER図

About

RSSリーダーサービスのバックエンドAPI

Topics

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published