Computer >> 컴퓨터 >  >> 프로그램 작성 >> Ruby

AWS Lamba에서 Ruby 사용

어제 AWS Lambda에 대한 Ruby 지원이 발표되었을 때, 나는 그것에 대해 너무 흥분해서 바로 시도해야 했습니다. 우리는 Honeybadger에서 잠시 동안 Lambda를 사용해 왔으며 Ruby에서 함수를 작성할 수 있기를 간절히 바랐습니다. 몇 시간 동안 새로운 Ruby 지원을 사용해 본 결과 Node, Go 및 Python에 더 적은 시간을 할애하게 될 것이라고 확신합니다. :)

간단한 예

AWS의 발표 블로그 게시물을 통해 Ruby on Lambda를 빠르게 시작하고 실행할 수 있지만, 서버리스 프레임워크를 사용하여 Ruby Lambda 기능을 배포하는 예를 공유하고자 합니다. 이 프레임워크가 Lambda 함수 작업의 성가심을 제거하는 환상적인 작업을 수행한다는 것을 알았습니다. 프레임워크의 현재 버전(1.34)에는 아직 Ruby 프로젝트를 위한 템플릿 생성이 준비되어 있지 않지만(이 포스트를 작성하기 시작하기 몇 시간 전에 PR이 병합되었습니다), 생성기 없이 시작하는 것은 충분히 쉽습니다. 다음은 이 연습에 사용할 샘플 구성 파일입니다. 이 파일은 생성될 때 S3 객체와 연결된 메타데이터로 DynamoDB 테이블을 채우는 간단한 기능입니다.

구성의 리소스 섹션에서는 새 DynamoDB 테이블이 자동으로 생성되고 새로 생성된 테이블의 이름은 코드에서 사용할 함수의 환경 변수에 배치됩니다. 이 기능은 이전에 생성된 SNS 주제에 대한 SNS 이벤트에 의해 트리거됩니다. 해당 SNS 주제는 수동으로 생성된 S3 버킷의 PUTEvents에 대한 알림을 수신합니다.

다음은 Ruby 코드입니다.

코드는 많은 작업을 수행하지 않습니다. SNS 이벤트를 수신하고, 생성된 각 S3객체에 대한 정보를 얻기 위해 SNS 메시지의 레코드를 반복하고, S3 객체에 대해 HEAD 요청을 수행하여 메타데이터를 가져온 다음 (생성 또는 업데이트) DynamoDB 테이블의 항목. 이 함수에 대한 유일한 종속성은 런타임 환경에 포함된 AWS SDK이므로 Gemfile에 대해 걱정할 필요조차 없습니다. 그러나 파티에 가져오고 싶은 추가 보석이 있다면 쉽게 할 수 있습니다. 배포에 대해 이야기하면서 추가 gem을 포함하는 방법을 살펴보겠습니다.

배포

서버리스 프레임워크 덕분에 이 코드를 현재 상태에서 Lambda로 가져오는 것이 매우 쉽습니다.

sls deploy

이 명령 하나로 이 모든 작업을 수행할 수 있습니다.

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

배포가 완료되면 버킷에 객체를 생성하면 DynamoDB 테이블에 새 항목이 추가됩니다.

종속성

배포된 기능에 포함된 추가 gem 종속성을 얻는 것은 쉽습니다. Gemfile을 생성하고 번들할 gem을 추가한 다음 bundle install --path vendor/bundle를 실행하기만 하면 됩니다. . 이렇게 하면 gem이 로컬 디렉토리에 번들되고 나머지 코드와 함께 압축되어 함수에 추가됩니다.

그러나 종속성에 대한 한 가지 주의 사항은 일종의 C 확장을 컴파일해야 하는 gem입니다. 개발 환경은 Lambda 런타임 환경과 다를 가능성이 높기 때문에 AWS에서 작동하도록 이러한 확장을 컴파일하려면 조금 더 작업해야 합니다. 그래도 lambci Docker 이미지와 Ruby 이미지 위에 생성된 Docker 이미지 덕분에 , 어렵지 않습니다. 종속 항목을 번들로 묶고 올바르게 컴파일하려면 다음과 같이 내 도커 이미지를 실행하면 됩니다.

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

위에서 언급한 번들러 명령줄을 실행하기만 하면 보석이 vendor/bundle에 배치됩니다. , deploy에 의해 생성된 ZIP 파일에 포함될 준비가 되었습니다. 명령.

그것으로 당신은 경주를 떠나게 됩니다. 내가 가진 만큼 Ruby inLambda 실행을 즐기시기 바랍니다. :)