개발학습일지

[Docker] ECR에 도커이미지 업로드 가능토록 AWS 설정 및 Docker 로컬에 설치하기 본문

AWS/Docker

[Docker] ECR에 도커이미지 업로드 가능토록 AWS 설정 및 Docker 로컬에 설치하기

처카푸 2024. 5. 27. 18:02

ECR에 도커이미지 업로드 가능토록 AWS 설정 및 Docker 로컬에 설치하기

 

AWS 람다 serverless 프레임워크 사용하는데, 

python, numpy 설치하니 오류가 떴다.

 

그래서 AWS Lambda 디스크 용량을 확인해 보니, 

50MB여서 용량 부족으로 에러가 발생한 것으로 예상되었다.

 

그래서 도커를 사용해서 컨테이너화를 할 것이다.

 

1. 도커 설치하기

(https://www.docker.com/products/docker-desktop/)

- 계속 설치해서 로그인까지 하면 된다. (컴퓨터 재부팅 필수!!!!)

 

2. AWS ECR에서 새로운 퍼블릭 리포지토리를 만들고 설정한다.

2-1. IAM 유저 권한 설정해 준다.

- 자격증명 만드는 법 -> 참고. https://msdev-st.tistory.com/142

- AmazonEC2 ContainerRegistryFullAccess 권한 추가 해주기

IAM 사용자 권한 추가하기

2-2. 프리티어 사용을 위해 퍼블릭 리포지토리 생성

- 이름만 잘 적어서 생성하면 된다. 다른 부분은 작성하지 않는다.

ECR 검색 리포지토리 선택하기
리포지토리 생성

2-3. 생성 완료하면 해당 리포지토리 permissions에 들어가서 권한을 설정해 준다.

- 권한 설정에서 체크해야 하는 부분!!

권한 설정

- 권한 '정책 JSON'을 필요한 부분을 수정한다. (나는 ecr-public:GetAuthorizationToken 추가하여 수정했다.)

 

3. serverless flask를 docker image로 만들기

3-1. 도커 파일 만들기

- 파일 이름 Dockerfile

- 내용 : 나의 설치 라이브러리들을 똑같이 설치해 주고 앱 핸들러해주는 코드

FROM public.ecr.aws/lambda/python:3.10
COPY . ${LAMBDA_TASK_ROOT}
COPY requirements.txt  .

RUN yum -y install gcc
RUN pip3 install -r requirements.txt --target "${LAMBDA_TASK_ROOT}"

CMD ["app.handler"]

 

3-2. 도커 파일을 만들면 VSC에서 도커앱 설치 할까 물어보는데 설치하면 된다.

Dockerfile

3-3. .dockerignore 파일 생성

- 필요 없는 파일은 안 올라가게 설정하는 파일이다. 깃이그노어 같은 것이다.

- 코드 작성

#.dockerignore
__pycache__/
.git/
.serverless/
.gitignore
.dockerignore
serverless.yml

3-4. serverless.yml 파일 수정

- 앱 이미지를 추가해 준다.

provider:
  name: aws
  runtime: python3.10
  region: ap-northeast-2
  ecr:
    images:
      appimage:
        path: ./

functions:
  app:
    image: 
      name: appimage
    timeout: 30
    events:
      - httpApi: '*'

- 플러그인 부분은 삭제하고 플러그인 부분에 적혀있던 serverless-wsgi는

  따로 requirments.txt에 작성해서 설치되도록 만든다.

- requirments.txt 에 작성되어 있는 내가 람다에 설치하려는 패키지들

Flask==1.1.4
Werkzeug==1.0.1
markupsafe==2.0.1

serverless-wsgi

flask-restful 
mysql-connector-python 
psycopg-binary 
passlib 
flask-jwt-extended 
email-validator

numpy
pandas

3-5. app.py 파일에서 serverless-wsgi 임포트 하기

- 임포트 하려고 보니 현재 로컬 가상환경에 설치되어 있지 않아 설치해 줬다

$ pip install serverless-wsgi

- 임포트 serverless_wsgi

3-6. app.py 파일에 Dockerfile에 작성한 앱 핸들러 함수 코드를 작성한다.

- Entry Point 밑에 작성함.

- 작성 코드

...

def handler(event, context) :
    return serverless_wsgi.handle_request(app, event, context)

if __name__ == '__main__' :
    app.run()

 

4. 다 설정을 완료했으면 배포한다.

$ sls deploy

- 완료!!