DOCKER와 AWS ECR를 이용하여 deploy해보기.

FLASK로 구현된 SHOERCH 웹서버를 Docker와 AWS를 이용하여 deploy해보자.



Flask 로 구현된 Shoerch가 localhost에서는 잘 작동한다. 하지만.... 다른 사람들도 이용하게 해보고 싶다. 그래서 Shoerch project를 Dockerize하여 AWS ECS과 Route53,  Elastic IP 등을 이용해서 Deploy해보았다.


1. Dockerize


Dockerize하기에 앞서, Docker 입문자에게 매우 유용한 게시글을 참조하였다.
https://github.com/sangyeol-kim/ausg-docker-seminar
위 post를 읽는 것을 강력히 추천한다..

Docker에 올려줘야할 local의 파일들

/Users/jeongjoonhyun/Desktop/TIMBERLAND_data/TIMBERLAND-batches-bin/ (test_batch.bin가 들어있음. Client가 이미지를 제출하면 binary화 해서 test_batch.bin에 overwrite하게 됨)
/Users/jeongjoonhyun/Desktop/TIMBERLAND_model (TIMBERLAND 신발 데이터에 대해서 학습시킨 모델 파라미터 directory)
/Users/jeongjoonhyun/PycharmProjects: 
      -Shoefinder (Flask app, data processing & crawling)
            - static
            - templates
                  - index.html
                  - show_results.html
            - server.py
            - crawler.py  (신발 이미지 data를 crawling해오는 code)
            - make_binary_image.py (신발 이미지 data를 cifar10 binary data 와 같은 형식으로 conver해주는 code)

      - models (ResNet model code cloned from https://github.com/tensorflow/models)

      - Dockerfile
      - requirements.txt

Docker Image에는 위에 빨간색으로 명시된 파일들( Shoefinder, models, TIMBERLAND_model ) 을 올릴 것이다.

Dockerfile


FROM ubuntu:latest
MAINTAINER doublejtoh "doublejtoh@naver.com"
RUN apt-get update \
  && apt-get install -y python3-pip python3-dev locales \
  && cd /usr/local/bin \
  && ln -s /usr/bin/python3 python \
  && pip3 install --upgrade pip
RUN locale-gen ko_KR.UTF-8     # container 내 한글 적용하기 위해서
ENV LC_ALL ko_KR.UTF-8.        # container 내 한글 적용하기 위해서
RUN mkdir -p /Users/jeongjoonhyun/PycharmProjects/models
RUN mkdir -p /Users/jeongjoonhyun/Desktop/TIMBERLAND_data/TIMBERLAND-batches-bin/
RUN mkdir -p /Users/jeongjoonhyun/Desktop/TIMBERLAND_model
RUN mkdir -p /Users/jeongjoonhyun/PycharmProjects/shoefinder
COPY models /Users/jeongjoonhyun/PycharmProjects/models
COPY shoefinder /Users/jeongjoonhyun/PycharmProjects/shoefinder
COPY TIMBERLAND_model /Users/jeongjoonhyun/Desktop/TIMBERLAND_model
WORKDIR /Users/jeongjoonhyun/PycharmProjects/shoefinder
RUN pip3 install -r requirements.txt
ENTRYPOINT ["python3"]
CMD ["server.py"]

requirements.txt

requirements.txt를 만들 때는 auto-generate해주는 python pacakge (pipreqs)를 이용하였다.
pipreqs를 이용하지 않고 pip3 freeze > requirements.txt 를 이용할 수 있기는 하지만 이는 모든 python package를 requirements.txt에 포함시기기 때문에 적절하지 않다.


0. docker 를 실행한다.
1. docker image를 만든다.
   docker build -t doublejtoh/shoerch:latest .
2. (선택 사항) docker image를 dockerHub에 push한다. 이 때, DockerHub에 이미지를 올리기 위해서는 이미지 이름을 <dockerhub_id>/<image_name>으로 해야한다고 한다.
   docker build -t doublejtoh/shoerch:latest .

2. Deploy with AWS ECS, Route 53, Elastic IP


ECR Repository 생성

AWS console을 통해서 ECR Repository를 생성한 후,
$ aws ecr get-login --no-include-email --region us-west-2
를 입력한다. (region option에는 url에 들어있는 region 값을 써줘야함에 주의)
반환되는 docker login 명령어를 복붙하여 그대로 쳐준다.
$ docker login -u AWS -p <token val> <url>

$ docker tag doublejtoh/shoerch:latest <url>
$ docker push <url>

AWS Console을 통해 ECR Repository에 Docker image가 올라가게 된 것을 확인 할 수 있을 것이다.

그 후 부터는,  https://github.com/sangyeol-kim/ausg-docker-seminar/blob/master/3.AWS_ECS/README.md 를 차차 따라하면 된다.
진행하면서 문제를 겪었던 부분을 정리하자면 다음과 같다.

1. Shoerch는 Tensorflow Parameter들을 불러와서 연산을 해야하는 logic이 있기 때문에 memory 사용량이 높다. EC2 cluster 생성시 EC2 인스턴스 유형을 t1.micro(memory 1GB)로 하니 나중에 작업을 시작하자마자 stopped되버리는 현상을 발견했었다. (aws console task log를 통해 확인할 수 있다.) 따라서 t1-medium(memory 4GB)로 volume up했다.
또한, 작업 정의 생성 -  container 추가 - container 메모리 제한을 2048MB로 두었다.

2. 작업 정의 생성 - container 추가 - 포트 매핑 을 호스트 포트를 80, 컨테이너 포트를 5000으로 주었다. (server.py에서 port를 5000으로 주었기 때문에)


Route 53, Elastic IP를 통해서 shoerch.com를 EC2 instance에 연결해주기.

https://stackoverflow.com/questions/12899887/how-to-change-public-dns-in-amazon-ec2
에 아주 깔끔하게 잘 정리되어있다.

1. AWS console에서 Route 53 domain를 등록한다. 시간이 꽤 걸린다. 10분정도?

2.  '탄력적 IP'에서 새 주소 할당을 통해 elastic ip를 확보한다.

3.  할당 받은 탄력적 IP를 아래 과정을 통해 EC2 Instance에 연결시켜준다.














4. 아까 전에 등록한 domain(shoerch.com)의 record set에 아까 전에 할당 받은 탄력적 IP를 추가해준다.










































댓글