Closed16

AWS未経験者がNext.js SSRアプリをデプロイするまで

人3人3

構成管理ツールを選ぶ。
Pulumiにした。選定理由は以下。

  • 好きな言語が選べる。
  • Pulumi AIなるものがあるらしい。

競合はTerraformなど。

評価項目 Pulumi Terraform
名前 かわいい 強そう
言語 TypeScript, Go, Python, YAMLなど HCL(独自言語)
ユーザー数
人3人3

DBは、最初はrailway。いけたらRDSにしてpulumiの管理下にする

人3人3

VPC?サブネット?後で考える。
AWSのアクセスキーはルートユーザーではなくIAMユーザーで作成して適切な権限を付与すべき。

人3人3

デプロイ成功したが、URLにアクセスするとtoo many redirectsエラーが出てページが表示されない。baseDirectoryの設定が間違っているらしいが正しくはどうなのかわからない

index.ts
import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

const config = new pulumi.Config();

// GitHub
const githubRepo = config.require("githubRepo");
const githubToken = config.require("githubToken");

// Database url
const databaseUrl = config.require("databaseUrl");

// NextAuth
const nextAuthSecret = config.require("nextAuthSecret");
const nextAuthUrl = config.require("nextAuthUrl");

// Google
const googleClientId = config.require("googleClientId");
const googleClientSecret = config.require("googleClientSecret");

const example = new aws.amplify.App("next", {
buildSpec: `  version: 0.1
  frontend:
    phases:
      preBuild:
        commands:
          - yarn install
          - yarn prisma migrate dev
      build:
        commands:
          - yarn run build
    artifacts:
      baseDirectory: .next
      files:
        - '**/*'
    cache:
      paths:
        - node_modules/**/*

`,
    customRules: [{
        source: "/<*>",
        status: "404",
        target: "/index.html",
    }],
    environmentVariables: {
        DATABASE_URL: databaseUrl,
        NEXTAUTH_SECRET: nextAuthSecret,
        NEXTAUTH_URL: nextAuthUrl,
        GOOGLE_CLIENT_ID: googleClientId,
        GOOGLE_CLIENT_SECRET: googleClientSecret
    },
    accessToken: githubToken,
    repository: githubRepo,
});


const main = new aws.amplify.Branch("main", {
    appId: example.id,
    branchName: "main",
});

export const url = pulumi.interpolate`https://${main.branchName}.${example.id}.amplify.com`

人3人3

pulumi upできなくなった。

import * as pulumi from "@pulumi/pulumi";
import * as aws from "@pulumi/aws";

この2行だけしか書いてないのに、unhandled errorが発生する。

人3人3

手動でAWSコンソールを操作したらデプロイできた。pulumiは情報が少なく、エラーが起こったときのトラブルシューティングが辛すぎるのでやめる。

人3人3

手動とterraformの違い

Amplify app
iam_service_role_arn = サービスロールのarn
platform = "WEB_COMPUTE"

Amplify branch
framework = "Next.js - SSR"

platform = "WEB_COMPUTE"を追加して初めて動くようになった。
しかし、API系は相変わらずInternal Server Error

人3人3

一通りデプロイできるようになったので、Terraform定義をきれいにしてクローズする。

人3人3
main.tf
terraform {
  required_providers {
    aws = {
      source = "hashicorp/aws"
      version = "4.65.0"
    }
  }
}

provider "aws" {
  # Configuration options
  region  = "us-east-2"
}

resource "aws_amplify_app" "snsapp" {
  name       = "snsapp"
  repository = var.githubRepo
  access_token = var.githubToken
  iam_service_role_arn =  var.iamServiceRoleArn
  platform = "WEB_COMPUTE"
  
  environment_variables    = {
    DATABASE_URL = var.DATABASE_URL
    GOOGLE_CLIENT_ID = var.GOOGLE_CLIENT_ID
    GOOGLE_CLIENT_SECRET = var.GOOGLE_CLIENT_SECRET
    NEXTAUTH_URL = var.NEXTAUTH_URL
    NEXTAUTH_SECRET = var.NEXTAUTH_SECRET
  }

  enable_branch_auto_build = true
  enable_auto_branch_creation = true
  enable_branch_auto_deletion = true
  auto_branch_creation_patterns = [
    "*",
    "*/**",
  ]

  # The default build_spec added by the Amplify Console for React.
  build_spec = <<-EOT
    version: 1
    frontend:
      phases:
        preBuild:
          commands:
            - yarn install
        build:
          commands:
            - env | grep -e NEXTAUTH_URL -e NEXTAUTH_SECRET -e DATABASE_URL -e GOOGLE_CLIENT_ID -e GOOGLE_CLIENT_SECRET >> .env.production
            - yarn run build
      artifacts:
        baseDirectory: .next
        files:
          - '**/*'
      cache:
        paths:
          - node_modules/**/*
  EOT
  
  auto_branch_creation_config {
    enable_auto_build = true
  }

  # The default rewrites and redirects added by the Amplify Console.
  custom_rule {
    source = "/<*>"
    status = "404-200"
    target = "/index.html"
  }
}

resource "aws_amplify_branch" "main" {
  app_id      = aws_amplify_app.snsapp.id
  branch_name = "main"

  framework = "Next.js - SSR"
  stage     = "PRODUCTION"

}
人3人3
variables.tf
variable "githubRepo" {
  type = string
}

variable "githubToken" {
  type = string
}

variable "iamServiceRoleArn" {
    type = string
}

variable "DATABASE_URL" {
  type = string
}

variable "GOOGLE_CLIENT_ID" {
  type = string
}

variable "GOOGLE_CLIENT_SECRET" {
  type = string
}

variable "NEXTAUTH_URL" {
  type = string
}

variable "NEXTAUTH_SECRET" {
  type = string
}
このスクラップは2023/05/04にクローズされました