Ruby Lambda 함수를 위한 계층 작업 - AWS Lambda

Ruby Lambda 함수를 위한 계층 작업

Lambda 계층은 추가 코드 또는 데이터를 포함하는 .zip 파일 아카이브입니다. 계층에는 일반적으로 라이브러리 종속 항목, 사용자 지정 런타임 또는 구성 파일이 포함됩니다. 계층을 생성하려면 세 가지 일반적인 단계를 거칩니다.

  1. 계층 콘텐츠를 패키징합니다. 즉, 함수에 사용하려는 종속성이 포함된 .zip 파일 아카이브를 생성합니다.

  2. Lambda에서 계층을 생성합니다.

  3. 계층을 함수에 추가합니다.

이 주제에는 외부 라이브러리 종속성이 있는 Ruby Lambda 계층을 올바르게 패키징하고 생성하는 방법에 대한 단계와 지침이 포함되어 있습니다.

사전 조건

이 섹션의 단계를 수행하려면 다음이 필요합니다.

이 주제에서는 awsdocs GitHub 리포지토리에 있는 layer-ruby 샘플 애플리케이션을 참조합니다. 이 애플리케이션은 종속성을 다운로드하고 계층을 생성하는 스크립트를 포함합니다. 애플리케이션은 계층의 종속성을 사용하는 해당 함수도 포함합니다. 계층을 생성한 후 해당 함수를 배포하고 호출하여 모든 것이 제대로 작동하는지 확인할 수 있습니다. 함수에 Ruby 3.3 런타임을 사용하므로 계층도 Ruby 3.3과 호환되어야 합니다.

layer-ruby 샘플 애플리케이션에서 tzinfo 라이브러리를 Lambda 계층으로 패키징합니다. layer/ 디렉터리는 계층을 생성하는 스크립트를 포함합니다. function/ 디렉터리는 계층이 작동하는지 테스트하는 데 도움이 되는 샘플 함수를 포함합니다. 이 자습서의 대부분은 이 계층을 생성하고 패키징하는 방법을 안내합니다.

Lambda 런타임 환경과 Ruby 계층의 호환성

Ruby 계층에서 코드를 패키징할 때 코드와 호환되는 Lambda 런타임 환경을 지정합니다. 런타임과의 코드 호환성을 평가하려면 코드가 설계된 Ruby 버전, 운영 체제, 명령 세트 아키텍처를 고려하세요.

Lambda Ruby 런타임은 Ruby 버전과 운영 체제를 지정합니다. 이 문서에서는 AL2023 기반의 Ruby 3.3 런타임을 사용합니다. 런타임 버전에 대한 자세한 내용은 지원되는 런타임 섹션을 참조하세요. Lambda 함수를 생성할 때 명령 세트 아키텍처를 지정합니다. 이 문서에서는 x86_64 아키텍처를 사용합니다. Lambda의 아키텍처에 대한 자세한 내용은 Lambda 함수에 대한 명령 세트 아키텍처의 선택 및 구성 섹션을 참조하세요.

패키지에 제공된 코드를 사용하는 경우 각 패키지 관리자는 독립적으로 호환성을 정의합니다. 대부분의 Gem은 완전히 Ruby로 작성되었으며 호환되는 Ruby 언어 버전을 사용하는 모든 런타임과 호환됩니다.

때때로 Gem은 확장이라는 Ruby 기능을 사용하여 코드를 컴파일하거나 설치 프로세스의 일부로 미리 컴파일된 코드를 포함하기도 합니다. 네이티브 확장이 있는 Gem에 의존하는 경우에는 운영 체제와 명령 세트 아키텍처 호환성을 평가해야 합니다. Gem과 Ruby 런타임 간의 호환성을 평가하려면 Gem과 해당 문서를 검사해야 합니다. Gem 사양에 extensions가 정의되어 있는지 확인하여 Gem의 확장을 사용하는지 확인할 수 있습니다. Ruby는 RUBY_PLATFORM 전역 상수를 통해 실행 중인 플랫폼을 식별합니다. Lambda Ruby 런타임은 플랫폼을 arm64 아키텍처에서 실행되는 경우 aarch64-linux로, x86_64 아키텍처에서 실행되는 경우 x86_64-linux로 정의합니다. Gem이 이러한 플랫폼과 호환되는지 확인할 수 있는 확실한 방법은 없지만 일부 Gem은 platform Gem 사양 속성을 통해 지원되는 플랫폼을 선언합니다.

Ruby 런타임의 계층 경로

