- ローカルでAPIリクエスト受信からDB処理までを統合テストする
- APIをテストするLambda関数を作る
- APIGWにOpenAPIを適用する
- インフラをデプロイする
- 各関数をテストする
- APIGWなどのクラウド構成を定義・構築する
RDSの作成はまだにして、ローカルでAPIリクエスト受信からDB処理までを統合テストする環境を整える
- 各Lambda関数にDBRepoを分けて実装する
- 各Lambda関数で同様のテストコードを実装してテストする
- Lambdaのテスト関数にAPIを送信してテストするコードを実装する
これにより、DRY・KISS原則を守る
- DBRepoのテストコードを移植して実装する
- DBモックを移植してモックテストを完了する
- リファクタリングして不必要なコードを削除する
- DBRepoでその関数では使わない関数を削除する
- Site/FetchCloudArticleをテストが未実装なのでモックを使って実装する
- 全てのLambda関数をDockerコンテナにビルドする
- ビルドするためにシェアしているコードを各関数に配置しなければならない
- これを機にDBを操作するコードを実装する
- GoでRDSを操作するコードを調べる
- だが、テストする為にリードしか実装しない
- リードにテーブルを定義・実装するコードを入れる
- DBにテーブルが存在しないのならテーブルを作成する条件にする
- GORMのAutoMigrateを使う
- DBにテーブルが存在しないのならテーブルを作成する条件にする
- 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- 各Lambda関数をテストする機能を実装する
- Siteをテストする
- UserIDを指定する機能を追加
- ExploreCategory用にサイトを登録・取得する機能を実装する
- 今の仕様だとカテゴリーリストだけ取得出来てカテゴリー名だけで検索できないからExpolre機能が使えなくなっている
- APIResponseはOpenAPIコードで作ってエントリポイントで返すからData.APIResponseは使わない
- Site.DataとRepoを変更したから全ての関数に変更を適用する
- コードを追加変更したのでテスト関数のテストコードを変更する
- コードの名前付けが混乱しているからリファクタリングする
- 変数はスネークケース(小文字始まり)にする
- 関数はパスカルケース(大文字始まり)にする
- プライベートな関数はキャメルケース(小文字始まり)にする
- batch関数をリファクタリングする
- read関数をリファクタリングする
- site関数をリファクタリングする
- test関数をリファクタリングする
- user関数をリファクタリングする
- Userをテストする
- Readをテストする
- おおかた実装できたらテストデータを削除する為の機能をReadに実装する
- UUIDとサイトURLを指定して物理削除する
- Siteをテストする
- APIリクエスト制限の取得フローをリファクタリング
- 正しい仕様では、APIリクエスト制限はアカウントタイプごとに設定されてテーブルに保存されている
- だから、今のユーザー設定には含まずに、アカウントタイプごとにテーブルに保存されて関数でそれを取得して返す
- API制限設定は他のテーブルからは独立してリレーションは持たない
- ユーザー設定のAPI型とDB型からAPI制限情報を削除
- それに依存するテストコードも削除改変
- 良く考えたら、AutoMigrateもサービス初期化時にするから普通の関数から呼び出す必要は無い
- 呼ぶのはテストコードからのみにしてそれ以外は削除する
- 現在のテーブル定義を変更
- userを変更
- UpdateをModifyに変更したため、それを参照するコードを変更
- siteを変更
- readを変更
- batchを変更
- testを変更
- DBのAutoMigrateはテスト関数かもしくはInit関数のサービス初期化メソッドで行う予定
- Site関数でサービス初期化メソッドを実装する
- Site関数でサービス終了メソッドを実装する
- それらの統合テストを実装する
- Siteのリクエストハンドラーの統合テストをリファクタリングする
- APIリクエスト制限のテストコードを分離する
- Siteのリクエストハンドラーの統合テストをリファクタリングする
- APIテストをする為にサービス初期化を呼び出す処理を実装する
- 作業がTFに移る最後に各関数のエントリポイントをリファクタリングする
- テストLambdaの環境変数にAPIのエンドポイントをセットする
- 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ビルドでエラーが発生
- Goがテストできるようにする
> [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関数のリクエストをパースする所でnull参照エラーが出た
- パースする時にnullを空文字に変換する処理を追加した
- MySQLでBLOBまたはTEXTカラムをキーとして使用するにはキーの長さを事前に指定する必要がある
- テーブル作成時にキーの長さを指定する
- userのログが途中で途切れる jsonエラーが出たから特定する為にログが増やして確認する
- user関数は正常にサービス初期化リクエストを完了しているから問題はテスト関数のほう
- サービス初期化・UserID生成取得・ユーザー登録には成功したが、ユーザー登録の際にUUIDの指定が間違っていたのかエラーになる
- テスト関数のコードで生成したUUIDを指定するように修正する
- ユーザーデータ更新でエラーだが、こちらもuser関数ではなくテスト関数のほうでエラーが出ている
- テスト関数のコードを修正する
- 検索履歴を編集する処理でエラー
- userのほうのコードも問題だから修正する
- TestApiUserPart1のデバッグが完了した
- 全てのLambdaを定義してAPIGWでエンドポイントを作成する
- APIGWにOpenAPIを適用する
- TestApiSitePart3で失敗
- 2023年8月20日全てのテストをパスした
これにてバックエンドの開発は一応完了した