AWS

AWS ECR 사용사례 [serverless requirements.txt ] 사이킷런 라이브러리를 람다로 배포시 문제가 발생할때

leopard4 2023. 4. 4. 13:20

문제 
패키지설치가 되지않을때 방법

 

람다이미지를 도커에서 받아서 필요한 의존성을 설치하고 ecr에 배포하는것

과정 요약 
이미지를 도커로 가져와서 가져온 이미지에 서버프로젝트를 넣고 
deploy 해서 ecr로 보낸다 ecr에서 람다로 배포해주는것
aws iam 권한설정 아마존EC2contrainer레지스트리 퍼블릭 풀 액세스 설정
ecr서비스로 이동 (엘라스틱 컨테이너 레지스트리)
region을 서울로 한다.
repositories생성
프라이빗 
레파지토리 이름은 serverless.yml 파일의 서비스 이름과 같아야하고 마지막에 -dev를 붙여서 생성
만들어진 레파지토리를 클릭해서 권한-권한편집 IAM개체에 아까 준 IAM을 선택 
첫번째 ECR 작업을 전부다 체크한다. 저장

레파지토리를 다시 누르고
체크- 작업- 권한
위에서 저장한 작업목록이 나온다.
정책 JSON편집 
액션에 BathchCheck 사이에
"ecr:GetAuthorizationToken", 추가 (토큰이 있어야 배포가 되기때문)


사이킷런을 람다에서 사용시 람다 환경셋팅

서버코드 프로젝트에 파일수정부분 5개 [아래코드에서 들여쓰기는 다시해야됨]

[Dockerfile] 파일 생성
FROM public.ecr.aws/lambda/python:3.9 해당버전의 이미지를 가져와라 
COPY . ${LAMBDA_TASK_ROOT} 여기로 카피
COPY requirements.txt . 리눅스의 현재 경로에 복사하라

RUN yum -y install gcc # 사이킷런을 사용시 gcc를 리눅스에 설치해야되기때문
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}" 텍스트 파일을 람다태스크 경로에 설치하라

CMD ["app.handler"] 람다로 실행을 시키라는것


깃이그노어와 같음
[.dockerignore] 파일생성
__pycache__/
.git/
.serverless/
.gitignore
.dockerignore
serverless.yml 

[serverless.yml] 
provider: 부분에만수정
region: 밑에
ecr:     #엘라스틱 컨테이너 
   images:
     appimage: 
        path: ./    해석: 이경로에 있는 파일들 이미지로해서 올린다는것

functions:

app:
    image:
      name: appimage
    events:
      -httpApi: '*'     해석 : 내가배포한 이미지로 람다펑션을 실행하겠다는것

펑션밑에는 싹다 지운다 api 어쩌고 등등


[requirements.txt]
serverless-wsgi 요거만 추가 # 터미널에서도 pip install serverless-wsgi  해야함.
여기선 scikit-surprise 를 사용했기때문에 해당내용도 추가함

[app.py]
import serverless_wsgi
import os
os.environ["JOBLIB_MULTIPROCESSING"] = "0"
os.environ["HOME"] = "/tmp" # 홈디렉토리를 템프로하겠다

def handler(event, context): # 배포한 이미지가 람다로 실행되게하는 함수
return serverless_wsgi.handle_request(app, event, context) 

__name__ == '__main__' 위에 해당핸들러를 작성해야한다.

위의작업이 모두 끝나면 
서버파일로 돌아가서 
sls deploy 한다.


순서정리
1. docker 다운로드 후 실행 [반드시 도커를 실행 한상태에서 진행할것 ]
2. VS Code 파일 5개 수정
3. AWS에서 IAM 및 ECR  설정
4. 터미널에서 $ sls deploy 
결론 : 이렇게하면 도커로 람다를 배포한것.