프로젝트3 회고
Day1
목표
- Serveless를 이용한 AWS 리소스 생성
- 메시지 Queue가 사용되는 구조 이해
Tutorial - Step 1
service: tutorial-step-1 #Root properties
frameworkVersion: '3'
provider: #ProviderGeneral settings
name: aws
runtime: nodejs18.x
#리전 변경 ap-northeast-2 (default: us-east-1)
region: ap-northeast-2
functions:
api:
handler: index.handler
events:
\- httpApi:
path: /
method: post
배포 버킷 서버리스 프레임워크는 배포용 아티팩트를 저장하기 위해 S3 버킷이 필요합니다. 해당 버킷은 Serverless에서 자동으로 생성되고 관리되지만 필요한 경우 명시적으로 구성할 수 있습니다.
추가 도전과제: body가 { input: 숫자 } 가 맞는지 검증하고, 검증에 실패하면 응답코드 400 및 에러 메시지를 반환하는 코드를 넣어봅시다.
$ curl -X POST https://API_GATEWAY_ID.execute-api.ap-northeast-2.amazonaws.com \
--header 'Content-type: application/json' \
--data-raw '{ "input": 1 }'
-
-x 옵션은 cURL이 프록시 서버를 통해 요청을 전송할 때 사용되는 옵션입니다. “x”는 “proxy”의 줄임말로, 프록시 서버와 관련된 옵션을 나타냅니다.
-
–header ‘Content-type: application/json’은 요청 헤더에 포함될 내용으로, 이 경우 Content-type 헤더를 application/json으로 설정하여 요청 본문이 JSON 형식임을 명시합니다.
-
–data-raw ‘{ “input”: 1 }’은 요청 본문에 포함될 데이터입니다. 여기서는 JSON 형식으로 { “input”: 1 }을 전송합니다. 이는 서버에 1이라는 입력 값을 포함하는 JSON 데이터를 보내는 것을 의미합니다.
Step 2: Serverless를 이용한 Lambda - SQS - Lambda 구조 생성
service: tutorial-step-2
frameworkVersion: '3'
provider:
name: aws
runtime: nodejs18.x
region: ap-northeast-2
constructs:
jobs:
type: queue
worker:
handler: index.test
functions:
producer:
handler: index.producer
events:
- httpApi:
method: post
path: /produce
environment:
QUEUE_URL: ${construct:jobs.queueUrl}
plugins:
- serverless-lift
SQS 대기열 배포
위의 예는 기존 SQS 대기열에서 메시지를 사용하는 방법을 보여줍니다. SQS 대기열을 생성하려면 serverless.yml사용자 지정 CloudFormation을 작성하거나 Lift를 사용할 수 있습니다. Lift 는 “ 구축 “ 을 통해 애플리케이션 배포를 단순화하는 서버리스 프레임워크 플러그인입니다. 리프트는 다음을 통해 설치할 수 있습니다. queue구성을 사용하여 Lambda 소비자와 함께 SQS 대기열을 배포 할 수 있습니다. 구성은 다음 queue을 배포합니다.
SQS 대기열 Lambda worker함수: 이 함수는 대기열로 전송된 메시지를 처리합니다. SQS “ 데드 레터 큐 “: 이 큐는 처리에 실패한 모든 메시지를 저장합니다. queue구성 설명서를 읽고 코드가 있는 전체 예제를 찾고 배치 크기, 재시도 및 기타 옵션을 구성하는 방법을 알아보세요. https://www.serverless.com/framework/docs/providers/aws/events/sqs#deploying-sqs-queues
TODO: Step 1을 참고하여, +1 를 하는 코드를 넣으세요
프로듀서를 여러 번 반복해서 실행 쉘 스크립트의 반복문을 이용해 반복적으로 실행할 수 있습니다.
DLQ 연결 및 K6 성능테스트,Visibility Timeout 조절과 DLQ
consumer에 실행 시간을 늘리는 코드 추가
function delay(time) {
return new Promise(resolve => setTimeout(resolve, time));
}
const test = async (event) => {
await delay(15000) // 15초 딜레이
for (const record of event.Records) {
// 생략
}
}
queue의 visibility timeout 을 잘 못 설정하면 두개 이상의 컨슈머가 소비하게 되는 상황 메세지 내용이 금융거래와 같은 메세지라면 중복으로 처리하면 문제 람다 함수 실행시간이 15초인데 큐의 visibility timeout이 15초 보다 작다면 람다 함수가 실행되기전에 큐는 실패 처리를 해서 dlq로 메세지를 넘겨 버리게 된다.
요구사항 분석 및 초기 다이어그램 작성