Skip to content

Latest commit

 

History

History
181 lines (173 loc) · 11.1 KB

File metadata and controls

181 lines (173 loc) · 11.1 KB

ローカルでAPIリクエスト受信からDB処理までを統合テストする

RDSの作成はまだにして、ローカルでAPIリクエスト受信からDB処理までを統合テストする環境を整える

  • 各Lambda関数にDBRepoを分けて実装する
    • 各Lambda関数で同様のテストコードを実装してテストする
  • Lambdaのテスト関数にAPIを送信してテストするコードを実装する

各関数をリファクタリングして不必要なコードを削除する

これにより、DRY・KISS原則を守る

  • DBRepoのテストコードを移植して実装する
  • DBモックを移植してモックテストを完了する
  • リファクタリングして不必要なコードを削除する
    • DBRepoでその関数では使わない関数を削除する
  • Site/FetchCloudArticleをテストが未実装なのでモックを使って実装する

検証できたら本番用のLambda関数を作る

  • 全てのLambda関数をDockerコンテナにビルドする
    • ビルドするためにシェアしているコードを各関数に配置しなければならない
    • これを機にDBを操作するコードを実装する
      • GoでRDSを操作するコードを調べる
      • だが、テストする為にリードしか実装しない
      • リードにテーブルを定義・実装するコードを入れる
        • DBにテーブルが存在しないのならテーブルを作成する条件にする
          • GORMのAutoMigrateを使う

コマンド

  • test
docker build -t <AWS AccountID>.dkr.ecr.us-east-1.amazonaws.com/feedays_cloud-repo:test ./lambda/test
  • site
docker build -t <AWS AccountID>.dkr.ecr.us-east-1.amazonaws.com/feedays_cloud-repo:site ./lambda/site
  • user
docker build -t <AWS AccountID>.dkr.ecr.us-east-1.amazonaws.com/feedays_cloud-repo:user ./lambda/user
  • batch
docker build -t <AWS AccountID>.dkr.ecr.us-east-1.amazonaws.com/feedays_cloud-repo:batch ./lambda/batch
  • read
docker build -t <AWS AccountID>.dkr.ecr.us-east-1.amazonaws.com/feedays_cloud-repo:read ./lambda/read

APIをテストするLambda関数を作る

  • 各Lambda関数をテストする機能を実装する
    • Siteをテストする
      • UserIDを指定する機能を追加
      • ExploreCategory用にサイトを登録・取得する機能を実装する
        • 今の仕様だとカテゴリーリストだけ取得出来てカテゴリー名だけで検索できないからExpolre機能が使えなくなっている
    • APIResponseはOpenAPIコードで作ってエントリポイントで返すからData.APIResponseは使わない
    • Site.DataとRepoを変更したから全ての関数に変更を適用する
    • コードを追加変更したのでテスト関数のテストコードを変更する
    • コードの名前付けが混乱しているからリファクタリングする
      • 変数はスネークケース(小文字始まり)にする
      • 関数はパスカルケース(大文字始まり)にする
        • プライベートな関数はキャメルケース(小文字始まり)にする
      • batch関数をリファクタリングする
      • read関数をリファクタリングする
      • site関数をリファクタリングする
      • test関数をリファクタリングする
      • user関数をリファクタリングする
    • Userをテストする
    • Readをテストする
    • おおかた実装できたらテストデータを削除する為の機能をReadに実装する
      • UUIDとサイトURLを指定して物理削除する
  • APIリクエスト制限の取得フローをリファクタリング
    • 正しい仕様では、APIリクエスト制限はアカウントタイプごとに設定されてテーブルに保存されている
    • だから、今のユーザー設定には含まずに、アカウントタイプごとにテーブルに保存されて関数でそれを取得して返す
    • API制限設定は他のテーブルからは独立してリレーションは持たない
    • ユーザー設定のAPI型とDB型からAPI制限情報を削除
      • それに依存するテストコードも削除改変
    • 良く考えたら、AutoMigrateもサービス初期化時にするから普通の関数から呼び出す必要は無い
      • 呼ぶのはテストコードからのみにしてそれ以外は削除する
    • 現在のテーブル定義を変更
    • userを変更
      • UpdateをModifyに変更したため、それを参照するコードを変更
    • siteを変更
    • readを変更
    • batchを変更
    • testを変更
  • DBのAutoMigrateはテスト関数かもしくはInit関数のサービス初期化メソッドで行う予定
    • Site関数でサービス初期化メソッドを実装する
    • Site関数でサービス終了メソッドを実装する
    • それらの統合テストを実装する
      • Siteのリクエストハンドラーの統合テストをリファクタリングする
        • APIリクエスト制限のテストコードを分離する
    • APIテストをする為にサービス初期化を呼び出す処理を実装する
  • 作業がTFに移る最後に各関数のエントリポイントをリファクタリングする
  • テストLambdaの環境変数にAPIのエンドポイントをセットする