함수에 계층을 추가하면 Lambda는 계층 콘텐츠를 해당 실행 환경의 /opt 디렉터리로 추출합니다. 각 Lambda 런타임에 대해 PATH 변수에는 /opt 디렉터리 내의 특정 폴더 경로가 이미 포함되어 있습니다. PATH 변수가 계층 콘텐츠를 가져오도록 하려면 계층 .zip 파일의 종속성이 다음 폴더 경로에 있어야 합니다.

  • ruby/gems/x, 여기서 x는 3.3.0과 같은 런타임의 Ruby 버전입니다.

  • ruby/lib/

이 문서에서는 ruby/gems/x 경로를 사용합니다. Lambda에서는 이 디렉터리의 내용이 번들러 설치 디렉터리의 구조와 일치할 것으로 예상합니다. 다른 메타데이터 하위 디렉터리와 함께 계층 경로의 /gems 하위 디렉터리에 Gem 종속성을 저장합니다. 예를 들어 이 자습서에서 생성하는 결과 레이어 .zip 파일의 디렉터리 구조는 다음과 같습니다.

layer_content.zip └ ruby └ gems └ 3.3.0 └ gems └ tzinfo-2.0.6 └ <other_dependencies> (i.e. dependencies of the tzinfo package) └ ... └ <metadata generated by bundle>

tzinfo 라이브러리는 ruby/gems/3.3.0/ 디렉터리에 올바르게 위치합니다. 이렇게 하면 함수 호출 중에 Lambda가 라이브러리를 찾을 수 있습니다.

계층 콘텐츠의 패키징

이 예제에서는 Ruby tzinfo 라이브러리를 계층 .zip 파일로 패키징합니다. 다음 단계를 완료하여 계층 콘텐츠를 설치하고 패키징합니다.

