Ruby Lambda 함수를 .zip 파일 아카이브로 배포하기

Ruby Lambda 함수를 .zip 파일 아카이브로 배포하기 (Deploy Ruby Lambda functions with .zip file archives)

AWS Lambda 함수의 코드는 핸들러 코드가 담긴 .rb 파일과, 코드가 의존하는 추가 의존성(gem)으로 구성돼요. 이 함수 코드를 Lambda에 배포하려면 *배포 패키지(deployment package)*를 사용해요. 배포 패키지는 .zip 파일 아카이브이거나 컨테이너 이미지일 수 있어요. Ruby에서 컨테이너 이미지를 쓰는 방법은 Ruby Lambda 함수를 컨테이너 이미지로 배포하기를 참고하세요.

배포 패키지를 .zip 파일 아카이브로 만들려면 명령줄 도구 내장 .zip 유틸리티나 7zip 같은 다른 .zip 유틸리티를 사용하면 돼요. 아래 섹션의 예시는 Linux나 MacOS 환경에서 명령줄 zip 도구를 쓴다고 가정해요. Windows에서 같은 명령을 쓰려면 Windows Subsystem for Linux를 설치해서 Windows와 통합된 Ubuntu와 Bash를 이용할 수 있어요.

Lambda는 POSIX 파일 권한을 사용하므로, .zip 파일 아카이브를 만들기 전에 배포 패키지 폴더에 권한을 설정해야 할 수도 있어요.

아래 섹션의 예시 명령은 의존성을 배포 패키지에 추가하기 위해 Bundler 유틸리티를 사용해요. bundler를 설치하려면 다음 명령을 실행해요.

gem install bundler

섹션

  • Ruby의 의존성
  • 의존성 없는 .zip 배포 패키지 만들기
  • 의존성이 있는 .zip 배포 패키지 만들기
  • 의존성용 Ruby 레이어 만들기
  • 네이티브 라이브러리가 있는 .zip 배포 패키지 만들기
  • .zip 파일로 Ruby Lambda 함수 만들기·업데이트하기

출처: AWS Lambda 개발자 안내서

본문

Ruby의 의존성

Ruby 런타임을 쓰는 Lambda 함수에서 의존성은 어떤 Ruby gem이든 될 수 있어요. .zip 아카이브로 함수를 배포할 때는 이 의존성들을 함수 코드와 함께 .zip 파일에 추가하거나 Lambda 레이어를 사용하면 돼요. 레이어는 추가 코드와 다른 콘텐츠를 담을 수 있는 별도의 .zip 파일이에요. Lambda 레이어에 대해 자세히 알아보려면 레이어로 Lambda 의존성 관리하기를 참고하세요.

Ruby 런타임에는 AWS SDK for Ruby가 포함돼 있어요. 함수가 SDK를 쓴다면 코드에 SDK를 번들하지 않아도 돼요. 다만 의존성을 완전히 제어하거나 SDK의 특정 버전을 쓰려면 함수의 배포 패키지에 추가할 수 있어요.

SDK를 .zip 파일에 포함하거나 Lambda 레이어로 추가할 수 있어요. .zip 파일이나 Lambda 레이어의 의존성은 런타임에 포함된 버전보다 우선해요. 런타임 버전에 포함된 SDK for Ruby 버전을 확인하려면 런타임 포함 SDK 버전을 참고하세요.

AWS 공동 책임 모델(shared responsibility model)에 따라 함수 배포 패키지의 모든 의존성 관리는 여러분 책임이에요. 여기에는 업데이트와 보안 패치 적용도 포함돼요. 함수 배포 패키지의 의존성을 업데이트하려면 먼저 새 .zip 파일을 만들고 Lambda에 업로드하면 돼요. 자세한 내용은 '의존성이 있는 .zip 배포 패키지 만들기'와 '.zip 파일로 Ruby Lambda 함수 만들기·업데이트하기'를 참고하세요.

의존성 없는 .zip 배포 패키지 만들기

함수 코드에 의존성이 없다면 .zip 파일에는 핸들러 코드가 담긴 .rb 파일 하나만 들어가요. 원하는 zip 유틸리티로 .rb 파일이 루트에 오도록 .zip 파일을 만들면 돼요. .rb 파일이 .zip 파일의 루트에 있지 않으면 Lambda가 코드를 실행할 수 없어요.

.zip 파일을 배포해서 새 Lambda 함수를 만들거나 기존 함수를 업데이트하는 방법은 '.zip 파일로 Ruby Lambda 함수 만들기·업데이트하기'를 참고하세요.

의존성이 있는 .zip 배포 패키지 만들기

