Serverless Framework에서 컨테이너는 Custom Runtime의 Lambda에 해당합니다.

6/24 추기


업데이트썼어요.
ServerlessLambda의 컨테이너화 지원 이런 거 때문에 바로 해봤어요.
이번 보도의 견본에서 언어는 크리스탈로 제목과 같이 커스텀런타임을 사용했고 다른 환경도 참고할 수 있다.
또 이번에는 커스텀런타임을 언어로 사용하는 데 필요한 시행 방식에 대한 특별한 설명은 없으며, 필요하다면여기. 과거 기사를 참고해달라고 당부했다.
우리는 자주 몇 가지 언어로 견본을 만드는데, 아래의 내용을 참고하십시오.
  • Crystal
  • nim
  • Dart
  • Serverless에서 컨테이너를 사용하는 방법


    어쨌든 한번 움직여 보면 특별히 어려운 것은 없다.
    다음 예Serverless의 공식 소개 기사에서 빌려쓰다와 같이 서버less.yml에서 지정한handler가 아니라 이미지 항목 이름으로 ECR에 밀어붙이는 URI를 지정하십시오.
    태그 등의 digest를 지정해야 하는 것은 주의 사항이 아닙니다.
    functions:
      someFunction:
        image: <account>.dkr.ecr.<region>.amazonaws.com/<repository>@<digest>
    
    실천 중 개발 전 준비로'컨테이너를 구축하고 ECR에 추진하는 처리'와'추진되는 용기 정보를 얻는 처리'가 필요하다는 것이다.

    컨테이너 구축, ECR 밀어넣기


    아무래도 컨테이너를 ECR에 먼저 밀어붙이지 않으면 아무것도 시작하지 않을 것이다.
    그래서 크리스탈의 경우 Docker file의 예를 붙였다.
    FROM crystallang/crystal:latest as build-image
    
    WORKDIR /work
    COPY ./ ./
    
    RUN crystal build --link-flags -static -o bootstrap src/main.cr
    RUN chmod +x bootstrap
    
    FROM public.ecr.aws/lambda/provided:al2
    
    COPY --from=build-image /work/ /var/runtime/
    
    # NOTE: ここで指定した文字列がhandlerとして利用される
    CMD ["hello"]
    
    아시다시피 그렇게 어려운 건 아니에요.
    크리스탈의 공식 이미지를 활용한 구축.
    Custom Runtime/var/runtime/bootstrap라면 구축된 바이너리를 AWS가 공식 발표한 람다용 이미지로 복사하면 된다.
    여기서 주의해야 할 점은 람다에서 사용하는 이미지는 AWS 공식 람다용 이미지여야 한다는 점이다.
    이 예는 Custom Runtime용 이미지를 사용합니다.
    따라서 이 이미지를 구축하고 추진하려면 먼저 ECR에 추진할 창고가 필요하다.
    aws cli를 사용할 때 다음 명령을 사용하여 만듭니다.
    $ aws ecr create-repository --repository-name <リポジトリ名> --image-scanning-configuration scanOnPush=true
    
    그럼 이제 ECR에 들어갑니다.
    $ aws ecr get-login-password --region <リージョン>                                               |
    $ docker login --username AWS --password-stdin <アカウントID>.dkr.ecr.<リージョン>.amazonaws.com
    
    참고로 AWS의 계정은 다음과 같이 자동으로 획득할 수 있다.
    $ aws sts get-caller-identity | jq -r .Account
    
    로그인 후 아래 명령을 사용하여 구축 및 압력을 가할 수 있습니다.
    $ docker build -t <コンテナ名> .
    $ docker tag <コンテナ名>:<タグ名> <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<コンテナ名>:<タグ名>
    $ docker push <アカウントID>.dkr.ecr.ap-northeast-1.amazonaws.com/<コンテナ名>:<タグ名>
    

    누른 컨테이너 정보 가져오기


    다음에 이전 장에서 추출한 컨테이너에 대한 정보를 가져오고 이 정보를 사용하여 Serverless에서 Lambda의 디버깅을 실행합니다.
    전제로 서버리스.다음 기술yml을 통해 옵션에서 수치를 전달할 수 있습니다.
    custom:
      # NOTE: sls removeなどを実行するのにオプションを指定せず実行できるようにするためのもの
      defaultAccount: dummy
      defaultDigest: dummy
    
    functions:
      hello:
        image: ${opt:account, self:custom.defaultAccount}.dkr.ecr.<リージョン>.<コンテナ名>@${opt:digest, self:custom.defaultDigest}
        events:
          - http:
              path: test
              method: get
    
    따라서 Serverless에 대한 정보가 제공됩니다.
    먼저 위에서 말한 바와 같이 다음 명령을 통해 계정 ID를 얻을 수 있습니다.
    $ aws sts get-caller-identity | jq -r .Account
    
    그 다음은 용기의digest입니다. aws-cli를 이용하여 창고의 일람표를 얻을 수 있기 때문에 jq를 사용하여 사용하고자 하는 이미지의 라벨을 선별하면digest를 얻을 수 있습니다.
    $ aws ecr list-images --repository-name <コンテナ名>               |
    $ jq '.imageIds[] | select(.imageTag=="<タグ名>") | .imageDigest' |
    $ tr -d '"'
    
    이후 다음에 얻은 값을 Serverless에 건네주면 디버깅을 할 수 있습니다.
    $ sls deploy --account <アカウントID> --digest <digest>
    
    여기까지의 일련의 절차를 스크립트로 정리하면 이렇게 느껴진다.
    region="ap-northeast-1"
    
    account=$(aws sts get-caller-identity | jq -r .Account)
    tag=$(uuidgen)
    
    aws ecr get-login-password --region $region                                         |
    docker login --username AWS --password-stdin $account.dkr.ecr.$region.amazonaws.com
    
    container="lambda_container_sample"
    target="$account.dkr.ecr.ap-northeast-1.amazonaws.com/$container"
    
    docker build -t $container .
    docker tag $container:$tag $target:$tag
    docker push $target:$tag
    
    digest=$(aws ecr list-images --repository-name $container | jq '.imageIds[] | select(.imageTag=="latest") | .imageDigest' | tr -d '"')
    
    sls deploy --account $account --digest $digest
    

    총결산


    이에 따라 커스텀런타임 환경에서 Serverless Framework의 컨테이너 대응 방법을 소개했다.
    솔직히 터치한 느낌에 잠시 대응한 느낌인데 앞으로 사용하기 편하도록 개선이 됐나요?이런 느낌이야.
    적어도 이번에 든 크리스탈과 공식 대응 언어 중 고와 같은 이동성이 높은 단이진법을 만들 수 있는 언어라면 지금 당장 대응할 필요가 있다는 미묘한 느낌이 든다.
    반대로 스크립트 언어나 용기를 미리 준비하고 싶다면 사용할 수도 있다.
    아까 deprovice용 스크립트를 보고 알았듯이 솔직히 그렇게 어려운 일은 하지 않았기 때문에 머지않아 로컬 Docker file를 자동으로 디자인할 것 같습니다.


    지허브 액션스용 depro용 워크플로우를 제작해 미리 게재했다.
    가능하면 참고하세요.
    name: lambda_container_sample
    
    on:
      push:
        branches: [ develop ]
    
    jobs:
      deploy:
        name: deploy
        runs-on: ubuntu-latest
        steps:
    
        - name: setup node.js
          uses: actions/setup-node@v1
    
        - name: install sls
          run: npm i -g serverless
    
        - name: checkout
          uses: actions/checkout@v1
    
        - name: configure aws credentials
          uses: aws-actions/configure-aws-credentials@v1
          with:
            aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
            aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
            aws-region: ap-northeast-1
    
        - name: login ecr
          id: login-ecr
          uses: aws-actions/amazon-ecr-login@master
    
        - name: build and push ecr
          env:
            ECR_REGISTRY: ${{ steps.login-ecr.outputs.registry }}
            ECR_REPOSITORY: lambda_container_sample
            IMAGE_TAG: ${{ github.sha }}
          run: |
            docker build -t $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG .
            docker push $ECR_REGISTRY/$ECR_REPOSITORY:$IMAGE_TAG
    
        - name: get aws account id
          id: get-aws-account
          run: |
            echo "::set-output name=ACCOUNT_ID::$(aws sts get-caller-identity | jq -r .Account)"
    
        - name: get ecr digest
          id: get-ecr-digest
          env:
            IMAGE_TAG: ${{ github.sha }}
          run: |
            echo "::set-output name=DIGEST::$(aws ecr list-images --repository-name lambda_container_sample | jq '.imageIds[] | select(.imageTag=="'$IMAGE_TAG'") | .imageDigest' | tr -d '"')"
    
        - name: deploy
          env:
            ACCOUNT_ID: ${{ steps.get-aws-account.outputs.ACCOUNT_ID }}
            DIGEST: ${{ steps.get-ecr-digest.outputs.DIGEST }}
          run: sls deploy --verbose --account $ACCOUNT_ID --digest $DIGEST
    

    좋은 웹페이지 즐겨찾기