계층 콘텐츠를 설치하고 패키징하려면 다음을 수행합니다.
  1. sample-apps/layer-ruby 디렉터리에 필요한 샘플 코드가 포함된 aws-lambda-developer-guide GitHub 리포지토리를 복제합니다.

    git clone https://github.com/awsdocs/aws-lambda-developer-guide.git
  2. layer-ruby 샘플 앱의 layer 디렉터리로 이동합니다. 이 디렉터리에는 계층을 올바르게 생성하고 패키징하는 데 사용하는 스크립트가 포함되어 있습니다.

    cd aws-lambda-developer-guide/sample-apps/layer-ruby/layer
  3. Gemfile을 검사합니다. 이 파일은 계층, 즉 tzinfo 라이브러리에 포함하려는 종속성을 정의합니다. 이 파일을 업데이트하여 자체 계층에 포함하려는 종속성을 포함할 수 있습니다.

    예 Gemfile
    source "https://rubygems.org" gem "tzinfo"
  4. 두 스크립트를 모두 실행할 수 있는 권한이 있는지 확인하세요.

    chmod 744 1-install.sh && chmod 744 2-package.sh
  5. 다음 명령을 사용하여 1-install.sh 스크립트를 실행하세요.

    ./1-install.sh

    이 스크립트는 프로젝트 디렉터리에 종속성을 설치하도록 번들러를 구성합니다. 그런 다음 vendor/bundle/ 디렉터리에 필요한 모든 종속성을 설치합니다.

    예 1-install.sh
    bundle config set --local path 'vendor/bundle' bundle install
  6. 다음 명령을 사용하여 2-package.sh 스크립트를 실행하세요.

    ./2-package.sh

    이 스크립트는 vendor/bundle 디렉터리의 내용을 ruby이라는 새 디렉터리에 복사합니다. 그런 다음 ruby 디렉터리의 내용을 layer_content.zip라는 파일로 압축합니다. 이는 계층의 .zip 파일입니다. Ruby 런타임의 계층 경로 섹션에 표시된 것처럼 파일의 압축을 풀고 올바른 파일 구조가 포함되어 있는지 확인할 수 있습니다.

    예 2-package.sh
    mkdir -p ruby/gems/3.3.0 cp -r vendor/bundle/ruby/3.3.0/* ruby/gems/3.3.0/ zip -r layer_content.zip ruby

계층의 생성

이 섹션에서는 이전 섹션에서 생성한 layer_content.zip 파일을 가져와 Lambda 계층으로 업로드합니다. AWS Command Line Interface(AWS CLI)를 통해 AWS Management Console 또는 Lambda API를 사용하여 계층을 업로드할 수 있습니다. 계층 .zip 파일을 업로드할 때 다음 PublishLayerVersion AWS CLI 명령에서 ruby3.3을 호환 런타임으로, arm64를 호환 아키텍처로 지정합니다.

aws lambda publish-layer-version --layer-name ruby-requests-layer \ --zip-file fileb://layer_content.zip \ --compatible-runtimes ruby3.3 \ --compatible-architectures "arm64"

응답에서 arn:aws:lambda:us-east-1:123456789012:layer:ruby-requests-layer:1처럼 보이는 LayerVersionArn에 유의하세요. 이 자습서의 다음 단계인 함수에 계층을 추가할 때 이 Amazon 리소스 이름(ARN)이 필요합니다.

함수에 계층 추가

이 섹션에서는 함수 코드에 tzinfo 라이브러리를 사용하는 샘플 Lambda 함수를 배포한 다음 계층을 연결합니다. 함수를 배포하려면 실행 역할로 Lambda 함수 권한 정의이 필요합니다. 기존 실행 역할이 없으면 접을 수 있는 섹션의 단계를 따르세요.

실행 역할을 만들려면
  1. IAM 콘솔에서 역할 페이지를 엽니다.

  2. 역할 생성을 선택합니다.

  3. 다음 속성을 사용하여 역할을 만듭니다.

    • 신뢰할 수 있는 엔터티Lambda.

    • 권한AWSLambdaBasicExecutionRole.

    • 역할 이름lambda-role.

    AWSLambdaBasicExecutionRole 정책은 함수가 CloudWatch Logs에 로그를 쓰는 데 필요한 권한을 가집니다.

Lambda 함수 코드tzinfo 라이브러리를 가져온 다음 상태 코드와 현지화된 날짜 문자열을 반환합니다.

require 'json' require 'tzinfo' def lambda_handler(event:, context:) tz = TZInfo::Timezone.get('America/New_York') { statusCode: 200, body: tz.to_local(Time.utc(2018, 2, 1, 12, 30, 0)) } end
Lambda 함수를 배포하려면 다음을 수행합니다.
  1. function/ 디렉터리로 이동합니다. 현재 layer/ 디렉터리에 있는 경우 다음 명령을 실행하세요.

    cd ../function
  2. 다음 명령을 사용하여 .zip 파일 배포 패키지를 생성합니다.

    zip my_deployment_package.zip lambda_function.rb
  3. 함수를 배포합니다. 다음 AWS CLI 명령에서 --role 파라미터를 실행 역할 ARN으로 바꿉니다.

    aws lambda create-function --function-name ruby_function_with_layer \ --runtime ruby3.3 \ --architectures "arm64" \ --handler lambda_function.lambda_handler \ --role arn:aws:iam::123456789012:role/lambda-role \ --zip-file fileb://my_deployment_package.zip
  4. 그런 다음 계층을 함수에 연결합니다. 다음 AWS CLI 명령에서 --layers 파라미터를 이전에 기록해 둔 계층 버전 ARN으로 바꿉니다.

    aws lambda update-function-configuration --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --layers "arn:aws:lambda:us-east-1:123456789012:layer:ruby-requests-layer:1"
  5. 마지막으로 다음 AWS CLI 명령을 사용하여 함수를 호출합니다.

    aws lambda invoke --function-name ruby_function_with_layer \ --cli-binary-format raw-in-base64-out \ --payload '{ "key": "value" }' response.json

    다음과 유사한 출력 화면이 표시되어야 합니다.

    { "StatusCode": 200, "ExecutedVersion": "$LATEST" }

    출력 response.json 파일은 응답에 대한 세부 정보를 포함합니다.

이 자습서 용도로 생성한 리소스를 보관하고 싶지 않다면 지금 삭제할 수 있습니다. 더 이상 사용하지 않는 AWS 리소스를 삭제하면 AWS 계정에 불필요한 요금이 발생하는 것을 방지할 수 있습니다.

Lambda 계층을 삭제하려면 다음을 수행합니다.
  1. Lambda 콘솔의 계층 페이지를 엽니다.

  2. 생성한 계층을 선택합니다.

  3. 삭제를 선택한 다음 삭제를 다시 선택합니다.

Lambda 함수를 삭제하려면
  1. Lambda 콘솔의 함수 페이지를 엽니다.

  2. 생성한 함수를 선택합니다.

  3. 작업, 삭제를 선택합니다.

  4. 텍스트 입력 필드에 delete를 입력하고 Delete(삭제)를 선택합니다.