From 1e6e007e5cd72a4cfb16652c3bece48d4e1b816e Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Thu, 29 Feb 2024 23:01:55 +0900 Subject: [PATCH 1/6] fix: recover --- db/db.go | 14 ++++++++------ main.go | 58 +++++++++++++++++++++++++------------------------------- 2 files changed, 34 insertions(+), 38 deletions(-) diff --git a/db/db.go b/db/db.go index 6766b00..7c96364 100644 --- a/db/db.go +++ b/db/db.go @@ -1,8 +1,10 @@ package db import ( + "context" "database/sql" "fmt" + "time" "github.com/geekcamp-vol11-team30/backend/config" "go.uber.org/zap" @@ -40,11 +42,11 @@ func NewDB(cfg *config.Config, logger *zap.Logger) (*sql.DB, error) { return nil, err } - // ctx, canncel := context.WithTimeout(context.Background(), 10*time.Second) - // defer canncel() - // if err := db.PingContext(ctx); err != nil { - // logger.Error("failed to ping db", zap.Error(err)) - // return nil, err - // } + ctx, canncel := context.WithTimeout(context.Background(), 10*time.Second) + defer canncel() + if err := db.PingContext(ctx); err != nil { + logger.Error("failed to ping db", zap.Error(err)) + return nil, err + } return db, nil } diff --git a/main.go b/main.go index 096b553..6879457 100644 --- a/main.go +++ b/main.go @@ -6,11 +6,15 @@ import ( "net" "github.com/geekcamp-vol11-team30/backend/config" + "github.com/geekcamp-vol11-team30/backend/controller" "github.com/geekcamp-vol11-team30/backend/db" - applogger "github.com/geekcamp-vol11-team30/backend/logger" - "github.com/geekcamp-vol11-team30/backend/util" + "github.com/geekcamp-vol11-team30/backend/middleware" + "github.com/geekcamp-vol11-team30/backend/repository" + "github.com/geekcamp-vol11-team30/backend/router" + "github.com/geekcamp-vol11-team30/backend/service" + "github.com/geekcamp-vol11-team30/backend/usecase" + "github.com/geekcamp-vol11-team30/backend/validator" _ "github.com/go-sql-driver/mysql" - "github.com/labstack/echo/v4" "github.com/volatiletech/sqlboiler/v4/boil" "go.uber.org/zap" ) @@ -19,15 +23,12 @@ func main() { logger, _ := zap.NewProduction() defer logger.Sync() sugar := logger.Sugar() - if err := run(context.Background(), logger); err != nil { sugar.Fatal(err) } } - func run(ctx context.Context, logger *zap.Logger) error { logger.Info("magische starting...") - cfg, err := config.New() if err != nil { return err @@ -39,42 +40,35 @@ func run(ctx context.Context, logger *zap.Logger) error { boil.SetDB(db) boil.DebugMode = cfg.SqlLog - // ur := repository.NewUserRepository(db) - // ar := repository.NewAuthRepository(db) - // er := repository.NewEventRepository(db) - // oar := repository.NewOauthRepository(db) - // gs := service.NewGoogleService(cfg, oar, ur) - // ms := service.NewMicrosoftService(cfg, oar, ur) - // uv := validator.NewUserValidator() - // uu := usecase.NewUserUsecase(ur, oar, er, uv, gs, ms) - // au := usecase.NewAuthUsecase(cfg, logger, ar) - // eu := usecase.NewEventUsecase(cfg, er) - // oau := usecase.NewOauthUsecase(cfg, oar, ur, gs, ms, uu) + ur := repository.NewUserRepository(db) + ar := repository.NewAuthRepository(db) + er := repository.NewEventRepository(db) + oar := repository.NewOauthRepository(db) + gs := service.NewGoogleService(cfg, oar, ur) + ms := service.NewMicrosoftService(cfg, oar, ur) + uv := validator.NewUserValidator() + uu := usecase.NewUserUsecase(ur, oar, er, uv, gs, ms) + au := usecase.NewAuthUsecase(cfg, logger, ar) + eu := usecase.NewEventUsecase(cfg, er) + oau := usecase.NewOauthUsecase(cfg, oar, ur, gs, ms, uu) - // em := middleware.NewErrorMiddleware(logger, uu) - // atm := middleware.NewAccessTimeMiddleware() - // am := middleware.NewAuthMiddleware(cfg, logger, au, uu) + em := middleware.NewErrorMiddleware(logger, uu) + atm := middleware.NewAccessTimeMiddleware() + am := middleware.NewAuthMiddleware(cfg, logger, au, uu) - // uc := controller.NewUserController(uu) - // ac := controller.NewAuthController(cfg, uu, au) - // ec := controller.NewEventController(eu) - // oc := controller.NewOauthController(cfg, oau, uu, au) + uc := controller.NewUserController(uu) + ac := controller.NewAuthController(cfg, uu, au) + ec := controller.NewEventController(eu) + oc := controller.NewOauthController(cfg, oau, uu, au) l, err := net.Listen("tcp", fmt.Sprintf(":%d", cfg.Port)) if err != nil { logger.Fatal("failed to listen port", zap.Error(err)) } - // err = util.SendMail(*cfg, "tak848.0428771@gmail.com", "konnitiha", "hello") // fmt.Println(err) - // e := router.NewRouter(cfg, logger, em, atm, am, uc, ac, ec, oc) - e := echo.New() - // enable log - e.GET("/health", func(c echo.Context) error { - return util.JSONResponse(c, 200, "OK") - }) - applogger.SetRequestLoggerToEcho(e, logger) + e := router.NewRouter(cfg, logger, em, atm, am, uc, ac, ec, oc) s := NewServer(e, l, logger) return s.Run(ctx) } From 2c8b349a07856be599bd02f74264bf86a3d51418 Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Thu, 29 Feb 2024 23:05:27 +0900 Subject: [PATCH 2/6] fix: omit health --- logger/logger.go | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/logger/logger.go b/logger/logger.go index e9024fa..1125718 100644 --- a/logger/logger.go +++ b/logger/logger.go @@ -99,9 +99,9 @@ func SetRequestLoggerToEcho(e *echo.Echo, logger *zap.Logger) { } e.Use(func(next echo.HandlerFunc) echo.HandlerFunc { return func(c echo.Context) error { - // if c.Path() == "/health" { - // return next(c) - // } + if c.Path() == "/health" { + return next(c) + } return middleware.RequestLoggerWithConfig(cfg)(next)(c) } }) From b2e7e3b34c78bbde1bddd3e7da69774dcd7c2cc4 Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Fri, 1 Mar 2024 20:13:44 +0900 Subject: [PATCH 3/6] chore: apply env --- .github/workflows/deploy-dev.yaml | 13 ++++ .github/workflows/deploy-prd.yaml | 13 ++++ infra/ecs/ecs-task-def.jsonnet | 100 ++++++++++++++++++++++++++++++ infra/ecs/ecspresso.jsonnet | 17 ++--- 4 files changed, 135 insertions(+), 8 deletions(-) diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index bbd9123..8e64bbf 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -8,6 +8,15 @@ env: ENV: dev AWS_REGION: ap-northeast-1 AWS_ACCOUNT_ID: 905418376731 + BASE_URL: https://api.dev.magi-sche.org + PORT: 8080 + FRONTEND_ENDPOINT: https://dev.magi-sche.org + OAUTH_DEFAULT_RETURN_URL: https://dev.magi-sche.org/callback + CORS_ORIGINS: https://dev.magi-sche.org + ACCESS_TOKEN_EXPIRE_MINUTES: 5 + # 60 days = 30 * 24 * 60 = 43200 minutes + REFRESH_TOKEN_EXPIRE_MINUTES: 86400 + SQL_LOG: true jobs: build-and-push: @@ -79,6 +88,8 @@ jobs: platforms: linux/amd64,linux/arm64 deploy: + environment: + name: dev permissions: id-token: write contents: read @@ -102,6 +113,8 @@ jobs: run: | ecspresso deploy --config ecspresso.yml env: + TFE_TOKEN: ${{ secrets.TFE_TOKEN }} + TFC_WORKSPACE: magische_infra_${{ env.ENV }} AWS_REGION: ${{ env.AWS_REGION }} AWS_ACCOUNT_ID: ${{ env.AWS_ACCOUNT_ID }} ENV: ${{ env.ENV }} diff --git a/.github/workflows/deploy-prd.yaml b/.github/workflows/deploy-prd.yaml index d7faef2..dd18de6 100644 --- a/.github/workflows/deploy-prd.yaml +++ b/.github/workflows/deploy-prd.yaml @@ -8,6 +8,15 @@ env: ENV: prd AWS_REGION: ap-northeast-1 AWS_ACCOUNT_ID: 905418376731 + BASE_URL: https://api.magi-sche.net + PORT: 8080 + FRONTEND_ENDPOINT: https://magi-sche.net + OAUTH_DEFAULT_RETURN_URL: https://magi-sche.net/callback + CORS_ORIGINS: https://magi-sche.net + ACCESS_TOKEN_EXPIRE_MINUTES: 5 + # 60 days = 30 * 24 * 60 = 43200 minutes + REFRESH_TOKEN_EXPIRE_MINUTES: 86400 + SQL_LOG: true jobs: build-and-push: @@ -79,6 +88,8 @@ jobs: platforms: linux/amd64,linux/arm64 deploy: + environment: + name: prd permissions: id-token: write contents: read @@ -102,6 +113,8 @@ jobs: run: | ecspresso deploy --config ecspresso.yml env: + TFE_TOKEN: ${{ secrets.TFE_TOKEN }} + TFC_WORKSPACE: magische_infra_${{ env.ENV }} AWS_REGION: ${{ env.AWS_REGION }} AWS_ACCOUNT_ID: ${{ env.AWS_ACCOUNT_ID }} ENV: ${{ env.ENV }} diff --git a/infra/ecs/ecs-task-def.jsonnet b/infra/ecs/ecs-task-def.jsonnet index 1f0ccf5..527b0c8 100644 --- a/infra/ecs/ecs-task-def.jsonnet +++ b/infra/ecs/ecs-task-def.jsonnet @@ -21,6 +21,106 @@ protocol: 'tcp', }, ], + environment: [ + { + name: 'ENV', + value: '{{ must_env `ENV` }}', + }, + { + name: 'BASE_URL', + value: '{{ must_env `BASE_URL` }}', + }, + { + name: 'PORT', + value: '{{ must_env `PORT` }}', + }, + { + name: 'SQL_LOG', + value: '{{ must_env `SQL_LOG` }}', + } + { + name: 'ACCESS_TOKEN_EXPIRE_MINUTES', + value: '{{ must_env `ACCESS_TOKEN_EXPIRE_MINUTES` }}', + }, + { + name: 'REFRESH_TOKEN_EXPIRE_MINUTES', + value: '{{ must_env `REFRESH_TOKEN_EXPIRE_MINUTES` }}', + }, + { + name: 'MYSQL_HOST', + value: '{{ tfstate `output.rds_endpoint` }}', + }, + { + name: 'MYSQL_PORT', + value: '{{ tfstate `output.rds_port` }}', + }, + { + name: 'MYSQL_DATABASE', + value: '{{ tfstate `output.rds_db_name` }}', + }, + { + name: 'CSRF_DISABLED', + value: 'true', + }, + { + name: 'OAUTH_DEFAULT_RETURN_URL', + value: '{{ must_env `OAUTH_DEFAULT_RETURN_URL` }}', + }, + { + name: 'CORS_ORIGINS', + value: '{{ must_env `CORS_ORIGINS` }}', + }, + ], + secrets: [ + { + name: 'MYSQL_USER', + valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:username', + }, + { + name: 'MYSQL_PASSWORD', + valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:password', + }, + { + name: 'SECRET_KEY', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:secret_key', + }, + { + name: 'OAUTH_GOOGLE_CLIENT_ID', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_id', + }, + { + name: 'OAUTH_GOOGLE_CLIENT_SECRET', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_secret', + }, + { + name: 'OAUTH_MICROSOFT_CLIENT_ID', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_id', + }, + { + name: 'OAUTH_MICROSOFT_CLIENT_SECRET', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_secret', + }, + { + name: 'SMTP_EMAIL', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_email', + }, + { + name: 'SMTP_USER', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_user', + } + { + name: 'SMTP_PASSWORD', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_password', + }, + { + name: 'SMTP_HOST', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_host', + }, + { + name: 'SMTP_PORT', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_port', + }, + ], }, ], cpu: '{{ must_env `CPU` }}', diff --git a/infra/ecs/ecspresso.jsonnet b/infra/ecs/ecspresso.jsonnet index 206bc2d..a8364b8 100644 --- a/infra/ecs/ecspresso.jsonnet +++ b/infra/ecs/ecspresso.jsonnet @@ -2,15 +2,16 @@ region: 'ap-northeast-1', cluster: 'magische-{{ must_env `ENV` }}', service: 'magische-{{ must_env `ENV` }}-api', + // service_definition: 'test/ecs-service-def.jsonnet', service_definition: '', task_definition: 'ecs-task-def.jsonnet', timeout: '10m0s', - // plugins: [ - // { - // name: 'tfstate', - // config: { - // url: 'remote://app.terraform.io/magische/magische_infra_dev', - // }, - // }, - // ], + plugins: [ + { + name: 'tfstate', + config: { + url: 'remote://app.terraform.io/magische/{{ must_env `TFC_WORKSPACE` }}', // like magische_infra_dev + }, + }, + ], } From 7dffb812d74d2929fd7089fdd85f50d42d870fa5 Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Fri, 1 Mar 2024 21:17:51 +0900 Subject: [PATCH 4/6] fix: ssm arn --- infra/ecs/ecs-task-def.jsonnet | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/infra/ecs/ecs-task-def.jsonnet b/infra/ecs/ecs-task-def.jsonnet index 527b0c8..382a1e8 100644 --- a/infra/ecs/ecs-task-def.jsonnet +++ b/infra/ecs/ecs-task-def.jsonnet @@ -74,51 +74,51 @@ secrets: [ { name: 'MYSQL_USER', - valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:username', + valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:username::', }, { name: 'MYSQL_PASSWORD', - valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:password', + valueFrom: '{{ tfstate `output.rds_admin_password_secret_arn` }}:password::', }, { name: 'SECRET_KEY', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:secret_key', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:secret_key::', }, { name: 'OAUTH_GOOGLE_CLIENT_ID', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_id', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_id::', }, { name: 'OAUTH_GOOGLE_CLIENT_SECRET', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_secret', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_google_client_secret::', }, { name: 'OAUTH_MICROSOFT_CLIENT_ID', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_id', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_id::', }, { name: 'OAUTH_MICROSOFT_CLIENT_SECRET', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_secret', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:oauth_microsoft_client_secret::', }, { name: 'SMTP_EMAIL', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_email', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_email::', }, { name: 'SMTP_USER', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_user', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_user::', } { name: 'SMTP_PASSWORD', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_password', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_password::', }, { name: 'SMTP_HOST', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_host', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_host::', }, { name: 'SMTP_PORT', - valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_port', + valueFrom: '{{ tfstate `output.api_server_ssm_arn` }}:smtp_port::', }, ], }, From 4fd792cf9aa36a79fdf1b6d67aa6afe49dfa0b9b Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Fri, 1 Mar 2024 21:33:14 +0900 Subject: [PATCH 5/6] chore: gha action version --- .github/workflows/deploy-dev.yaml | 2 +- .github/workflows/deploy-prd.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index 8e64bbf..c635fbf 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -100,7 +100,7 @@ jobs: uses: actions/checkout@v4 - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::905418376731:role/magische-${{ env.ENV }}-api-deploy aws-region: ${{ env.AWS_REGION }} diff --git a/.github/workflows/deploy-prd.yaml b/.github/workflows/deploy-prd.yaml index dd18de6..250a8ad 100644 --- a/.github/workflows/deploy-prd.yaml +++ b/.github/workflows/deploy-prd.yaml @@ -100,7 +100,7 @@ jobs: uses: actions/checkout@v4 - name: configure aws credentials - uses: aws-actions/configure-aws-credentials@v1 + uses: aws-actions/configure-aws-credentials@v4 with: role-to-assume: arn:aws:iam::905418376731:role/magische-${{ env.ENV }}-api-deploy aws-region: ${{ env.AWS_REGION }} From 64417408b039d3ea76aa65906f345b61ecc68abd Mon Sep 17 00:00:00 2001 From: Takuya Takahashi Date: Fri, 1 Mar 2024 22:11:04 +0900 Subject: [PATCH 6/6] chore: gha action version --- .github/workflows/deploy-dev.yaml | 2 +- .github/workflows/deploy-prd.yaml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/.github/workflows/deploy-dev.yaml b/.github/workflows/deploy-dev.yaml index c635fbf..e620756 100644 --- a/.github/workflows/deploy-dev.yaml +++ b/.github/workflows/deploy-dev.yaml @@ -51,7 +51,7 @@ jobs: aws-region: ${{ env.AWS_REGION }} - name: login to ecr - uses: aws-actions/amazon-ecr-login@v1 + uses: aws-actions/amazon-ecr-login@v2 id: login-ecr - id: set_env diff --git a/.github/workflows/deploy-prd.yaml b/.github/workflows/deploy-prd.yaml index 250a8ad..cf719b7 100644 --- a/.github/workflows/deploy-prd.yaml +++ b/.github/workflows/deploy-prd.yaml @@ -51,7 +51,7 @@ jobs: aws-region: ${{ env.AWS_REGION }} - name: login to ecr - uses: aws-actions/amazon-ecr-login@v1 + uses: aws-actions/amazon-ecr-login@v2 id: login-ecr - id: set_env