함수 코드가 추가 Ruby gem에 의존한다면, 이 의존성들을 함수 코드와 함께 .zip 파일에 추가하거나 Lambda 레이어를 사용하면 돼요. 이 섹션의 지침은 의존성들을 .zip 배포 패키지에 포함하는 방법을 보여줘요. 레이어에 의존성을 포함하는 방법은 '의존성용 Ruby 레이어 만들기'를 참고하세요.

함수 코드가 프로젝트 디렉터리에 lambda_function.rb라는 파일로 저장돼 있다고 가정해요. 아래 예시 CLI 명령은 함수 코드와 의존성을 포함하는 my_deployment_package.zip 파일을 만들어요.

배포 패키지를 만들려면

  1. 프로젝트 디렉터리에서 Gemfile을 만들어 의존성을 지정해요.
bundle init
  1. 원하는 텍스트 편집기로 Gemfile을 편집해 함수의 의존성을 지정해요. 예를 들어 TZInfo gem을 쓰려면 Gemfile을 다음과 같이 편집해요.
source "https://rubygems.org"
gem "tzinfo"
  1. 다음 명령으로 Gemfile에 지정된 gem을 프로젝트 디렉터리에 설치해요. 이 명령은 vendor/bundle을 gem 설치의 기본 경로로 설정해요.
bundle config set --local path 'vendor/bundle' && bundle install

다음과 비슷한 출력이 보여요.

Fetching gem metadata from https://rubygems.org/...........
Resolving dependencies...
Using bundler 2.4.13
Fetching tzinfo 2.0.6
Installing tzinfo 2.0.6 ...

참고 나중에 다시 gem을 전역으로 설치하려면 다음 명령을 실행해요.

bundle config set --local system 'true'
  1. 핸들러 코드가 담긴 lambda_function.rb 파일과 이전 단계에서 설치한 의존성을 포함하는 .zip 파일 아카이브를 만들어요.
zip -r my_deployment_package.zip lambda_function.rb vendor

다음과 비슷한 출력이 보여요.

adding: lambda_function.rb (deflated 37%)
adding: vendor/ (stored 0%)
adding: vendor/bundle/ (stored 0%)
adding: vendor/bundle/ruby/ (stored 0%)
adding: vendor/bundle/ruby/3.2.0/ (stored 0%)
adding: vendor/bundle/ruby/3.2.0/build_info/ (stored 0%)
adding: vendor/bundle/ruby/3.2.0/cache/ (stored 0%)
adding: vendor/bundle/ruby/3.2.0/cache/aws-eventstream-1.0.1.gem (deflated 36%)
...

의존성용 Ruby 레이어 만들기

Ruby 의존성을 Lambda 레이어로 패키징하는 방법은 Ruby Lambda 함수용 레이어 작업하기를 참고하세요.

네이티브 라이브러리가 있는 .zip 배포 패키지 만들기

nokogiri, nio4r, mysql 같은 많은 흔한 Ruby gem에는 C로 쓰인 네이티브 확장이 포함돼 있어요. C 코드가 포함된 라이브러리를 배포 패키지에 추가할 때는 Lambda 실행 환경과 호환되도록 패키지를 올바르게 빌드해야 해요.

프로덕션 애플리케이션에서는 AWS Serverless Application Model(AWS SAM)으로 코드를 빌드하고 배포하는 걸 권장해요. AWS SAM에서 sam build --use-container 옵션을 사용해 Lambda와 유사한 Docker 컨테이너 안에서 함수를 빌드해요. AWS SAM으로 함수 코드를 배포하는 방법은 AWS SAM Developer Guide의 Building applications을 참고하세요.

AWS SAM 없이 네이티브 확장이 있는 gem이 담긴 .zip 배포 패키지를 만들려면, 대신 컨테이너를 사용해 Lambda Ruby 런타임 환경과 같은 환경에서 의존성을 번들할 수 있어요. 이 단계를 완료하려면 빌드 머신에 Docker가 설치돼 있어야 해요. Docker 설치 방법은 Install Docker Engine을 참고하세요.

Docker 컨테이너에서 .zip 배포 패키지 만들기

  1. 로컬 빌드 머신에 컨테이너를 저장할 폴더를 만들어요. 그 폴더 안에 dockerfile이라는 파일을 만들고 다음 코드를 붙여넣어요.
FROM public.ecr.aws/sam/build-ruby3.2:latest-x86_64
RUN gem update bundler
CMD "/bin/bash"
  1. dockerfile을 만든 폴더 안에서 다음 명령으로 Docker 컨테이너를 만들어요.
