• AWS SAM
  • AWS SAM Template
    • Event-driven architecture , Infrastructure as Code (IaC) , Serverless on AWS 를 추구하는...
    • https://s12d.com/sam-ws-en-intro
    • https://www.youtube.com/playlist?list=PLJo-rJlep0ED198FJnTzhIB5Aut_1vDAd
    • https://serverlessland.com
  • SAM CLI 
    • https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html
      • sam init : 새 애플리케이션 프로젝트 구조 생성.
      • sam validate
      • sam build : (.aws-sam 하에) 배포할 애플리케이션 파일 및 디펜던시 구성.
        • build.toml : (빌드 및 배포 시) samcli 가 참조하는 default parameters 의 configuration file 입니다.
        • ...
      • sam package
      • sam deploy : 배포 설정 -> CloudFormation 템플릿 변환 -> AWS 클라우드 리소스 프로비저닝.
      • sam pipeline : 지원되는 CI/CD 를 사용하는 파이프라인 생성.
      • sam list & log : 배포된 리소스 목록 및 로그 확인. (내장 모니터링 도구 AWS X-Ray 활용가능)
      • sam sync : 로컬 코드 변경 감시 -> 클라우드 자동 동기화.
        • Accelerate ???
      • sam local generate-event : AWS 서비스 이벤트 페이로드 샘플 생성.
      • sam local invoke : 로컬에서 람다함수 일회성 호출.
      • sam local start-api : 로컬에서 HTTP 서버 호스트를 통해 테스트. (API GW 에서 호출되는 람다함수)
      • sam local start-lambda : 로컬에서 에뮬레이션되어, AWS CLI 및 SDK 를 통해 테스트.
      • sam remote invoke
    • Configuration File (samconfig.toml)
      • ...
  • Lambda 이미지
    • 0) SAM 빌드용 이미지
      • https://gallery.ecr.aws/sam/build-python3.11
    • https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images-create.html
    • 1) Lambda용 파이썬 이미지
      • https://github.com/aws/aws-lambda-base-images/tree/python3.11
      • https://gallery.ecr.aws/lambda/python
      • 런타임 인터페이스 에뮬레이터 (로컬 테스트 용도)
      • 런타임 인터페이스 클라이언트 (파이썬 실행 및 람다와 상호작용)
      • https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/runtimes-api.html
    • 2) Lambda용 기본 이미지
      • https://gallery.ecr.aws/lambda/provided
      • Amazon Linux 2 운영 체제
      • 런타임 인터페이스 에뮬레이터
      • 원하는 언어의 "런타임 인터페이스 클라이언트" 직접 설치
    • 3) 비AWS 이미지
      • https://hub.docker.com/_/python/tags
      • Alpine Linux, Debian 등을 기반으로~ 10GB의 비압축 이미지 크기 지원
      • "런타임 인터페이스 에뮬레이터" & "런타임 인터페이스 클라이언트" 직접 설치
  • Lambda (비AWS) 이미지 커스텀 
    • 1. "런타임 인터페이스 에뮬레이터" Test
      • https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/images-test.html
      • 1-1) (비AWS) 이미지의 x86 혹은 arm64 에 맞게 "aws-lambda-rie 바이너리" 설치
        • https://github.com/aws/aws-lambda-runtime-interface-emulator
      • 1-2) 해당 이미지 실행
        • ex) docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080
          • --entrypoint /aws-lambda/aws-lambda-rie
          • 이미지:태그 /usr/local/bin/python -m awslambdaric main.lambda_handler
        • "aws-lambda-rie 바이너리" 가 볼륨 마운트 됨
        • "aws-lambda-rie 바이너리" 를 진입점으로 ???
        • "usr/local/bin/python -m awslambdaric" : 파이썬 인터프리터 명령으로 "런타임 인터페이스 클라이언트" 실행 
        • "main.lambda_handler" : 람다 함수 핸들러
      • 1-3) 이벤트 전달
        • ex) curl -XPOST "http://localhost:9000/2015-03-31/functions/function/invocations" -d '{"payload":"hi"}'
    • 2. "런타임 인터페이스 클라이언트" Test
      • https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/python-image.html
      • 2-1) 다운로드 혹은 설치
        • https://github.com/aws/aws-lambda-python-runtime-interface-client
        • https://pypi.org/project/awslambdaric
      • 2-2) Dockerfile
        • # Define custom function directory
          ARG SRC_DIR="/src"
          
          FROM python:3.11 AS build-image
          
          # Include global arg in this stage of the build
          ARG SRC_DIR
          
          # Copy function code
          RUN mkdir -p ${SRC_DIR}
          #COPY ./src ${SRC_DIR} # 굳이 여기서 안하고, compose상에서 하거나~ sam 경우는 따로하기?
          
          # Install the function's dependencies
          RUN pip install --upgrade pip setuptools wheel
          RUN pip install --target ${SRC_DIR} awslambdaric
          
          COPY ./src/requirements.txt .
          RUN pip install --no-cache-dir -r requirements.txt && rm requirements.txt
          
          #WORKDIR /tmp
          #RUN mkdir -p site-packages bin
          #RUN cp -r /usr/local/lib/python3.11/site-packages/* ./site-packages
          #RUN cp -r /usr/local/bin/* ./bin
          #--------------------------------------------------------------------------
          # Use a slim version of the base Python image to reduce the final image size
          FROM python:3.11
          
          # Include global arg in this stage of the build
          ARG SRC_DIR
          # Set working directory to function root directory
          WORKDIR ${SRC_DIR}
          
          # Copy in the built dependencies
          #COPY --from=build-image /tmp/site-packages /usr/local/lib/python3.11/site-packages
          #COPY --from=build-image /tmp/bin /usr/local/bin
          COPY --from=build-image ${SRC_DIR} ${SRC_DIR}
          
          # 음... '토륨' 같은거 동작 시키려면, 일단 설치 정확히 해보고... 그다음에...
          RUN set -x \
              && apt-get update \
              && apt-get install -y \
                  원하는것들 \
              && rm -rf /var/lib/apt/lists/*
          #RUN apk add tzdata \
          #    && cp /usr/share/zoneinfo/Asia/Seoul /etc/localtime \
          #    && echo "Asia/Seoul" > /etc/timezone \
          #    && apk del tzdata
          
          # Set runtime interface client as default command for the container runtime
          #ENTRYPOINT ["/usr/local/bin/python", "-m", "awslambdaric"]
          
          # Pass the name of the function handler as an argument to the runtime
          #CMD ["main.lambda_handler"]
        • 222
      • 2-3) (멀티 플랫폼) 빌드 
        • 각 x86 , arm64 에서 빌드 -> "exec format error" 나올수있음...
        • https://stackoverflow.com/questions/68247643/aws-lambda-alpine-python-container-shows-image-launch-error-exec-format-error
        • https://velog.io/@baeyuna97/exec-user-process-caused-exec-format-error-에러해결
        • 예) docker buildx build --platform=linux/arm64
    • ...
  • SAM PackageType: Image 배포 방식
    • 방식1
      • 도커 이미지 빌드 및 ECR 으로 푸쉬
      • ImageUri 및 ImageConfig(Cmd,EP,WorkDir) 을 Properties에 직접 명시한다
      • (sam build 없이) sam deploy --guided 으로 배포
    • 방식2
      • Metadata ((Dockerfile,DockerContext,DockerTag)) 를 직접 작성한다.
      • sam build -> (도커 이미지 빌드 및 ECR 으로 푸쉬까지 해줬던거 같음) -> (samconfig.toml 생성됨?) -> sam deploy
  • Lambda (비AWS) 이미지 -> boto3 세션 이슈
    • (순수 Python Docker 같은) 이미지에서 boto3 를 사용하는 과정에서~
    • 로컬에선,
      • ${HOME} 이 /root 라(?) 도커컴포즈 에서~ /root/.aws/config 및 /root/.aws/credentials 마운트하면...
      • boto3 Session() 하면 됨
    • 람다에선,
      • 일단... ${HOME} 이 안나옴 !?!?!? 왜죠
      • Dockerfile 에 홈 지정에 문제가 있었나 ??? 암튼 지정한 WORKDIR 가 pwd 으로 나옴...
      • 결과적으로, boto3 Session() 하면 -> 프로파일 등이 왜 없냐는 식으로 에러!
      • 그래서~ "COPY ... /src/.aws/config" 및 sam.yml 환경변수 (AWS_PROFILE,AWS_CONFIG_FILE) 해주니 인식 함.
      • 결론적으론, 커스텀 이미지를 쓰면... config 를 못찾는데 credentials 은 또 Lambda Role 에 부여된것으로 잘 찾는다?
  • "Permission denied" 혹은 "Unable to import module" 이슈
    • https://stackoverflow.com/questions/65413970/aws-lambda-failed-with-error-errno-13-permission-denied-var-task-lambda-fu
    • https://stackoverflow.com/questions/72041124/error-permissionerror-errno-13-permission-denied-var-task-main-py
      • https://docs.aws.amazon.com/ko_kr/lambda/latest/dg/troubleshooting-deployment.html
    • /src 디렉토리 파일의 권한 문제로 해결
  • ...

'AWS' 카테고리의 다른 글

The Complete AWS SAM Workshop  (0) 2023.07.18
AWS Marketplace (AMI EC2Launch V2)  (0) 2023.03.05
AWS SAM <- Mangum(fastAPI)  (0) 2022.08.09
Amazon EFS  (0) 2022.05.19
Amazon VPC  (0) 2022.04.29

+ Recent posts