Custom image kullanarak aws lambda uzerine sam ile deploy

AWS Lambda üzerine Serverless uygulama deployu yaparken docker image’ı kullanarak deploy etmeyi seçerseniz, aws nin sizin işinizi kolaylaştırması açısından bir tane base image’i bulunmaktadır.

Uygulamanızı çalıştırmak için aws base imageini kullanabilirsiniz, genel olarak aws base image’i uygulamanızı aws lambda ile çalışması için gerekli bileşenleri sağlar.

Aşağıdaki adreslerden base image’ini bulabilirsiniz.

  • DockerHub: amazon/aws-lambda-provided
  • ECR Public: public.ecr.aws/lambda/provided

Örneğin siz aşağıdaki gibi bir tane handler fonksiyonunuz var.

app.py

def handler(evet, context):
    return {"hello": "world"}

Dockerfile dosyanız aşağıdaki gibi olması ve sam’i kullanmanız yeterli olacaktır.

FROM public.ecr.aws/lambda/python:3.8

# Copy function code
COPY app.py ${LAMBDA_TASK_ROOT}

# Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile)
CMD [ "app.handler" ]

base image’i kullacaksanız bunlar yeterli oluyor, fakat eğer siz örnek veriyorum centos üzerinde koşan python ile çalışmasını istiyorsanız veya kendi imagenizi oluşturmak istiyorsunuz o halde Dockerfile dosyasınız üzerinde bir kaç değişikliğe daha ihtiyacınız var.

öncelikle Dockerfile dan başlayalım, AWS Lambda nın base image’ine bakacak olursak,

ADD file:7a22bebe0eb1979ae7e1a5345aaf33a07c60da54de060b073094bc3d02737863
ADD file:4baa3b5a5a1aa8592a734dbb214bc36c8418e911d81d0327fb81d8816dd6e50d
ADD file:89b37157418d607de3cb040839dfdeb3f8d312c464c19215dc468a861f7576cc
ADD file:cbc023ce63975263ac3037a209069cec3e364cedbba9ccdeb668607ee9f2dd8f
WORKDIR /var/task
ENV LANG=en_US.UTF-8
ENV TZ=:/etc/localtime
ENV PATH=/var/lang/bin:/usr/local/bin:/usr/bin/:/bin:/opt/bin
ENV LD_LIBRARY_PATH=/var/lang/lib:/lib64:/usr/lib64:/var/runtime:/var/runtime/lib:/var/task:/var/task/lib:/opt/lib
ENV LAMBDA_TASK_ROOT=/var/task
ENV LAMBDA_RUNTIME_DIR=/var/runtime
ENTRYPOINT [ "/lambda-entrypoint.sh" ]

Şimdi yukarıdaki base image’imiz ve biz onu Dockerfile da from ile aldıktan sonra serverless uygulamamız için gerekli paketleri indiriyoruz daha sonrasındada CMD de handler fonksiyonumuzu veriyoruz ve uygulamamız ayağa kalkıyor, burada kendi image’imizi oluşturacaksak eğer dikkat etmemiz gereken noktalar şunlar;

  • ENTRYPOINT
  • CMD olmalı
  • Uygulamamız AWS Lambda üzerinde koşabilmesi için, gerekli olan awslambdaric’i barındırmalı
  • ve eğer serverless uygulamamızı fastapi kullanarak yazdıysak, app’imiz handler’e çeviren magnum kurulu olmalı.

bu durumda image’in son hali aşağıdaki gibi olacaktır.

Dockerfile

FROM python:3.8.10

RUN apt-get update && \
  apt-get install -y \
  g++ \
  make \
  cmake \
  unzip \
  libcurl4-openssl-dev

COPY . /app
WORKDIR /app

RUN pip install --upgrade pip
RUN pip install awslambdaric

RUN chmod +x ./lambda-entrypoint.sh
ENTRYPOINT [ "./lambda-entrypoint.sh" ]
CMD [ "main.handler" ]

main.py

def handler(event, context):
    return {"hello": "world"}

lambda-entrypoint.sh

#!/bin/sh
if [ -z "${AWS_LAMBDA_RUNTIME_API}" ]; then
  exec /usr/local/bin/aws-lambda-rie /usr/local/bin/python -m awslambdaric $@
else
  exec /usr/local/bin/python -m awslambdaric $@
fi

Aşağıdaki template, sam templatedir daha fazla bilgi için lütfen araştırınız.

template.yaml

AWSTemplateFormatVersion: "2010-09-09"
Transform: AWS::Serverless-2016-10-31
Description: SAM Template for myapi

Resources:
  MyAPIFunction:
    Type: AWS::Serverless::Function
    Properties:
      Events:
        MYAPI:
          Properties:
            RestApiId:
              Ref: SSLAPIFunctionGateway
            Path: /{proxy+}
            Method: ANY
          Type: Api
      FunctionName: MyAPI
      Timeout: 300 # timeout of your lambda function
      MemorySize: 128 # memory size of your lambda function
      PackageType: Image
      Role: !Sub arn:aws:iam::751347607460:role/lambda-role

    Metadata:
      Dockerfile: Dockerfile
      DockerContext: .
      DockerTag: latest

  MyAPInGateway:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      OpenApiVersion: "3.0.0"

bütün bunlardan sonra

$ sam build
$ sam deploy --guided

yazdıktan sonra apinizin adresine tıklayarak sonucu görebilirsiniz.

bu komutlardan sonra samconfig dosyanız oluşacaktır, oda oluştuktan sonra apinizde değişiklik yaptığınızda ve canlıya almak istediğinizde sadece

$ sam build
$ sam deploy

demeniz yeterli olacaktır.


Last update: June 15, 2022
Created: June 15, 2022