docker build -t awsruby32 .
  1. 핸들러 코드가 담긴 .rb 파일과 함수의 의존성을 지정한 Gemfile이 있는 프로젝트 디렉터리로 이동해요. 그 디렉터리 안에서 다음 명령으로 Lambda Ruby 컨테이너를 시작해요.

Linux/MacOS:

docker run --rm -it -v $PWD:/var/task -w /var/task awsruby32

참고 MacOS에서는 요청한 이미지의 플랫폼이 감지된 호스트 플랫폼과 일치하지 않는다는 경고가 보일 수 있어요. 이 경고는 무시해도 돼요.

Windows PowerShell:

docker run --rm -it -v ${pwd}:/var/task -w /var/task awsruby32

컨테이너가 시작되면 bash 프롬프트가 보여요.

bash-4.2#
  1. Gemfile에 지정된 gem을 로컬 vendor/bundle 디렉터리에 설치하도록 bundle 유틸리티를 구성하고 의존성을 설치해요.
bash-4.2# bundle config set --local path 'vendor/bundle' && bundle install
  1. 함수 코드와 의존성으로 .zip 배포 패키지를 만들어요. 이 예시에서 핸들러 코드가 담긴 파일 이름은 lambda_function.rb예요.
bash-4.2# zip -r my_deployment_package.zip lambda_function.rb vendor
  1. 컨테이너를 종료하고 로컬 프로젝트 디렉터리로 돌아와요.
bash-4.2# exit

이제 이 .zip 파일 배포 패키지로 Lambda 함수를 만들거나 업데이트할 수 있어요. '.zip 파일로 Ruby Lambda 함수 만들기·업데이트하기'를 참고하세요.

.zip 파일로 Ruby Lambda 함수 만들기·업데이트하기

.zip 배포 패키지를 만들었다면 그걸로 새 Lambda 함수를 만들거나 기존 함수를 업데이트할 수 있어요. .zip 패키지는 Lambda 콘솔, AWS Command Line Interface(CLI), Lambda API로 배포할 수 있어요. AWS Serverless Application Model(AWS SAM)과 CloudFormation으로도 Lambda 함수를 만들고 업데이트할 수 있어요.

Lambda의 .zip 배포 패키지 최대 크기는 250MB(압축 해제 기준)예요. 이 제한은 업로드하는 모든 파일의 합산 크기에 적용되며, Lambda 레이어도 포함해요.

Lambda 런타임은 배포 패키지의 파일을 읽을 권한이 필요해요. Linux 권한 8진수 표기에서 Lambda는 비실행 파일에 644(rw-r--r--), 디렉터리와 실행 파일에 755(rwxr-xr-x) 권한이 필요해요.

Linux와 MacOS에서는 chmod 명령으로 배포 패키지의 파일·디렉터리 권한을 바꿔요. 예를 들어 비실행 파일에 올바른 권한을 주려면 다음 명령을 실행해요.

chmod 644 <filepath>

Windows에서 파일 권한을 바꾸려면 Microsoft Windows 설명서의 Set, View, Change, or Remove Permissions on an Object를 참고하세요.

참고 배포 패키지의 디렉터리에 Lambda가 접근하는 데 필요한 권한을 주지 않으면, Lambda는 해당 디렉터리 권한을 755(rwxr-xr-x)로 설정해요.

콘솔로 .zip 파일로 함수 만들기·업데이트하기

새 함수를 만들려면 먼저 콘솔에서 함수를 만든 다음 .zip 아카이브를 업로드해야 해요. 기존 함수를 업데이트하려면 함수 페이지를 연 다음 같은 절차로 업데이트된 .zip 파일을 추가하면 돼요.

.zip 파일이 50MB 미만이면 로컬 머신에서 직접 파일을 업로드해 함수를 만들거나 업데이트할 수 있어요. 50MB보다 큰 .zip 파일은 먼저 패키지를 Amazon S3 버킷에 업로드해야 해요. AWS Management Console로 파일을 Amazon S3 버킷에 업로드하는 방법은 Amazon S3 시작하기를 참고하고, AWS CLI로 업로드하는 방법은 AWS CLI User Guide의 Move objects를 참고하세요.

참고 기존 함수의 배포 패키지 유형(.zip 또는 컨테이너 이미지)은 바꿀 수 없어요. 예를 들어 컨테이너 이미지 함수를 .zip 파일 아카이브로 변환할 수 없어요. 새 함수를 만들어야 해요.

