컨테이너 이미지로 Ruby Lambda 함수 배포
Ruby Lambda 함수의 컨테이너 이미지를 빌드하는 세 가지 방법이 있습니다.
-
AWS 기본 이미지에는 언어 런타임, Lambda와 함수 코드 간의 상호 작용을 관리하는 런타임 인터페이스 클라이언트 및 로컬 테스트를 위한 런타임 인터페이스 에뮬레이터가 미리 로드되어 있습니다.
-
AWS OS 전용 기본 이미지
는 Amazon Linux 배포판 및 런타임 인터페이스 에뮬레이터 를 포함합니다. 이러한 이미지는 일반적으로 Go 및 Rust와 같은 컴파일된 언어의 컨테이너 이미지와 Lambda가 기본 이미지를 제공하지 않는 언어 또는 언어 버전(예: Node.js 19)의 컨테이너 이미지를 생성하는 데 사용됩니다. OS 전용 기본 이미지를 사용하여 사용자 지정 런타임을 구현할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 Ruby용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다. -
Alpine Linux, Debian 등의 다른 컨테이너 레지스트리의 대체 기본 이미지를 사용할 수 있습니다. 조직에서 생성한 사용자 지정 이미지를 사용할 수도 있습니다. 이미지가 Lambda와 호환되도록 하려면 Ruby용 런타임 인터페이스 클라이언트를 이미지에 포함해야 합니다.
작은 정보
Lambda 컨테이너 함수가 활성 상태가 되는 데 걸리는 시간을 줄이려면 Docker 설명서의 다단계 빌드 사용
이 페이지에서는 Lambda용 컨테이너 이미지를 빌드, 테스트 및 배포하는 방법을 설명합니다.
AWSRuby용 기본 이미지
AWS는 Ruby에 대한 다음과 같은 기본 이미지를 제공합니다.
태그 | 런타임 | 운영 체제 | Dockerfile | 사용 중단 |
---|---|---|---|---|
3.3 |
Ruby 3.3 | Amazon Linux 2023 | GitHub의 Ruby 3.3용 Dockerfile |
예약되지 않음 |
3.2 |
Ruby 3.2 | Amazon Linux 2 | GitHub의 Ruby 3.2용 Dockerfile |
예약되지 않음 |
Amazon ECR 리포지토리: gallery.ecr.aws/lambda/ruby
Ruby용 AWS 기본 이미지 사용
이 섹션의 단계를 완료하려면 다음이 필요합니다.
-
Ruby
Ruby용 컨테이너 이미지 생성
-
프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.
mkdir example cd example
-
Gemfile
라는 파일을 새로 생성합니다. 여기에 애플리케이션의 필수 RubyGems 패키지를 나열합니다. AWS SDK for Ruby는 RubyGems에서 사용할 수 있습니다. 설치할 특정 AWS 서비스 gem을 선택해야 합니다. 예를 들어, Lambda용 Ruby gem을 사용하려면 Gemfile이 다음과 같아야 합니다. source 'https://rubygems.org' gem 'aws-sdk-lambda'
또는 aws-sdk
gem에는 사용 가능한 모든 AWS 서비스 gem이 포함되어 있습니다. 이 gem은 매우 크므로 많은 AWS 서비스에 의존하는 경우에만 사용하는 것이 좋습니다. -
번들 설치
를 사용하여 Gemfile에 지정된 종속 항목을 설치합니다. bundle install
-
lambda_function.rb
라는 파일을 새로 생성합니다. 테스트를 위해 다음 샘플 함수 코드를 파일에 추가하거나 자체 샘플 함수 코드를 사용할 수 있습니다.예 Ruby 함수
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!" end end end
-
새 Dockerfile을 생성합니다. 다음은 AWS 기본 이미지를 사용하는 예제 Dockerfile입니다. 이 Dockerfile에서는 다음 구성을 사용합니다.
-
FROM
속성을 기본 이미지의 URI로 설정합니다. -
COPY 명령을 사용하여 함수 코드와 런타임 종속성을 Lambda 정의 환경 변수인
{LAMBDA_TASK_ROOT}
에 복사합니다. -
CMD
인수를 Lambda 함수 핸들러로 설정합니다.
참고로 Dockerfile 예제에는 USER 지침
이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 USER
지침이 제공되지 않을 때root
사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.예 Dockerfile
FROM
public.ecr.aws/lambda/ruby:3.2
# Copy Gemfile and Gemfile.lock COPY Gemfile Gemfile.lock ${LAMBDA_TASK_ROOT}/ # Install Bundler and the specified gems RUN gem install bundler:2.4.20 && \ bundle config set --local path 'vendor/bundle' && \ bundle install # Copy function code COPYlambda_function.rb
${LAMBDA_TASK_ROOT}/ # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "lambda_function.LambdaFunction::Handler.process
" ] -
-
docker build
명령으로 도커 이미지를 빌드합니다. 다음 예제에서는 이미지 이름을 docker-image
로 지정하고test
태그를 지정합니다. docker build --platform linux/amd64 -t
docker-image
:test
.참고
이 명령은 빌드 머신의 아키텍처에 관계없이 컨테이너가 Lambda 실행 환경과 호환되는지 확인하기 위해
--platform linux/amd64
옵션을 지정합니다. ARM64 명령 세트 아키텍처를 사용하여 Lambda 함수를 생성하려는 경우--platform linux/arm64
옵션을 대신 사용하도록 명령을 변경해야 합니다.
-
docker run 명령을 사용하여 Docker 이미지를 시작합니다. 이 예제에서
docker-image
는 이미지 이름이고test
는 태그입니다.docker run --platform linux/amd64 -p 9000:8080
docker-image
:test
이 명령은 이미지를 컨테이너로 실행하고
localhost:9000/2015-03-31/functions/function/invocations
에 로컬 엔드포인트를 생성합니다.참고
ARM64 명령 세트 아키텍처를 위한 도커 이미지를 빌드한 경우
--platform linux/
옵션을arm64
--platform linux/
대신 사용해야 합니다.amd64
-
새 터미널 창에서 로컬 엔드포인트에 이벤트를 게시합니다.
-
컨테이너 ID를 가져옵니다.
docker ps
-
docker kill
명령을 사용하여 컨테이너를 중지합니다. 이 명령에서 3766c4ab331c
를 이전 단계의 컨테이너 ID로 바꿉니다.docker kill
3766c4ab331c
Amazon ECR에 이미지 배포 및 Lambda 함수 생성
-
get-login-password
명령을 실행하여 Amazon ECR 레지스트리에 대해 Docker CLI를 인증합니다. -
--region
값을 Amazon ECR 리포지토리를 생성하려는 AWS 리전으로 설정합니다. -
111122223333
를 사용자의 AWS 계정 ID로 바꿉니다.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
create-repository
명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE참고
Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다.
성공하면 다음과 같은 응답이 표시됩니다.
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
이전 단계의 출력에서
repositoryUri
를 복사합니다. -
docker tag
명령을 실행하여 로컬 이미지를 Amazon ECR 리포지토리에 최신 버전으로 태깅합니다. 이 명령에서: -
docker-image:test
는 Docker 이미지의 이름과 태그입니다. docker build
명령에서 지정한 이미지 이름 및 태그입니다. -
<ECRrepositoryUri>
를 복사한repositoryUri
로 바꿉니다. URI 끝에:latest
를 포함해야 합니다.
docker tag docker-image:test
<ECRrepositoryUri>
:latest예시
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
docker push
명령을 실행하여 Amazon ECR 리포지토리에 로컬 이미지를 배포합니다. 리포지토리 URI 끝에 :latest
를 포함해야 합니다.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
함수에 대한 실행 역할이 아직 없는 경우 하나 생성합니다. 다음 단계에서는 역할의 Amazon 리소스 이름(ARN)이 필요합니다.
-
Lambda 함수를 생성합니다.
ImageUri
의 경우 이전의 리포지토리 URI를 지정합니다. URI 끝에:latest
를 포함해야 합니다.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
참고
이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 내용은 Amazon ECR 교차 계정 권한 단원을 참조하십시오.
-
함수를 호출합니다.
aws lambda invoke --function-name
hello-world
response.json다음과 같은 응답이 표시되어야 합니다.
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
함수의 출력을 보려면
response.json
파일을 확인합니다.
함수 코드를 업데이트하려면 이미지를 다시 빌드하고 Amazon ECR 리포지토리에 새 이미지를 업로드한 다음 update-function-code
Lambda는 이미지 태그를 특정 이미지 다이제스트로 확인합니다. 즉, 함수를 배포하는 데 사용된 이미지 태그가 Amazon ECR의 새 이미지로 가리키는 경우 Lambda는 새 이미지를 사용하도록 함수를 자동으로 업데이트하지 않습니다.
새 이미지를 동일한 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 동일하게 유지되더라도 update-function-code--publish
옵션은 업데이트된 컨테이너 이미지를 사용하여 새 버전의 함수를 생성합니다.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish
런타임 인터페이스 클라이언트에서 대체 기본 이미지 사용
OS 전용 기본 이미지나 대체 기본 이미지를 사용하는 경우 이미지에 런타임 인터페이스 클라이언트를 포함해야 합니다. 런타임 인터페이스 클라이언트는 Lambda와 함수 코드 간의 상호 작용을 관리하는 사용자 지정 런타임을 위한 Lambda 런타임 API 사용을 확장합니다.
RubyGems.org 패키지 관리자를 사용하여 Ruby용 런타임 인터페이스 클라이언트
gem install aws_lambda_ric
GitHub에서 Ruby 런타임 인터페이스 클라이언트
다음 예제에서는 비AWS 기본 이미지를 사용하여 Ruby용 컨테이너 이미지를 빌드하는 방법을 보여줍니다. 예제 Dockerfile에서는 공식 Ruby 기본 이미지를 사용합니다. Dockerfile에는 런타임 인터페이스 클라이언트가 포함되어 있습니다.
이 섹션의 단계를 완료하려면 다음이 필요합니다.
-
Ruby
대체 기본 이미지를 사용하여 컨테이너 이미지 생성
-
프로젝트에 대한 디렉터리를 생성하고 해당 디렉터리로 전환합니다.
mkdir example cd example
-
Gemfile
라는 파일을 새로 생성합니다. 여기에 애플리케이션의 필수 RubyGems 패키지를 나열합니다. AWS SDK for Ruby는 RubyGems에서 사용할 수 있습니다. 설치할 특정 AWS 서비스 gem을 선택해야 합니다. 예를 들어, Lambda용 Ruby gem을 사용하려면 Gemfile이 다음과 같아야 합니다. source 'https://rubygems.org' gem 'aws-sdk-lambda'
또는 aws-sdk
gem에는 사용 가능한 모든 AWS 서비스 gem이 포함되어 있습니다. 이 gem은 매우 크므로 많은 AWS 서비스에 의존하는 경우에만 사용하는 것이 좋습니다. -
번들 설치
를 사용하여 Gemfile에 지정된 종속 항목을 설치합니다. bundle install
-
lambda_function.rb
라는 파일을 새로 생성합니다. 테스트를 위해 다음 샘플 함수 코드를 파일에 추가하거나 자체 샘플 함수 코드를 사용할 수 있습니다.예 Ruby 함수
module LambdaFunction class Handler def self.process(event:,context:) "Hello from Lambda!" end end end
-
새 Dockerfile을 생성합니다. 다음 Dockerfile은 AWS 기본 이미지 대신 Ruby 기본 이미지를 사용합니다. Dockerfile에는 이미지가 Lambda와 호환되도록 하는 Ruby용 런타임 인터페이스 클라이언트
가 포함되어 있습니다. 또는 애플리케이션의 Gemfile에 런타임 인터페이스 클라이언트를 추가할 수 있습니다. -
FROM
속성을 Ruby 기본 이미지로 설정합니다. -
함수 코드의 디렉터리와 해당 디렉터리를 가리키는 환경 변수를 생성합니다. 이 예제에서 디렉토리는
/var/task
로, Lambda 실행 환경을 미러링합니다. 그러나 Docker파일은 AWS 기본 이미지를 사용하지 않으므로 함수 코드의 디렉터리를 선택할 수 있습니다. -
Docker 컨테이너가 시작될 때 실행할 모듈로
ENTRYPOINT
를 설정합니다. 이 경우 모듈은 런타임 인터페이스 클라이언트입니다. -
CMD
인수를 Lambda 함수 핸들러로 설정합니다.
참고로 Dockerfile 예제에는 USER 지침
이 포함되어 있지 않습니다. Lambda에 컨테이너 이미지를 배포할 때 Lambda는 권한이 최소 권한인 기본 Linux 사용자를 자동으로 정의합니다. 이는 USER
지침이 제공되지 않을 때root
사용자에게 기본 설정이 적용되는 표준 Docker 동작과는 다릅니다.예 Dockerfile
FROM
ruby:2.7
# Install the runtime interface client for Ruby RUN gem install aws_lambda_ric # Add the runtime interface client to the PATH ENV PATH="/usr/local/bundle/bin:${PATH}" # Create a directory for the Lambda function ENV LAMBDA_TASK_ROOT=/var/task RUN mkdir -p ${LAMBDA_TASK_ROOT} WORKDIR ${LAMBDA_TASK_ROOT} # Copy Gemfile and Gemfile.lock COPY Gemfile Gemfile.lock ${LAMBDA_TASK_ROOT}/ # Install Bundler and the specified gems RUN gem install bundler:2.4.20 && \ bundle config set --local path 'vendor/bundle' && \ bundle install # Copy function code COPYlambda_function.rb
${LAMBDA_TASK_ROOT}/ # Set runtime interface client as default command for the container runtime ENTRYPOINT [ "aws_lambda_ric
" ] # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "lambda_function.LambdaFunction::Handler.process" ]
-
-
docker build
명령으로 도커 이미지를 빌드합니다. 다음 예제에서는 이미지 이름을 docker-image
로 지정하고test
태그를 지정합니다. docker build --platform linux/amd64 -t
docker-image
:test
.참고
이 명령은 빌드 머신의 아키텍처에 관계없이 컨테이너가 Lambda 실행 환경과 호환되는지 확인하기 위해
--platform linux/amd64
옵션을 지정합니다. ARM64 명령 세트 아키텍처를 사용하여 Lambda 함수를 생성하려는 경우--platform linux/arm64
옵션을 대신 사용하도록 명령을 변경해야 합니다.
런타임 인터페이스 에뮬레이터
로컬 시스템에 런타임 인터페이스 에뮬레이터 설치 및 실행
-
프로젝트 디렉터리에서 다음 명령을 실행하여 GitHub에서 런타임 인터페이스 에뮬레이터(x86-64 아키텍처)를 다운로드하고 로컬 시스템에 설치합니다.
-
docker run 명령을 사용하여 Docker 이미지를 시작합니다. 유의할 사항:
-
docker-image
는 이미지 이름이고test
는 태그입니다. -
aws_lambda_ric lambda_function.LambdaFunction::Handler.process
는 Docker 파일의CMD
다음에 오는ENTRYPOINT
입니다.
이 명령은 이미지를 컨테이너로 실행하고
localhost:9000/2015-03-31/functions/function/invocations
에 로컬 엔드포인트를 생성합니다.참고
ARM64 명령 세트 아키텍처를 위한 도커 이미지를 빌드한 경우
--platform linux/
옵션을arm64
--platform linux/
대신 사용해야 합니다.amd64
-
-
로컬 엔드포인트에 이벤트를 게시합니다.
-
컨테이너 ID를 가져옵니다.
docker ps
-
docker kill
명령을 사용하여 컨테이너를 중지합니다. 이 명령에서 3766c4ab331c
를 이전 단계의 컨테이너 ID로 바꿉니다.docker kill
3766c4ab331c
Amazon ECR에 이미지 배포 및 Lambda 함수 생성
-
get-login-password
명령을 실행하여 Amazon ECR 레지스트리에 대해 Docker CLI를 인증합니다. -
--region
값을 Amazon ECR 리포지토리를 생성하려는 AWS 리전으로 설정합니다. -
111122223333
를 사용자의 AWS 계정 ID로 바꿉니다.
aws ecr get-login-password --region
us-east-1
| docker login --username AWS --password-stdin111122223333
.dkr.ecr.us-east-1
.amazonaws.com -
-
create-repository
명령을 사용하여 Amazon ECR에 리포지토리를 생성합니다. aws ecr create-repository --repository-name
hello-world
--regionus-east-1
--image-scanning-configuration scanOnPush=true --image-tag-mutability MUTABLE참고
Amazon ECR 리포지토리는 Lambda 함수와 동일한 AWS 리전 내에 있어야 합니다.
성공하면 다음과 같은 응답이 표시됩니다.
{ "repository": { "repositoryArn": "arn:aws:ecr:us-east-1:111122223333:repository/hello-world", "registryId": "111122223333", "repositoryName": "hello-world", "repositoryUri": "111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world", "createdAt": "2023-03-09T10:39:01+00:00", "imageTagMutability": "MUTABLE", "imageScanningConfiguration": { "scanOnPush": true }, "encryptionConfiguration": { "encryptionType": "AES256" } } }
-
이전 단계의 출력에서
repositoryUri
를 복사합니다. -
docker tag
명령을 실행하여 로컬 이미지를 Amazon ECR 리포지토리에 최신 버전으로 태깅합니다. 이 명령에서: -
docker-image:test
는 Docker 이미지의 이름과 태그입니다. docker build
명령에서 지정한 이미지 이름 및 태그입니다. -
<ECRrepositoryUri>
를 복사한repositoryUri
로 바꿉니다. URI 끝에:latest
를 포함해야 합니다.
docker tag docker-image:test
<ECRrepositoryUri>
:latest예시
docker tag
docker-image
:test
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
-
docker push
명령을 실행하여 Amazon ECR 리포지토리에 로컬 이미지를 배포합니다. 리포지토리 URI 끝에 :latest
를 포함해야 합니다.docker push
111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest -
함수에 대한 실행 역할이 아직 없는 경우 하나 생성합니다. 다음 단계에서는 역할의 Amazon 리소스 이름(ARN)이 필요합니다.
-
Lambda 함수를 생성합니다.
ImageUri
의 경우 이전의 리포지토리 URI를 지정합니다. URI 끝에:latest
를 포함해야 합니다.aws lambda create-function \ --function-name
hello-world
\ --package-type Image \ --code ImageUri=111122223333
.dkr.ecr.us-east-1
.amazonaws.com/hello-world
:latest \ --rolearn:aws:iam::111122223333:role/lambda-ex
참고
이미지가 Lambda 함수와 동일한 리전에 있는 한 다른 AWS 계정의 이미지를 사용하여 함수를 생성할 수 있습니다. 자세한 내용은 Amazon ECR 교차 계정 권한 단원을 참조하십시오.
-
함수를 호출합니다.
aws lambda invoke --function-name
hello-world
response.json다음과 같은 응답이 표시되어야 합니다.
{ "ExecutedVersion": "$LATEST", "StatusCode": 200 }
-
함수의 출력을 보려면
response.json
파일을 확인합니다.
함수 코드를 업데이트하려면 이미지를 다시 빌드하고 Amazon ECR 리포지토리에 새 이미지를 업로드한 다음 update-function-code
Lambda는 이미지 태그를 특정 이미지 다이제스트로 확인합니다. 즉, 함수를 배포하는 데 사용된 이미지 태그가 Amazon ECR의 새 이미지로 가리키는 경우 Lambda는 새 이미지를 사용하도록 함수를 자동으로 업데이트하지 않습니다.
새 이미지를 동일한 Lambda 함수에 배포하려면 Amazon ECR의 이미지 태그가 동일하게 유지되더라도 update-function-code--publish
옵션은 업데이트된 컨테이너 이미지를 사용하여 새 버전의 함수를 생성합니다.
aws lambda update-function-code \ --function-name
hello-world
\ --image-uri111122223333.dkr.ecr.us-east-1.amazonaws.com/hello-world:latest
\ --publish