APIGWにOpenAPIを適用する

  • APIGWにOpenAPIをインポートする方法を調べて、メモに入れる
  • TFでAPIGWにOpenAPIを適用する

インフラをデプロイする

  • GitHubとAWSのOIDCする
    • テンプレートファイルをコピー改変適用する
    • AWS-CLIでコマンド実行
aws cloudformation create-stack --stack-name feedays-cloud --template-body file://.oidc/aws_to_github_oidc.yaml --capabilities CAPABILITY_NAMED_IAM
  • スタックARNを確認する
    • aws cloudformation describe-stacks --stack-name feedays-cloud --query 'Stacks[0].Outputs[0].OutputValue' --output text
  • 失敗してロールバックするからデバッグする
  • ロールバックしたら、スタックを削除する
    • aws cloudformation delete-stack --stack-name feedays-cloud
    • AWSコンソールのスタックを見て原因を探る
    • 原因は指定されたARNのOIDCプロバイダーがすでにスタックに存在するため、新しいOIDCプロバイダーを作成できないから
    • 解決策としては既存スタックを消すか
    • OIDCProviderArnパラメーターに既存のOIDCプロバイダーのARNを指定
    • 指定するとAWSアカウントIDがばれるため、既存スタックを消すことで解決した
  • リポジトリのシークレットに作成したOIDCのIAMロールのARNをセット
  • ECRまでをデプロイする
  • Lambdaデプロイは手動ではなくCI/CDのGHAで行う
    • GHAでLambdaをテスト・ECRにプッシュする
    • その過程でエラーが出たのでそれを直す
      • Goがテストできるようにする
        • userのDBRepoで名前が原因でエラーが発生
        • lambda/user/RequestHandler/api_functions.go:5:2: package user/DBRepo is not in GOROOT (/opt/hostedtoolcache/go/1.20.7/x64/src/user/DBRepo)
      • Dockerビルドでエラーが発生
 > [builder 6/6] RUN GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build .:
0.364 go: downloading github.com/aws/aws-lambda-go v1.41.0
0.539 app.go:11:2: package user/DBRepo is not in GOROOT (/usr/local/go/src/user/DBRepo)
------
Dockerfile:16
--------------------
  14 |         && go get github.com/mmcdole/gofeed
  15 |     # ARM64向けにビルド
  16 | >>> RUN GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build .
  17 |     # ARMで動かすにはprovidedランタイムを使う
  18 |     FROM public.ecr.aws/lambda/provided:al2
--------------------
ERROR: failed to solve: process "/bin/sh -c GOOS=linux GOARCH=arm64 CGO_ENABLED=0 go build ." did not complete successfully: exit code: 1
  • インフラコードが未完成なので完成させる
    • Lambda・テスト関数
    • APIGW
  • インフラを全てデプロイする

各関数をテストする

  • テスト関数を起動してログを見る
  • APIのエンドポイントを叩いてAPIのレスポンスが想定どうりかテストする
    • APIエンドポイントにリクエスト到達を確認した

User関数のデバッグ

  • user関数のリクエストをパースする所でnull参照エラーが出た
    • パースする時にnullを空文字に変換する処理を追加した
  • MySQLでBLOBまたはTEXTカラムをキーとして使用するにはキーの長さを事前に指定する必要がある
    • テーブル作成時にキーの長さを指定する
  • userのログが途中で途切れる jsonエラーが出たから特定する為にログが増やして確認する
    • user関数は正常にサービス初期化リクエストを完了しているから問題はテスト関数のほう
  • サービス初期化・UserID生成取得・ユーザー登録には成功したが、ユーザー登録の際にUUIDの指定が間違っていたのかエラーになる
    • テスト関数のコードで生成したUUIDを指定するように修正する
  • ユーザーデータ更新でエラーだが、こちらもuser関数ではなくテスト関数のほうでエラーが出ている
    • テスト関数のコードを修正する
  • 検索履歴を編集する処理でエラー
    • userのほうのコードも問題だから修正する
  • TestApiUserPart1のデバッグが完了した

APIGWなどのクラウド構成を定義・構築する

  • 全てのLambdaを定義してAPIGWでエンドポイントを作成する
    • APIGWにOpenAPIを適用する

Site関数をデバッグ

  • TestApiSitePart3で失敗
  • 2023年8月20日全てのテストをパスした

初期実装完了

これにてバックエンドの開発は一応完了した