re:Invent 2018 검증 실험: Lambda Layer

개요



지금까지 여러 Lambda 함수에서 호출하는 라이브러리가 있어도 각 함수에 대해 패키징해야했습니다.

이번에 발표된 AWS Lambda Layers를 이용하여 공통 모듈/공통 처리를 Layer화하여 여러 Lambda 함수에서 이용할 수 있는 것 같습니다.

Lambda Layer 제한


  • Function 마다, 최대 동시 5개 Layers 사용할 수 있다
  • A function can use up to 5 layers at a time

  • Function 과 모든 Layers, 해동 후, 250MB 넘지 않는 것
  • The total unzipped size of the function and all layers can't exceed the unzipped deployment package size limit of 250 MB.


  • 사전 준비


  • 라이브러리
  • Node.js
  • aws cli

  • 설치
  • npm install
  • npm install typescript -g

  • 샘플
  • 공통 처리 라이브러리
  • 외부 라이브러리
  • 테스트 코드


  • 샘플 만들기



    공통 처리 라이브러리



    콘솔에 메시지 출력 기능 만들기

    src/library/utils.ts
    export const test = () => console.log('Lambda Layer Test.');
    

    외부 라이브러리



    외부 라이브러리를 지정된 폴더에 사전 설치
    cd nodejs && npm install
    or
    npm run initial
    

    테스트 코드



    두 라이브러리의 함수 실행 결과가 표시되면 성공합니다.

    src/lambda/app.ts
    import * as utils from 'library/utils';
    import * as moment from 'moment';
    
    export const handler = (event: any, context: any, callback: any) => {
      // 共通処理のライブラリ
      console.log(utils.test());
      // 外部のライブラリ
      console.log(moment.now());
    
      callback(null, null);
    };
    

    Lambda Layer용 모듈 만들기


    package.json scripts에서 관리하는 작업 수행
    npm run release
    
    ...
      "scripts": {
        "initial": "cd nodejs && npm install",
        "release": "npm run build && npm run package",
        "prebuild": "rimraf dist && rimraf nodejs/node_modules/library",
        "build:src": "tsc",
        "build:lib": "tsc -p tsconfig_lib.json",
        "build": "npm run build:src && npm run build:lib",
        "package:src": "cd dist/lambda && zip -r ../lambda.zip *",
        "package:lib": "zip -r dist/nodejs.zip nodejs",
        "package": "npm run package:src && npm run package:lib"
      },
    ...
    

    아티팩트 확인


    dist 폴더에 아래 zip 파일이 만들어졌습니다.
  • function.zip (Function Source)
  • nodejs.zip (Layer Source)

  • 검증 환경 구축


    CloudFormation 템플릿을 준비했습니다.

    검증용 모듈이 S3에 업로드되었으므로 누구나 쉽게 재현할 수 있습니다.

    템플릿


    AWSTemplateFormatVersion: 2010-09-09
    
    Resources:
      ExPoliy:
        Type: AWS::IAM::Policy
        Properties:
          PolicyName: LambdaLayer_LambdaBasicExecution
          PolicyDocument:
            Version: '2012-10-17'
            Statement:
              -
                Sid: LambdaLogs
                Effect: Allow
                Action:
                  - logs:CreateLogGroup
                  - logs:CreateLogStream
                  - logs:PutLogEvents
                Resource: !Sub 'arn:aws:logs:${AWS::Region}:*:*'
          Roles:
            - !Ref ExRole
    
      ExRole:
        Type: AWS::IAM::Role
        Properties:
          RoleName: LambdaLayer_LayerRole
          AssumeRolePolicyDocument:
            Version: '2012-10-17'
            Statement: 
              - 
                Effect: Allow
                Principal: 
                  Service: 
                    - lambda.amazonaws.com
                Action: 
                  - sts:AssumeRole
          Path: '/'
    
      ExFunction:
        Type: AWS::Lambda::Function
        Properties:
          FunctionName: LambdaLayer_Function
          Handler: app.handler
          Role: !GetAtt ExRole.Arn
          Runtime: nodejs8.10
          Code:
            S3Bucket: reinvent-2018-examples
            S3Key: lambda_layer/lambda.zip
          Layers:
            - !Ref ExLayer
    
      ExLayer:
        Type: AWS::Lambda::LayerVersion
        Properties:
          CompatibleRuntimes:
            - nodejs8.10
          LayerName: LambdaLayer_Layer
          LicenseInfo: MIT
          Content:
            S3Bucket: reinvent-2018-examples
            S3Key: lambda_layer/nodejs.zip
    
      ExLayerPermission:
        Type: AWS::Lambda::LayerVersionPermission
        Properties:
          Action: lambda:GetLayerVersion
          LayerVersionArn: !Ref ExLayer
          Principal: '*'
    

    템플릿 실행


    aws cloudformation deploy --template-file ./cfn/lambda_layer.yml --stack-name lambda-layer-example --capabilities CAPABILITY_NAMED_IAM
    

    콘솔에서 Lambda Layer 확인



    CloudFormation에서 구성 성공





    Function 확인





    레이어 확인





    레이어가 추가됨





    실행 결과 확인



    좋은 웹페이지 즐겨찾기