barbe-serverless를 사용하여 서버리스 식사 구축

Terraform이 지원하는 새로운 서버리스 애플리케이션 개발 솔루션인 barbe-serverless을 방금 출시했습니다.

꽤 초기 단계이지만 클래식 API 게이트웨이 + Lambda + DynamoDB 버거 콤보 식사를 생성하는 방법을 보여드릴 것이라고 생각했습니다.

바쁘거나(우리 모두가 그렇지 않습니까) 길을 잃으면(우리 모두가 그렇지 않습니까) 이 문서에서 파생된 예here를 확인할 수 있습니다.


식사를 만드는 첫 번째 단계는 barbe 구성 파일입니다. 꽤 맛있을 것이기 때문에 huuum.hcl라고 부르겠습니다.
barbe-serverless에 대한 링크가 포함된 template 블록으로 시작합니다.

# huuum.hcl
template {
  manifest = "https://raw.githubusercontent.com/Plenituz/barbe-serverless/main/manifest.json"
}


첫 번째 재료는 DynamoDB 테이블인 스테이크입니다. 고기는 식사의 가장 중요한 부분이므로 백엔드 서비스에 대한 데이터베이스도 마찬가지입니다.

# huuum.hcl
aws_dynamodb "steak" {
  hash_key = "name"
}


아 그리고 잊지 마세요, 스테이크는 요리하기 전에 항상 적절하게 간을 맞춰야 합니다. Auto Scaling 없이는 프로덕션 환경에 데이터베이스를 넣지 않을 것입니다.

# huuum.hcl
aws_dynamodb "steak" {
  hash_key = "name"

  auto_scaling {
    min = 1
    max = 100
  }
}



소스가 없는 좋은 스테이크는 정말 죽은 소일 뿐입니다. 그러니 람다 소스를 함께 섞어 봅시다.

람다 소스는 여러 가지 맛이 있습니다. 모두 좋아하지만 오늘은 한 가지 재료만 있으면 됩니다.
지난주에 남은 타이프 스크립트가 있다면 잘 될 것입니다. 그릇에 넣고 좋아하는 타이프 스크립트 블렌더를 가져와 미쳐 버릴 것입니다.

나는 개인적으로 esbuild 로 내 타이프 스크립트를 매싱하는 것을 좋아합니다. 방법은 다음과 같습니다.

// src/bowl.ts
import { DynamoDB } from '@aws-sdk/client-dynamodb';
import { APIGatewayEvent, APIGatewayProxyResult, Context } from 'aws-lambda';
import { marshall } from "@aws-sdk/util-dynamodb";
export const createSteak = async (event: APIGatewayEvent, context: Context): Promise<APIGatewayProxyResult> => {
    await new DynamoDB({ region: process.env.AWS_REGION }).putItem({
        TableName: STEAK_TABLE,
        Item: marshall(item),
    })
    return {
        statusCode: 200,
        body: JSON.stringify(user)
    }
}



./node_modules/.bin/esbuild src/bowl.ts --bundle --target=node16 --platform=node --outfile=dist/bowl.js



람다 소스를 템플릿 파일에 펴서 후추와 향신료를 추가하여 마무리할 수 있습니다.

aws_function "create-steak" {
  handler = "bowl.createSteak"
  runtime     = "nodejs16.x"
  memory_size = 128
  timeout     = 30
  environment {
    STEAK_TABLE = aws_dynamodb.steak.name
  }

  package {
    include = ["dist/bowl.js"]
    file_map = {
      "dist/bowl.js" = "bowl.js"
    }
  }
}


이제 당황하지 마세요. 이국적인 향신료처럼 보이지만 실제로는 화려하게 보이는 생강일 뿐입니다.

핸들러, 런타임, 메모리, 시간 초과 및 환경 변수와 같은 처음 몇 줄은 익숙할 것입니다.

그 이상한package 향신료는 우리가 람다 함수 패키지에 포함된 람다 소스를 나타냅니다.
include는 패키징할 파일을 나타내고 file_map는 생성된 zip 파일에서 패키징된 파일이 끝나는 위치를 나타냅니다.
우리의 경우 dist/bowl.js 만 패키징하지만 Barbe에게 zip 파일의 루트로 이동하도록 지시합니다.
이것은 다소 선택 사항입니다. 대신 file_map를 제거하고 .dist/bowl.createSteakhandler로 사용할 수 있지만 내 입에는 맛이 좋지 않습니다.

횡설수설은 그만하고 햄버거로 돌아가자. 거의 다 됐다. 스테이크 위에 약간의 치즈를 추가합시다. 이것은 식사에 미각을 환영하는 것입니다. 매우 중요하고 매우 맛있습니다.

aws_http_api "steak-api" {
  domain {
    name = "tasty.huuumyeah.com"
  }

  route "POST /steak" {
    aws_function = aws_function.create-steak
  }
}


보시다시피 우리는 route 블록을 사용하여 람다 소스 위에 직접 치즈를 얹었습니다. Gordon Ramsay는 자랑스러워할 것입니다.

취향에 따라 치즈와 소스를 완전히 섞어서 치즈 소스를 만들 수도 있습니다.

aws_function "create-steak" {
  // ...
  event_http_route "POST /steak" {
    aws_http_api = aws_http_api.steak-api
  }
}


우리는 이미 꽤 좋은 것을 얻었고 어떤 사람들은 그것을 그렇게 먹고 "해체된 버거"라고 부를 수도 있습니다.

저는 개인적으로 default 블록이라는 멋진 롤빵으로 마무리하는 것을 좋아합니다. 이 블록의 모든 것은 우리 프로젝트의 모든 구성 요소에 적용되므로 이름은 default 입니다.
내 비법은 소스의 일부를 롤빵에 직접 넣는 것입니다. 이렇게 하면 프로젝트에 더 많은 재료(람다)를 추가하면 미리 구성된 상태로 제공됩니다.

default {
  name_prefix = ["steak-co-production-"]
  package {
    include = ["dist/bowl.js"]
    file_map = {
      "dist/bowl.js" = "bowl.js"
    }
  }
  environment {
    STEAK_TABLE = aws_dynamodb.steak.name
  }

  runtime     = "nodejs16.x"
  memory_size = 128
  timeout     = 30
}

aws_function "create-steak" {
  handler = "bowl.createSteak"
}
aws_function "delete-steak" {
  handler = "bowl.deleteSteak"
}


그리고 그것이 우리가 필요한 모든 재료입니다. 얼마나 좋은지 이미 냄새를 맡을 수 있습니다.

봉사하자

barbe generate huuum.hcl --output dist
cd dist
terraform init
terraform apply


다음에 스파게티 코드 Inc.의 또 다른 레시피로 만나요.

좋은 웹페이지 즐겨찾기