Computer >> 컴퓨터 >  >> 프로그래밍 >> Ruby

AWS Lambda에서 Ruby 사용하기 — Serverless 프레임워크로 시작하는 실전 가이드

AWS Lambda의 Ruby 공식 지원 소식이 발표되자마자 너무 반가워서 바로 사용해 보았습니다. Honeybadger에서는 한동안 Lambda를 활용해 왔고, 저 역시 오랫동안 서버리스 함수를 Ruby로 작성할 수 있기를 기대해 왔습니다. 새로운 Ruby 런타임을 몇 시간 가까이 사용해 본 결과, 앞으로 Node, Go, Python에 들이는 시간이 눈에 띄게 줄어들 것이라 확신하게 되었습니다. :)

간단한 예제 살펴보기

AWS의 공식 발표 블로그 포스트만으로도 Ruby on Lambda를 빠르게 시작할 수 있지만, 이 글에서는 Serverless 프레임워크를 활용해 Ruby Lambda 함수를 배포하는 방법을 소개하려 합니다. 이 프레임워크는 Lambda 작업 시 겪는 번거로움을 대부분 없애주는 훌륭한 도구입니다. 당시 최신 버전(1.34)에는 Ruby 프로젝트용 템플릿 생성 기능이 아직 포함되지 않았지만(필자가 글을 쓰기 시작하기 몇 시간 전에 해당 PR이 머지되었을 정도입니다), 제너레이터 없이도 충분히 손쉽게 시작할 수 있습니다.

아래는 이 가이드에서 사용할 설정 파일 예시입니다. S3 객체가 생성될 때마다 관련 메타데이터를 DynamoDB 테이블에 저장하는 간단한 함수입니다.

설정 파일의 resources 섹션은 새로운 DynamoDB 테이블을 자동으로 생성하며, 생성된 테이블의 이름은 함수의 환경 변수로 전달되어 코드 내부에서 참조됩니다. 함수는 사전에 생성된 SNS 토픽의 이벤트로 트리거되고, 해당 SNS 토픽은 수동으로 생성한 S3 버킷의 PUT 이벤트 알림을 수신합니다.

Ruby 코드는 다음과 같습니다:

코드 자체는 크게 복잡하지 않습니다. SNS 이벤트를 수신한 뒤, 메시지 내 레코드를 순회하면서 생성된 각 S3 객체의 정보를 추출하고, HEAD 요청으로 객체의 메타데이터를 조회한 후, DynamoDB 테이블에 해당 항목을 생성 또는 업데이트(put)합니다. 이 함수의 유일한 의존성인 AWS SDK는 런타임 환경에 기본 포함되어 있으므로 Gemfile조차 신경 쓸 필요가 없습니다. 물론 추가 gem이 필요하다면 간단히 포함할 수 있는데, 이 부분은 배포 과정에서 자세히 살펴보겠습니다.

배포하기

Serverless 프레임워크 덕분에 코드를 Lambda에 배포하는 일은 놀랄 만큼 간단합니다:

sls deploy

단 한 줄의 명령으로 다음 작업들이 모두 자동 처리됩니다:

  • 코드 압축(Zip)
  • zip 파일을 S3에 업로드
  • Lambda에 함수 배포 (환경 변수 및 SNS 트리거 설정 포함)
  • IAM 정책 생성
  • DynamoDB 테이블 생성

배포가 완료된 후에는 버킷에 객체를 생성할 때마다 DynamoDB 테이블에 새 항목이 자동으로 추가됩니다.

의존성(Gem) 관리

배포된 함수에 추가 gem 의존성을 포함하는 것도 어렵지 않습니다. Gemfile을 생성하고 필요한 gem을 추가한 뒤, 다음 명령을 실행하면 됩니다:

bundle install --path vendor/bundle

이렇게 하면 gem들이 로컬 vendor/bundle 디렉터리에 번들링되며, 나머지 코드와 함께 zip 파일로 묶여 함수에 포함됩니다.

다만 한 가지 주의할 점이 있습니다. C 확장(extension) 컴파일이 필요한 gem입니다. 개발 환경과 Lambda 런타임 환경은 대부분 다르기 때문에, AWS 환경에서 정상 동작하도록 확장 모듈을 컴파일하려면 추가 작업이 필요합니다. 다행히 lambci에서 제공하는 Docker 이미지와, 필자가 그 위에 만든 Docker 이미지 덕분에 이 과정도 어렵지 않습니다. 의존성을 올바르게 번들링하고 컴파일하려면 다음과 같이 Docker 이미지를 실행하면 됩니다:

docker run --rm -v $(pwd):/var/task stympy/lambda-ruby2.5

이 컨테이너는 앞서 설명한 bundler 명령을 실행하여 gem을 vendor/bundle에 배치해 줍니다. 이후 deploy 명령으로 생성되는 ZIP 파일에 그대로 포함되므로 별도의 후처리는 필요하지 않습니다.

이제 모든 준비가 끝났습니다. 여러분도 Lambda 환경에서 Ruby를 실행하는 즐거움을 필자만큼 느끼시길 바랍니다. :)