본문 바로가기

RestfulAPI

Doker 설치하여 AWS에 있는 Lamda 에 배포하기

 

Docker란 무엇인가?

Docker는 컨테이너화된 애플리케이션을 개발, 배포 및 실행하기 위한 오픈 소스 플랫폼이다. 이를 통해 개발자는 어디서나 일관된 환경에서 코드를 실행할 수 있게 되며, 인프라 환경에 구애받지 않고 애플리케이션을 손쉽게 배포할 수 있다.

Docker의 주요 개념

Docker의 핵심 개념은 다음과 같다:

  • 이미지 (Image): 애플리케이션과 그 환경을 포함한 불변의 파일이다. 도커 이미지는 컨테이너를 생성하는 템플릿 역할을 한다.
  • 컨테이너 (Container): 이미지를 실행한 상태로, 애플리케이션이 동작하는 환경이다. 각 컨테이너는 격리된 공간에서 실행된다.
  • Docker Hub: 도커 이미지를 공유할 수 있는 레지스트리 서비스이다. 개발자는 Docker Hub를 통해 이미지를 검색하고 다운로드할 수 있다.

 

 

 

도시락 상자 예시

  1. 도시락 상자 (컨테이너):
    • 엄마가 만든 맛있는 음식을 도시락 상자에 담는다고 생각해봐. 도시락 상자는 음식(프로그램)을 안전하게 담아서 어디든지 가지고 다닐 수 있게 해줘.
    • 이 도시락 상자가 바로 Docker의 '컨테이너'야. 컨테이너는 프로그램과 필요한 모든 것을 담아서 어디서든지 실행할 수 있게 해주는 거야.
  2. 요리법 책 (이미지):
    • 엄마가 음식을 만들 때 요리법 책을 보고 만드는 것처럼, Docker도 프로그램을 만들 때 '이미지'라는 걸 사용해. 이미지는 프로그램을 만들고 실행하기 위한 지침서 같은 거야.
    • 이 요리법 책(이미지)을 보면 어떤 재료(파일)와 도구(설정)가 필요한지 알 수 있어.
  3. 도시락 가게 (Docker Hub):
    • 엄마가 요리법 책을 사고 싶을 때 서점에 가는 것처럼, Docker는 'Docker Hub'라는 가게에서 이미지를 다운받아 사용할 수 있어. Docker Hub에는 다양한 프로그램 이미지를 찾을 수 있어.

왜 Docker가 좋을까?

  1. 일관성:
    • 엄마가 집에서 만든 음식이든, 학교에서 만든 음식이든 도시락 상자에 담겨 있으면 항상 같은 맛을 낼 수 있어. Docker도 프로그램을 어디서 실행하든 항상 똑같이 동작하게 해줘.
  2. 편리함:
    • 도시락 상자에 음식을 담으면 언제든지 어디서든지 꺼내 먹을 수 있잖아. Docker도 프로그램을 쉽게 만들고 배포하고 실행할 수 있게 해줘.
  3. 효율성:
    • 도시락 상자는 작은 공간에 여러 음식을 담을 수 있어서 효율적이야. Docker도 컴퓨터 자원을 효율적으로 사용해서 여러 프로그램을 동시에 실행할 수 있어.
  • 일관성: 개발, 테스트, 프로덕션 환경에서 동일한 환경을 보장한다.
  • 효율성: 시스템 자원을 효율적으로 사용하며, 빠른 배포와 확장이 가능하다.
  • 이식성: 컨테이너는 어디서나 실행될 수 있으므로, 특정 인프라에 종속되지 않는다.

 

Docker 설치방법

1.docker 공식 홈페이지에 접속한다.

https://www.docker.com/

 

Docker: Accelerated Container Application Development

Docker is a platform designed to help developers build, share, and run container applications. We handle the tedious setup, so you can focus on the code.

www.docker.com

 

환경에 맞게 설치 한다.

설치가 끝나면 재부팅 할 것 이냐고 묻는데 꼭 재 부팅 해야 한다. 안그러면 아래와 같은 오류가 생긴다.

또는

2. AWS에 들어가서 IAM 검색후 들어 간다음 사용자 클릭해준다.

사용자 이름에 있는 api_dev 이것을 클릭해주자.

권한 클릭 후 권한 추가 클릭

직접 정책 연결 체크

권한 아래의 사진 속에 있는 것만 모두 체크해준다.

 

그다음 이것도 권한 추가 해준다.

그 다음 AWS에서 검색창에 container 검색 후 빨간 동그라미 쳐있는 곳 클릭

지역설정이 서울인지 잘 확인해본다.

리포지토리 생성 클릭

퍼블릭으로 설정(프라이빗은 과금 될 수 있음)

리포지토리 이름은 배포할 폴더명-dev 로 지어주면 된다. 

그다음 레파지토리 생성 눌러준다.(다른 설정 건드리지 않는다)

권한 전부 추가하

정책 JSON 편집 클릭

ecr-public:GetAuthorizationToken

이 코드 작성 하고 ,(쉼표) 잘 확인한다.

VSC  코드로 들어가서 Dokerfile 로 파일을 하나 만든다. 그다음 Docke 확상 설치 문구가 뜨면 설치해준다.

익스텐션에 들어가서 docker 설치해주자.

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"]

그 다음 .dockerignore 이라는 파일을 또 만들어주고, 거기에 코드를 넣어준다.(아래 참조)

__pycache__
.git
.serverless
.gitignore
.dockerignore
serverless.yml

serverless.yml 파일도 아래화면 처럼 수정해주자.

service: aws-s3-upload-app

frameworkVersion: '3'

custom:
  wsgi:
    app: app.app

provider:
  name: aws
  runtime: python3.10
  region: ap-northeast-2

functions:
  api:
    handler: wsgi_handler.handler
    events:
      - httpApi: '*'

plugins:
  - serverless-wsgi
  - serverless-python-requirements

그다음

requirements.txt 파일에 들어가서 아래 코드 넣어준다.

(pandas,serverless-wsgi,numpy)가 추가됐다.

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
pandas
numpy

이제 터미널 이나 cmd 창으로 들어가서

pip install serverless-wsgi

함으로써 serverless-wsgi 설치

app.py로 들어가 아래 코드 추가

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

그후 터미널에 sls deploy 함으로써 배포 해주고, 결과를 확인해보자.

잘 되는 것을 볼 수 있다.