경매야 사전 가입 서비스 EC2에서 Lambda로 마이그레이션 작업

강하마·2021년 7월 5일
1

🎢경매야 사전 가입 서비스 EC2에서 Lambda로 마이그레이션 작업이란 무엇인가?

경매야 서비스에서는 회원 가입 시 사전 가입에 참여 여부를 확인하는 절차가 있다. 이를 위해서 현재는 서비스가 종료된 경매야 사전 가입 백엔드 서버를 AWS EC2에서 운영 중이었다. 회원 가입 시 Graphql query로 한번만 통신을 하는 서버를 운영하기 위해서 약 월 5만원 가량의 서버 비용을 지출하는 이슈가 존재 했다. 서비스가 종료된 서버를 필요 기능만을 위해 경량화 하고 서버 운영 비용을 절감 하기 위해, AWS Lambda기반의 serverless Architecture로 마이그레이션 하기로 결정했다.

🎃개발리소스

투입 인력

  • serverless Architecture에 빠진 개발자 1명

개발소요기간

  • 2021-06-28 ~ 2021-07-09(약 2주)

기술스택

  • AWS Lambda
  • AWS Api Gateway
  • AWS RDS(PostgreSQL)
  • Serverless Framework
  • TypeScript
  • Apollo Server
  • Nexus
  • Prisma

💵서버 유지 비용을 예측해보자

🔥Lambda


🚄Api Gateway

Rest Api 기준

🕐Cloud Watch

거의 0원에 수렴한다

📠서버비용 예측

함수에 128MB 메모리를 할당하고 한달에 1만회 실행하며 매번 1000ms간 실행 되었다면 요금은?

  • lambda
  • Api Gateway
  • 결과
    회원가입이 한달에 1만 건 정도 일어 난다고 가정했을때, Lambda와 API Gateway의 사용 비용을 합산하면 약 0.06USD가 청구 된다는 것을 알수 있다. 하지만 Lambda는 한달에 1백만 건 까지 무료이므로 0.04USD이다. EC2에 Graphql 서버를 운영 비용 약 5만원을 거의 0원에 사용을 기대 할 수 있다.

✨요구사항

기술 스텍 선정에 있어 최소한의 비용으로 경량화 되고 높은 퍼포먼스를 내줄 수 있는 서버로 개발하길 원했다. 하지만 이미 프로덕션 레벨에서 Graphql 형태로 서비스 중이었기 때문에 경매야 사전가입 백엔드 서버와 같은 apollo + nexus + prisma로 구성했다.

😅개발중 발생한 이슈

  • prisma 배포시 용량 이슈
    serverless Framework를 사용해서 ZIP형태로 Lambda에 업로드 할 수 있는 용량은 50MB까지이다. 하지만 어째서 인지 121.59MB로 상당히 큰 용량으로 업로드 되지 못한것을 볼수 있다.

    원인을 파악해보니 prisma Rust로 작성된 binary 파일로 qureying하는 것을 알수 있었다. 이 파일이 용량을 엄청나게 잡아 먹고 있다는 것을 알게 되었다. 그러므로 deploy시 제외하는 코드를 serverless.yml에 추가했다.
package:
  patterns:
    - "!node_modules/.prisma/client/query-engine-*"
    - "!node_modules/.prisma/client/libquery_engine-*"
    - "node_modules/.prisma/client/libquery_engine-rhel-openssl-1.0.x.so.node"
    - "node_modules/.prisma/client/query-engine-rhel-openssl-1.0.x"
    - "!node_modules/prisma/*"
    - "!node_modules/@prisma/engines/*"
  • prisma 배포시 바이너리 파일 이슈
    오류를 수정한 이후 playground를 확인하고 한순간이지만 환호할 수 있었다. 하지만 쿼리를 작성해서 날리니 다음과 같은 오류가 발생 했다....

    위와 같은 오류는 로컬환경의 OS와 Lambda의 OS가 달라 prisma가 binary파일을 사용하는데 오류가 발생 하는 것이었다. 이를 해결하기 위해서 schema.prisma파일에 binaryTargets을 binaryTargets = ["native", "rhel-openssl-1.0.x"]으로 수정해줬다.
generator client {
  provider      = "prisma-client-js"
  binaryTargets = ["native", "rhel-openssl-1.0.x"]
}
  • RDS 연결시 VPC 이슈
    이번에는 진짜 진짜 부푼 마음 가지고 쿼리를 날려보았다. 거의 다 되었다고 생각을 했는데 이번에는 데이터베이스 서버를 찾을수가 없다는 오류를 만났다. 로컬에서는 데이터베이스를 잘 찾았는데 lambda에 배포하면 못찾다니...

    검색을 해보니 람다는 RDS와 Lambda의 subnet과 security group를 동일하게 맞춰줘야 하는 작업이 필요했다. 이 부분의 해결 방법은 보안 적인 문제가 있어서 패스하겠다.

😴느낀점

이번 프로젝트로 프로비저닝된 EC2서버를 serverless한 Lambda로 마이그레이션 하는 작업을 해볼수 있었다. 확실히 서버의 세팅이나 관리, 스케일링에 대해 전혀 신경을 쓸 필요가 없다는 점에서 매력적이었다. 협업에서 작은 단위의 기능 또는 독립된 서비스를 serverless로 바꾸어 가는게 트랜드라고 하던데 나에게도 이런 기회가 와서 정말 좋은 경험이었던것 같다. 다음에는 큰 사이즈의 신규 서비스를 serverless로 구현해보는 기회가 온다면 좋을것 같다.

profile
The path to serverless engineer

0개의 댓글