AWS Lambda를 사용하면 오버헤드를 최소화하면서 확장 가능한 기능을 설정할 수 있습니다. 전체 Ruby on Rails 앱을 작성, 호스팅 및 유지 관리하는 대신 Lambda 함수를 사용하여 개별 이벤트에 독립적으로 응답할 수 있습니다. 이 기사에서는 AWS 초보자부터 자신의 Lambda 함수로 Ruby를 작성하는 방법을 소개합니다.
Lambda를 사용하면 서버를 관리하지 않고도 이벤트에 대한 응답으로 코드를 실행할 수 있습니다. 이 이벤트 기반 아키텍처는 유휴 상태가 아닌 작동하는 동안에만 코드에 대해 비용을 지불하도록 합니다. Lambda는 S3 버킷의 파일 삭제와 같은 AWS 에코시스템 내 이벤트에 응답하는 데 가장 일반적으로 사용되지만 AWS API Gateway와 함께 API 역할을 하도록 구성할 수도 있습니다.
Lambda를 사용하여 Cron 작업과 같은 시간을 기반으로 하거나 이벤트에 대한 응답으로 작업을 자동화할 수 있습니다. 이는 종종 DynamoDB와 같은 다른 AWS 서비스 또는 확장 가능한 API와 함께 데이터 처리로 확장될 수 있습니다. 예를 들어 Amazon 설명서의 다음 다이어그램은 모바일 클라이언트가 데이터베이스에서 일부 CRUD 작업을 수행하기 위해 HTTP 요청을 하는 간단한 아키텍처를 보여줍니다. API Gateway는 요청을 해당 Lambda 함수로 라우팅하고(Rails가 HTTP 요청을 컨트롤러로 라우팅하는 것과 유사) 비즈니스 로직을 수행하고 AWS DynamoDB와 통신하여 요청을 이행합니다.
우리의 코드는 컨테이너에서 실행되기 때문에 Amazon의 인프라는 사용되지 않을 때 함수를 일종의 절전 모드로 자동 전환합니다. 새 요청이 들어오면 컨테이너는 콜드 상태에서 시작해야 하므로 실행 시간이 최대 2000ms까지 늘어날 수 있습니다. 이는 응답 시간 면에서 서비스 품질을 저하시킬 뿐만 아니라 비용도 발생합니다. 이러한 이유로 사용자 이메일을 보내거나 UI 이벤트에 응답하는 것과 같이 시간에 민감한 작업에 Lambda를 사용하면 병목 현상이 발생할 수 있습니다. 기능을 '따뜻하게' 유지하기 위해 주기적으로 요청하도록 AWS CloudWatch를 예약하여 이 문제를 완화할 수 있지만 호스팅 비용이 증가합니다.
AWS Lambda를 사용하는 이유
Amazon Web Services(AWS)는 세계에서 가장 인기 있는 클라우드 컴퓨팅 서비스입니다. 독립 개발자가 사용할 수 있을 만큼 간단하지만 일부 세계 최대 기업의 인프라 역할을 할 수 있을 만큼 강력하고 확장 가능합니다.
AWS Lambda는 이벤트에 대한 응답으로만 코드를 실행할 수 있는 '서버리스 컴퓨팅 서비스' 역할을 하는 Amazon의 그러한 제품 중 하나입니다. 이렇게 하면 오버헤드가 줄어들고 전체 서버를 호스팅하거나 전체 앱을 빌드하지 않고도 API 호출과 같은 항목에 프로그래밍 방식으로 대응할 수 있습니다.
올바른 사용 사례의 경우 이 서버리스 아키텍처는 상당한 비용을 절약할 수 있습니다. 가격은 요청당 비용과 컴퓨팅 시간 기간당 비용으로 계산됩니다. 특정 월에 처음 100만 개 요청 이후에는 + 요청 100만 개당 0.20 USD의 가격이 책정됩니다. 함수가 사용하는 계산 시간의 GB-초마다 $0.0000166667입니다. 상상할 수 있듯이 이 요금 기반 가격은 동일한 속도로 무한 확장 옵션을 유지하면서 Lambda에서 소규모 서비스를 실행하는 것이 매우 저렴합니다.
Ruby 개발자는 이 클라우드 서비스를 API 호출이나 다른 AWS 이벤트에 반응하는 상태 비저장 방식으로 사용함으로써 이점을 얻을 수 있습니다.
평가판 AWS 계정 설정
AWS는 AWS Lambda를 통해 100만 개의 무료 요청과 월 최대 320만초의 컴퓨팅 시간을 포함하는 다소 관대한 프리 티어를 제공합니다! 이미 계정이 있는 경우 이 단계를 건너뛸 수 있지만 설정은 매우 간단합니다.
여기에서 가입하고 정보를 입력하여 시작하십시오!
계정 유형 및 연락처 정보를 포함한 추가 정보를 입력하라는 메시지가 표시되며 프리 티어 이외의 사용을 처리하려면 신용/직불 카드 정보를 입력해야 합니다. Lambda의 간단한 사용은 프리 티어에 포함되어 있지만 우발적인 초과가 걱정된다면 예산을 설정하여 사용량을 제어하고 예기치 않은 청구를 방지할 수 있습니다.
Ruby로 Lambda 함수 생성
등록한 후 제품 위로 마우스를 가져갑니다. , 계산 , 람다를 선택합니다. .
Lambda 콘솔에 있으면('시작하기'를 눌러야 할 수 있음) "함수 생성"을 위한 주황색 버튼이 있는 빈 함수 목록이 표시되어야 합니다. 짐작하셨겠지만 주황색 "함수 생성" 버튼을 누르겠습니다.
그런 다음 Ruby용 템플릿 기능이 아직 없으며 처음부터 작업하는 것이 가장 좋은 학습 방법이므로 "처음부터 작성"을 선택합니다.
함수의 이름을 적절하게 지정하고 작업할 Ruby 버전을 선택해야 합니다. 저는 유명한 프로그래밍 문제를 보고 FizzBuzz라고 불렀습니다.
lambda_function.rb
를 두 번 클릭해야 할 수도 있습니다. 탐색 창에서 파일을 클릭하여 소스 코드를 표시합니다.
이 함수는 미리 작성되어 제공되며 제목은 lambda_handler
입니다. . 그대로, 함수가 호출되면 아래에서 볼 수 있듯이 "Hello From Lambda!"라는 텍스트와 함께 200 응답을 반환합니다.
Lambda 함수에 대한 테스트 트리거 사용
서론에서 논의한 바와 같이 Lambda 함수는 다양한 방식으로 트리거될 수 있습니다. 가장 일반적인 것 중 하나는 API 호출을 통한 것입니다. 그러나 이를 위해서는 AWS API Gateway를 설정해야 하며 이는 이 문서의 범위를 약간 벗어납니다. API Gateway는 Lambda와 훌륭하게 작동하여 구성이 거의 없고 확장성이 무한한 API를 생성합니다.
다행히도 함수 콘솔을 통해 API 호출을 시뮬레이션하는 것은 그리 어렵지 않으며 테스트 이벤트가 이미 대기 중입니다. .
기능 개요 아래에는 현재 "코드"가 선택된 도구 모음이 있습니다. 마지막 스크린샷에서 볼 수 있듯이 "코드" 바로 옆에는 "테스트라는 탭이 있습니다. ". 계속해서 "테스트"를 선택하면 코드 소스 위치에 테스트 콘솔이 표시되는 것을 볼 수 있습니다.
사전 구성된 테스트 이벤트는 event
로 Lambda 함수에 전송되는 JSON 객체입니다. 함수가 매개변수로 사용하는 객체입니다. API Gateway를 통해 엔드포인트를 호출하는 경우 요청 본문이 됩니다.
자리 표시자 Lambda 함수는 이벤트를 읽지 않으므로 본문으로 보내는 내용은 그다지 중요하지 않습니다. 따라서 주황색 "Invoke " 버튼.
함수를 올바르게 설정했다면 "Execution Succeeded"라는 제목의 녹색 상자가 나타나야 합니다. 이 상자를 확장하여 함수의 JSON 응답을 볼 수 있습니다.
FizzBuzz 작성
이제 Lambda 함수가 올바르게 작동하는지 확인했으므로 자체 사용자 지정 Ruby 코드로 사용자 지정할 수 있습니다. 이 예에서는 Lambda 함수가 유명한 FizzBuzz 문제에 응답하도록 합니다. FizzBuzz는 인터뷰에서 가장 좋아하는 프로그램이며 프롬프트는 다음과 같습니다.
<블록 인용>1부터 50까지의 숫자를 출력하는 프로그램을 작성하세요. 그러나 3의 배수는 숫자 대신 "Fizz"를 출력하고 5의 배수는 "Buzz"를 출력하세요. 3과 5의 배수인 경우 "FizzBuzz"를 인쇄하십시오.
Lambda 함수의 코드를 FizzBuzz 솔루션으로 교체 -
require 'json'
def lambda_handler(event:, context:)
max_val = event['max_val']
textResponse = ''
1.upto(max_val) do |i|
if i % 5 == 0 and i % 3 == 0
textResponse += "FizzBuzz"
elsif i % 5 == 0
textResponse += "Buzz"
elsif i % 3 == 0
textResponse += "Fizz"
else
textResponse += i.to_s
end
end
{ statusCode: 200, body: JSON.generate(textResponse) }
end
이것은 일반적인 FizzBuzz에 약간의 스핀입니다. 50까지 반복하는 대신 이벤트와 함께 전송된 번호를 반복합니다. 이벤트 객체는 사전처럼 전달되므로 event[max_val]
max_val
의 값을 반환합니다. 열쇠. 마지막으로 FizzBuzz 솔루션을 인쇄하는 대신 JSON 개체로 반환하는 String에 추가하기만 하면 됩니다.
다음으로, 주황색 "배포" 버튼을 눌러 Lambda 함수를 새 코드로 업데이트하는지 확인 .
솔루션을 작성하고 배포한 후 테스트 콘솔로 다시 이동합니다. max_val
만 전달하도록 테스트 이벤트를 변경합니다. 키/값 쌍. 다음과 같이 표시되어야 합니다.
JSON은 단순히
{
"max_val": 70
}
마지막으로 "Invoke"를 눌러 테스트를 실행하십시오! 결과를 확장하여 함수가 입력을 읽고 FizzBuzz 문제의 결과를 반환했음을 표시할 수 있습니다.
더 쉬운 개발
웹 콘솔에서 작업하는 것은 학습 목적으로 편리하지만 그것에 국한되면 악몽이 될 것입니다. AWS Lambda로 개발하는 가장 인기 있는 방법 중 하나는 CLI(Command Line Interface)를 사용하는 것입니다.
IAM 역할을 통해 올바른 권한을 생성한 후 머신에 CLI를 설치하고 자격 증명으로 구성합니다. 그런 다음 Lambda CLI를 사용하여 로컬에서(선택한 IDE에서) 개발할 때 함수를 테스트하고 명령줄을 통해 변경 사항을 배포할 수 있습니다.
또 다른 인기 있는 개발 방법은 Serverless와 같은 프레임워크를 사용하는 것입니다. 서버리스는 기능에 필요한 API 게이트웨이 설정을 포함하여 AWS가 겪고 있는 성가신 구성의 대부분을 처리합니다. 또한 서버리스는 로깅을 향상하고 Ruby Gem 관리를 더 쉽게 하며 CI/CD 구성을 허용하므로 파이프라인을 기반으로 리포지토리에서 자동으로 배포할 수 있습니다.
Ruby Gems를 포함하여 Serverless 또는 유사한 프레임워크를 사용하지 않고 몇 가지 문제를 건너뛰어야 합니다. 폴더를 포함하도록 기능을 확장한 다음 .bundle/config
를 생성해야 합니다. 설치한 gem을 어디에 둘 것인지 번들러에게 알려주는 다음 초기화 코드가 있는 루트 디렉토리의 파일:
---
BUNDLE_PATH: "vendor/bundle"
그런 다음 CLI를 사용하여 bundle add
할 수 있습니다. 필요한 보석 및 require
코드에 직접 입력하세요.
AWS Lambda의 제한 사항
축하합니다. Ruby에서 첫 번째 AWS Lambda 함수를 작성했습니다! 이전에는 Ruby로 API를 실행할 수 있는 유일한 솔루션은 종종 전체 Rails 앱을 만드는 것이었습니다. 이제 전체 애플리케이션과 함께 제공되는 모든 팽창을 건너뛰고 한 번에 하나씩 끝점을 만들 수 있습니다. Lambda는 마이크로초 단위로 요금을 청구하므로 빠른 솔루션의 경우 매우 저렴할 수 있습니다. 또한 이 클라우드 제품을 활용하면 저렴한 비용으로 운영할 수 있지만 여전히 엄청나게 빠르게 확장할 수 있습니다. AWS는 Netflix가 일정한 최대 용량 서버 대역폭에 대한 비용을 지불하지 않고 피크 시간에 작동하는 이유입니다.
모든 성공에도 불구하고 AWS Lambda는 포괄적인 솔루션이 아닙니다. 자체적으로 API로 작동하지 않으며 상태 기능이 제한됩니다. Lambda 함수는 실행하는 데 15분 이상 걸릴 수 없으며 메모리는 6GB로 제한됩니다. 또한 별도의 환경에서 전체 인프라를 복제해야 하는 경우가 많기 때문에 Lambda 함수를 테스트하는 것도 약간의 도전입니다.
연중무휴로 실행할 필요가 없는 앱이나 기능이 있는 경우 Lambda가 할 수 있습니다 잘 맞는다. 함수가 일종의 상태를 유지하거나 AWS 에코시스템 외부에서 데이터를 업데이트해야 하는 경우 Lambda는 적합하지 않습니다. 또한 Lambda는 기본적으로 1,000개의 동시 연결로 설정되어 있으므로 지속적으로 이보다 더 많이 사용하는 애플리케이션은 Lambda에서 매우 신뢰할 수 없습니다. 기본적으로 Lambda는 지속 상태가 필요하지 않은 단기 이벤트 기반 자동화 작업에 가장 잘 사용됩니다.
Lambda 함수는 특히 여러분과 같은 Ruby 개발자에게 강력한 도구가 될 수 있습니다.