AWS SAM 및 Codebuild/Codepipeline과 함께 AWS Lambda에 대한 컨테이너 이미지 지원 사용



Recently AWS는 Lambda 함수에 대한 컨테이너 이미지 지원을 도입했습니다.
Codebuild+Codepipeline을 CICD로 사용하여 Java8로 간단한 람다 함수를 배포하는 약간의 테스트를 실행하고 싶었지만 예상보다 간단하지 않았습니다.

이 빠른 가이드를 통해 귀중한 시간을 절약할 수 있기를 바랍니다.
자, 시작하겠습니다!

CI/CD 파이프라인 설정



내 예에서는 Codecommit, Codebuild 및 Codepipeline과 같은 모든 AWS 서비스를 사용하여 CI/CD를 구축했습니다.

이를 설정하는 가장 편리한 방법은 대상 AWS 계정에서 Cloudformation 템플릿을 실행하는 것입니다.
내 Githubexample.에서 템플릿을 찾을 수 있습니다.

이 템플릿은 다음을 생성합니다.
  • 예제 람다에 대한 Codecommit 리포지토리
  • Codebuild 프로젝트는 Lambda를 빌드하고 관련 도커 이미지를 ECR 저장소로 푸시합니다.
  • Codepipeline은 Codecommit의 마스터 브랜치에서 모든 커밋을 포착하여 앱 빌드를 위해 Codebuild로 보내고 이미지를 푸시하고 Lambda를 배포함으로써 위의 서비스를 오케스트레이션합니다.
  • Docker 이미지를 저장하기 위한 ECR 저장소입니다.


  • 람다



    컨테이너 이미지 람다와 이전 Java의 주요 차이점은 이제 zip/jar 파일을 업로드하는 대신 모든 클래스와 라이브러리를 도커 이미지에 복사해야 한다는 것입니다.
    이를 위해 "빌드"작업 중에 Lambda의 런타임 종속성을 "빌드/종속성"폴더로 추출하는 다음 Gradle 작업을 설정했습니다.

    task copyRuntimeDependencies(type: Copy) {
        from configurations.runtimeClasspath
        into 'build/dependency'
    }
    
    build.dependsOn copyRuntimeDependencies
    



    도커파일



    AWS에는 확장할 수 있는 다양한 퍼블릭 도커 이미지가 있습니다.
    내 예에서는 "public.ecr.aws/lambda/java:8"을 사용했습니다.
    모든 종속성을 복사하고 진입점을 설정했습니다.

    FROM public.ecr.aws/lambda/java:8
    
    # Copy function code and runtime dependencies from Gradle layout
    COPY build/classes/java/main ${LAMBDA_TASK_ROOT}
    COPY build/dependency/* ${LAMBDA_TASK_ROOT}/lib/
    
    # Set the CMD to your handler 
    CMD [ "me.enryold.docker.lambda.Lambda::handleRequest" ]
    



    SAM(템플릿.yml)



    여기에서 람다 정의의 "메타데이터"섹션 아래에 세 개의 새 필드를 지정해야 합니다.

    Dockerfile: Dockerfile     # name of Dockerfile file
    DockerContext: .           # Folder where Dockerfile has placed. Mine is under the project root. 
    DockerTag: latest          # Tag of our image. 
    


    그것이 최종 결과를 보는 방법입니다.

      Lambda:
        Type: AWS::Serverless::Function
        Metadata:
          Dockerfile: Dockerfile
          DockerContext: .
          DockerTag: latest
        Properties:
          PackageType: Image
          FunctionName: docker-lambda
          MemorySize: 1536
          Timeout: 30
          Policies:
            - AWSLambdaBasicExecutionRole                    # enable lambda execution
            - Version: '2012-10-17'
              Statement:
                - Effect: Allow
                  Action:
                    - cloudwatch:*
                    - ec2:DescribeVpcs
                    - ec2:DescribeSubnets
                    - ec2:DescribeSecurityGroups
                    - ec2:DescribeKeyPairs
                  Resource: '*'
    



    Buildspec.yml



    우리가 표준 빌드를 사용해야 하는 동안 원래 기사가 가이드 샘 빌드를 사용하기 때문에 내가 몇 시간을 낭비한 부분입니다.
  • 설치 단계에서 AWS에서 최신 sam cli를 다운로드하여 설치했습니다.
  • pre_build 섹션에서 Codebuild 실행이 업데이트된 도커 이미지를 푸시할 수 있도록 ECR 자격 증명을 가져와야 합니다.
  • 마지막으로 빌드 단계에서 Java 앱을 빌드하고 sam build/package/deploy 명령을 실행합니다.

  • version: 0.2
    
    phases:
      install:
        runtime-versions:
          docker: 18
        commands:
          - wget https://github.com/aws/aws-sam-cli/releases/latest/download/aws-sam-cli-linux-x86_64.zip
          - unzip aws-sam-cli-linux-x86_64.zip -d sam-installation
          - sam --version
          - ./sam-installation/install --update
          - /usr/local/bin/sam --version
      pre_build:
        commands:
          - aws ecr get-login-password --region ${AWS_REGION} | docker login --username AWS --password-stdin ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com
      build:
        commands:
          - cd sources && gradle build
          - /usr/local/bin/sam build --template-file ${CODEBUILD_SRC_DIR}/sources/sam.yml --region ${AWS_REGION}
          - /usr/local/bin/sam package --template-file ${CODEBUILD_SRC_DIR}/sources/.aws-sam/build/template.yaml --output-template-file ${CODEBUILD_SRC_DIR}/sources/packaged.yaml --image-repository ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/me.enryold/docker-lambda
          - /usr/local/bin/sam deploy --template-file ${CODEBUILD_SRC_DIR}/sources/packaged.yaml --stack-name ${PROJECT_NAME}-sam --capabilities CAPABILITY_NAMED_IAM --region ${AWS_REGION} --image-repository ${AWS_ACCOUNT_ID}.dkr.ecr.${AWS_REGION}.amazonaws.com/me.enryold/docker-lambda
    



    작업 예



    내 Github 페이지에서 entire project을 자유롭게 다운로드/포크하십시오.

    좋은 웹페이지 즐겨찾기