Code States/TIL

[0526] 섹션 3. 프로젝트 - 마이크로서비스 Day 3 - Step 4(데이터베이스의 재고를 증가시키는 Lambda 함수 생성)

ki1111m2 2023. 5. 26. 16:14

Step 4. 데이터베이스의 재고를 증가시키는 Lambda 함수 생성

 

step 2를 진행하며 메시지 바디의 값을 읽지 못해 디비에서 값을 읽어오는 것으로 소스코드를 수정한 부분이 있었다

최종 요구사항 반영을 위해 다시 메시지 바디의 값을 읽어오도록 변경했다

이게 진짜 어이가 없는게 어제는 분명 안됐는데.. 오늘 다시 해보니까 됐다

무슨 차이인지 도저히 모르겠다 아무튼 됐으니..

stock_increse_lambda 함수를 배포한 후, 정상 작동하는지 보기 위해 기존 람다 함수 수정 전에 테스트를 진행해보았다

목표 url에 post 요청을 보냈다

트러블슈팅

바디 값을 인식하지 못하고 null로 반환되는 상황이 발생했다

헤더를 보니 컨텐트 타입이 text/plain으로 되어있었다

수정이 안되어서 체크를 해제하고 Content-Type: application/json 으로 새로 만들어주었다

트러블슈팅

Cannot find module "serverless-http"

코드에 분명 써있는데도 안돌아갔다

배포 전에 npm install을 진행해준 후 해결됐다

로컬이 아닌 람다로 배포하더라도 npm install은 필요한 부분인 듯 하다

package.json 파일이 같이 가는 듯 하다

POST 요청은 제대로 들어가지만 DB의 값이 변경되지 않았다

handler.js와 database.js 파일을 보니 코드에 쓰인 변수명과 바디값에 보낸 변수명이 달라서 그랬다

변수 명을 같게 해주면 정상적으로 DB 값도 변경되는 것을 볼 수 있었다

 

 

본격적으로 기존 람다와 연결을 시작했다

최종 요구사항을 위해서 body에 값을 넣어 보낼 것이기 때문에 sales_api의 handler 파일을 수정한다

stock_lambda의 index 파일도 수정한다

처음엔 여기도 마찬가지로 req.body를 썼지만, 다시 생각해보니 이 람다는 sqs를 통해 넘어온 메시지를 받는 것이기 때문에

튜토리얼에서 했던 것을 참고하여 const record = event.Records 로 매핑해줬다

그러나 오류가 발생했다

트러블슈팅

ParameterValueInvelid: The message attribute " " must contain non-empty attribute value for message attribute type "String"

변수를 인식하지 못하는 오류가 발생했다

Group를 Gruop로 오타를 내서 발생

트러블슈팅

Invoke Error: message is not defined

코드를 복사해오는 과정에서 사용되지 않는 코드를 긁어와서 발생한 오류

해당 라인 삭제 후 해결

트러블슈팅

Invoke Error: Cannot read properties of undefined

변수에 값이 들어가지 않는 오류 발생

console.log(event)를 통해 이벤트 값을 찍어보니 body의 구조가 더 들어가야 했다

record.body.MessageAttribute.변수명.value 까지 들어가야 접근 가능했다

아래처럼 고쳤으나 여전히 변수 명에 접근하지 못하고 있었다

이벤트를 다시 보니 배열 형태로 받아오고 있어서 첫 번째 배열 인덱스에 접근해야될 필요가 있었다

const record = event.Records 뒤에 [0]을 붙여서 배열의 첫 번째 인덱스에 접근했다

 

또한 body의 값을 문자열로 받아오고 있었다

그렇기에 JSON.parse(record.body) 를 이용하여 json 형태로 변환하였다

 

다시 생각해보니 필요한 바디값보다 많은 내용이 포함되어 있어서 필요한 부분만 남기고 삭제했다

 

정상적으로 값이 인식되었고, 람다함수가 성공적으로 실행된 것을 볼 수 있다

api 요청 또한 정상적으로 보내졌다

stock_increse_lambda의 로그를 보니 정상적으로 실행되었다

DB의 값 또한 성공적으로 업데이트 된 것을 볼 수 있었다