terraform으로 lambda로 컨테이너 이미지 배포

5498 단어 람다TerraformECRAWS

컨테이너 이미지를 사용한 lambda



개요


  • 2020/12에서 lambda로 ECR에 컨테이너 이미지를 배포 할 수 있습니다.
  • 지금까지의 zip 형식과의 큰 차이는 아티팩트 사이즈 제한(250 MB -> 10 GB)
  • 로컬에서 테스트하기 쉽습니다 ( Lambda 컨테이너 이미지를 로컬로 테스트 )

  • 배포 방법



    zip과 컨테이너 이미지 모두를 간단한 그림으로 나타내면 다음과 같다.


    lambda_flow.png

    terraform에 의한 배포



    terraform에 의해 lambda의 작성만을 실시해, 작성 후의 이미지 관리는 실시하지 않는다.
    이 경우, github actions 등을 이용하여 이미지의 build, push, lambda의 갱신까지를 실시하면 관리가 편해진다.
    resource "aws_lambda_function" "function" {
      function_name = "<Function name>"
      description   = "<Description>"
    
      package_type = "Image"
      image_uri    = "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
      timeout      = <Timeout>
    
      lifecycle {
        ignore_changes = [image_uri]
      }
    
      role = <Role arn>
    }
    

    terraform으로 이미지 관리를 실시하지 않는 경우, 이미지 갱신시에는 update-function-code 를 사용하면 된다.
    명령 예는 다음과 같습니다.
    aws lambda update-function-code --function-name "<Function name>" --image-uri "<Account id>.dkr.ecr.<Region>.amazonaws.com/<ECR>:<Tags>"
    

    눈치채다



    공개 이미지를 사용할 수 없음



    공용 이미지는 사용할 수 없으며 자체 계정의 이미지를 지정해야 합니다.
    이 점을 알게 된 이유는 더미로 적절한 이미지를 사용하려고 할 때 공개 이미지를 지정할 수 없었기 때문입니다.
    terraform에 의해 이미지를 관리하지 않으면, lambda 생성시에는 더미 이미지를 사용하면 이하의 2점이 편리하다.
  • 간단한 module를 준비 할 수있다 (필요한 인수는 function_name, description, role 그리고, 나머지는 디폴트치를 설정)
  • lambda와 ecr을 한 번에 만들 수 있습니다 (더미를 사용하지 않으면 lambda를 만들기 전에 ecr을 만들어 이미지를 푸시해야합니다).

    사쿠와 더미 이미지 준비



    거기서 더미 이미지를 간단하게 만들 수 있도록 했다( yoshi65/lambda_hello_world_image ).
    다음 절차를 사용하여 ecr에 dummy:latest를 생성 할 수 있습니다. 미리 인증 정보를 설정해야합니다.
    git clone https://github.com/yoshi65/lambda_hello_world_image.git
    cd lambda_hello_world_image
    ./hello_world.sh
    

    만약 지우고 싶어지면 다음과 같다.sh
    ./hello_world.sh -d

    이 생성에 terraform을 사용할까 생각했지만,
  • 더미 이미지 자체는 콘솔이나 cli로 만들 때도 활용할 수 있습니다
  • ecr을 terraform으로 만든 곳에서 결국 이미지 푸시를위한 스크립트가 필요합니다

  • 등에 의해, 사용하지 않았다 (기분이 들었을 때에 추가할지도).

    update-function-code 후 즉시 invoke 할 수 없다



    lambda를 사용할 때 $LATEST 를 사용하지 않고 alias를 지정하여 invoke 하는 경우가 많다.
    그래서, 동작 확인을 위해 invoke 하고, 정상 종료를 확인하고 나서, alias를 갱신하려고 했다.

    그때 invoke
  • $LATEST를 지정하면 이전 버전이 사용됩니다.
  • update-function-code로 게시 된 버전을 사용하면 ResourceConflictException가 발생합니다.

  • invoke 할 수 없는 이유



    이 이유는 이미지 최적화를 포함합니다.
    콘솔상에서 이미지 갱신을 확인한 적이 있으면 알 수 있다고 생각하지만, 갱신 후 바로는 갱신중이라고 하는 취지가 상부에 표시되고, 잠시 후 완료의 취지가 표시된다.

    invoke 하기 위해



    해결책으로서는, 스테이터스의 갱신을 기다리면 된다.
    다음 명령으로 해결합니다.sh
    aws lambda wait function-updated --function-name "<Function name>"

    lambda 업데이트, 대기 및 시작을 결합하면,sh
    aws lambda update-function-code --function-name "<Function name>" --image-uri "<Image uri>" --publish
    aws lambda wait function-updated --function-name "<Function name>"
    aws lambda invoke --function-name "<Function name>":\$LATEST response.json

    감상



    취향은 있을 것 같지만, 컨테이너 이미지 쪽이 zip보다 쓰기는 좋았다.
    컨테이너 이미지로 설정하는 경우가 많기 때문에 lambda를 만들 때 필요한 설정이 줄어 듭니다.

    Ref.


  • 컨테이너 사용자에게 바치는 AWS Lambda의 새로운 개발 방법!
  • New for AWS Lambda – Container Image Support
  • Lambda 컨테이너 이미지를 로컬로 테스트
  • 좋은 웹페이지 즐겨찾기