새 함수를 만들려면 (콘솔)

  1. Lambda 콘솔의 Functions 페이지를 열고 Create Function을 선택해요.
  2. Author from scratch를 선택해요.
  3. Basic information에서 다음을 수행해요. Function name에 함수 이름을 입력하고, Runtime에서 사용할 런타임을 선택해요. (선택 사항) Architecture에서 함수의 명령어 집합 아키텍처를 선택해요. 기본 아키텍처는 x86_64예요. 함수의 .zip 배포 패키지가 선택한 아키텍처와 호환되는지 확인하세요.
  4. (선택 사항) Permissions에서 Change default execution role을 펼쳐 새 Execution role을 만들거나 기존 역할을 사용할 수 있어요.
  5. Create function을 선택해요. Lambda가 선택한 런타임으로 기본 'Hello world' 함수를 만들어요.

로컬 머신에서 .zip 아카이브 업로드하기 (콘솔)

  1. Lambda 콘솔의 Functions 페이지에서 .zip 파일을 업로드할 함수를 선택해요.
  2. Code 탭을 선택해요.
  3. Code source 창에서 Upload from을 선택해요.
  4. .zip file을 선택해요.
  5. .zip 파일을 업로드하려면 다음을 수행해요. Upload를 선택하고 파일 선택기에서 .zip 파일을 고른 다음, Open, Save를 선택해요.

Amazon S3 버킷에서 .zip 아카이브 업로드하기 (콘솔)

  1. Lambda 콘솔의 Functions 페이지에서 새 .zip 파일을 업로드할 함수를 선택해요.
  2. Code 탭을 선택해요.
  3. Code source 창에서 Upload from을 선택해요.
  4. Amazon S3 location을 선택해요.
  5. .zip 파일의 Amazon S3 링크 URL을 붙여넣고 Save를 선택해요.

콘솔 코드 편집기로 .zip 파일 함수 업데이트하기

.zip 배포 패키지를 쓰는 일부 함수에서는 Lambda 콘솔의 내장 코드 편집기로 함수 코드를 직접 업데이트할 수 있어요. 이 기능을 쓰려면 함수가 다음 조건을 충족해야 해요.

  • 해석형 언어 런타임(Python, Node.js, Ruby) 중 하나를 사용할 것
  • 함수의 배포 패키지가 50MB(압축 해제 기준) 미만일 것

컨테이너 이미지 배포 패키지를 쓰는 함수의 코드는 콘솔에서 직접 편집할 수 없어요.

콘솔 코드 편집기로 함수 코드 업데이트하기

  1. Lambda 콘솔의 Functions 페이지를 열고 함수를 선택해요.
  2. Code 탭을 선택해요.
  3. Code source 창에서 소스 코드 파일을 선택하고 통합 코드 편집기에서 편집해요.
  4. DEPLOY 섹션에서 Deploy를 선택해 함수 코드를 업데이트해요.

AWS CLI로 .zip 파일로 함수 만들기·업데이트하기

AWS CLI로 .zip 파일을 사용해 새 함수를 만들거나 기존 함수를 업데이트할 수 있어요. create-function과 update-function-code 명령으로 .zip 패키지를 배포해요. .zip 파일이 50MB 미만이면 로컬 빌드 머신의 파일 위치에서 .zip 패키지를 업로드할 수 있어요. 더 큰 파일은 Amazon S3 버킷에서 .zip 패키지를 업로드해야 해요. AWS CLI로 파일을 Amazon S3 버킷에 업로드하는 방법은 AWS CLI User Guide의 Move objects를 참고하세요.

참고 AWS CLI로 Amazon S3 버킷에서 .zip 파일을 업로드할 때는 버킷이 함수와 같은 AWS 리전에 있어야 해요.

AWS CLI로 .zip 파일로 새 함수를 만들려면 다음을 지정해야 해요.

  • 함수 이름(--function-name)
  • 함수의 런타임(--runtime)
  • 함수 실행 역할(execution role)의 Amazon Resource Name(ARN)(--role)
  • 함수 코드의 핸들러 메서드 이름(--handler)

또한 .zip 파일의 위치를 지정해야 해요. .zip 파일이 로컬 빌드 머신의 폴더에 있다면 --zip-file 옵션으로 파일 경로를 지정해요.

aws lambda create-function --function-name myFunction \
--runtime ruby3.2 --handler lambda_function.lambda_handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--zip-file fileb://myFunction.zip

Amazon S3 버킷의 .zip 파일 위치를 지정하려면 다음 예시 명령처럼 --code 옵션을 사용해요. 버전 관리되는 객체에서만 S3ObjectVersion 파라미터를 쓰면 돼요.

aws lambda create-function --function-name myFunction \
--runtime ruby3.2 --handler lambda_function.lambda_handler \
--role arn:aws:iam::111122223333:role/service-role/my-lambda-role \
--code S3Bucket=amzn-s3-demo-bucket,S3Key=myFileName.zip,S3ObjectVersion=myObjectVersion

