- 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)
- ...
- https://docs.aws.amazon.com/serverless-application-model/latest/developerguide/serverless-sam-cli-command-reference.html
- 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의 비압축 이미지 크기 지원
- "런타임 인터페이스 에뮬레이터" & "런타임 인터페이스 클라이언트" 직접 설치
- 0) SAM 빌드용 이미지
- 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" : 람다 함수 핸들러
- ex) docker run -d -v ~/.aws-lambda-rie:/aws-lambda -p 9000:8080
- 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
- ...
- 1. "런타임 인터페이스 에뮬레이터" Test
- 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
- 방식1
- 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 |