CLI로 기존 함수를 업데이트하려면 --function-name 파라미터로 함수 이름을 지정해요. 함수 코드 업데이트에 쓸 .zip 파일의 위치도 지정해야 해요. .zip 파일이 로컬 빌드 머신의 폴더에 있다면 --zip-file 옵션으로 파일 경로를 지정해요.

aws lambda update-function-code --function-name myFunction \
--zip-file fileb://myFunction.zip

Amazon S3 버킷의 .zip 파일 위치를 지정하려면 다음 예시 명령처럼 --s3-bucket과 --s3-key 옵션을 사용해요. 버전 관리되는 객체에서만 --s3-object-version 파라미터를 쓰면 돼요.

aws lambda update-function-code --function-name myFunction \
--s3-bucket amzn-s3-demo-bucket --s3-key myFileName.zip --s3-object-version myObjectVersion

Lambda API로 .zip 파일로 함수 만들기·업데이트하기

.zip 파일 아카이브로 함수를 만들고 업데이트하려면 다음 API 연산을 사용해요.

AWS SAM으로 .zip 파일로 함수 만들기·업데이트하기

AWS Serverless Application Model(AWS SAM)은 AWS에서 서버리스 애플리케이션을 만들고 실행하는 과정을 간소화하는 툴킷이에요. 애플리케이션의 리소스를 YAML이나 JSON 템플릿으로 정의하고, AWS SAM CLI로 애플리케이션을 빌드·패키징·배포해요. AWS SAM 템플릿에서 Lambda 함수를 빌드하면 AWS SAM이 함수 코드와 지정한 의존성을 포함한 .zip 배포 패키지나 컨테이너 이미지를 자동으로 만들어요. AWS SAM으로 Lambda 함수를 빌드하고 배포하는 방법은 AWS Serverless Application Model Developer Guide의 Getting started with AWS SAM을 참고하세요.

AWS SAM으로 기존 .zip 파일 아카이브를 사용해 Lambda 함수를 만들 수도 있어요. AWS SAM으로 Lambda 함수를 만들려면 .zip 파일을 Amazon S3 버킷이나 빌드 머신의 로컬 폴더에 저장하면 돼요. AWS CLI로 파일을 Amazon S3 버킷에 업로드하는 방법은 AWS CLI User Guide의 Move objects를 참고하세요.

AWS SAM 템플릿에서 AWS::Serverless::Function 리소스가 Lambda 함수를 나타내요. 이 리소스에서 다음 속성을 설정해 .zip 파일 아카이브로 함수를 만들어요.

  • PackageType — Zip으로 설정
  • CodeUri — 함수 코드의 Amazon S3 URI, 로컬 폴더 경로, 또는 FunctionCode 객체로 설정
  • Runtime — 선택한 런타임으로 설정

AWS SAM에서는 .zip 파일이 50MB보다 커도 먼저 Amazon S3 버킷에 업로드할 필요가 없어요. AWS SAM은 로컬 빌드 머신의 위치에서 최대 허용 크기인 250MB(압축 해제 기준)까지 .zip 패키지를 업로드할 수 있어요.

AWS SAM에서 .zip 파일로 함수를 배포하는 방법은 AWS SAM Developer Guide의 AWS::Serverless::Function을 참고하세요.

CloudFormation으로 .zip 파일로 함수 만들기·업데이트하기

CloudFormation으로 .zip 파일 아카이브를 사용해 Lambda 함수를 만들 수 있어요. .zip 파일로 Lambda 함수를 만들려면 먼저 파일을 Amazon S3 버킷에 업로드해야 해요. AWS CLI로 파일을 Amazon S3 버킷에 업로드하는 방법은 AWS CLI User Guide의 Move objects를 참고하세요.

CloudFormation 템플릿에서 AWS::Lambda::Function 리소스가 Lambda 함수를 나타내요. 이 리소스에서 다음 속성을 설정해 .zip 파일 아카이브로 함수를 만들어요.

  • PackageType — Zip으로 설정
  • Code — S3Bucket과 S3Key 필드에 Amazon S3 버킷 이름과 .zip 파일 이름을 입력
  • Runtime — 선택한 런타임으로 설정

CloudFormation이 생성하는 .zip 파일은 4MB를 넘을 수 없어요. CloudFormation에서 .zip 파일로 함수를 배포하는 자세한 방법은 CloudFormation User Guide의 AWS::Lambda::Function을 참고하세요.

더 알아보기 (Learn more)