Lambda Container 연습

<Cloud>/AWS|2021. 8. 25. 10:20
반응형
  • 참조한 영상 (쉽고 괜찮다)

https://www.youtube.com/watch?v=23fE57EFRK4

https://github.com/srcecde/aws-tutorial-code/blob/master/lambda/container-image/app.py

 

: EC2(우분투) 세팅
sudo apt-get update    # sudo yum update 
sudo apt-get install docker-compose  #sudo yum install docker-compose
sudo apt install awscli -y

mkdir lambda-docker  //파일생성
// 그리고 여기에 깃허브에 올라와있는 파일 3개(app.py, requirements.txt, Dockerfile 업로드)
vim app.py
vim Dockerfile
vim requirements.txt
: EC2(centos version) 세팅
# centos버전

sudo yum update
# docker-compose 설치
sudo curl -L "https://github.com/docker/compose/releases/download/1.27.4/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

# docker-compose 실행 권한 부여
sudo chmod +x /usr/local/bin/docker-compose

# 설치된 docker-compose 실행 확인
docker-compose --version

sudo yum install docker
aws configure

# https://league-cat.tistory.com/347 도커 에러 참조

sudo yum install git -y
# git clone ~~~~~ 
sudo service docker start
sudo usermod -a -G docker ec2-user

 

: ECR 접속해서 리파지토리만들기

: 만든 리파지토리 눌러서 '푸시명령보기' 누르고 나오는 명령어 차례차례 터미널에 입력

** 추가적으로 맨앞에 sudo 꼭 붙여야 한다

** 중간에 에러두번나는데

  1. aws configure 로 해결

https://stackoverflow.com/questions/60583847/aws-ecr-saying-cannot-perform-an-interactive-login-from-a-non-tty-device-after

  1. sudo apt-get install gnupg2 pass로 해결 (우분투일떄만 해주면 됨

: 다 만들면 람다에서 컨테이너 이미지로 새로생성 가능

 

S3 버킷안에 있는거 복사해오기(EC2로)
aws s3 cp s3://ys-profet-package-model/profet_trained_model/ ./s3_file/  (에러)

https://stackoverflow.com/questions/45109533/aws-cli-s3-copying-file-locally-using-the-terminal-fatal-error-an-error-occu 참조

aws s3 cp s3://ys-profet/package_model_for_lambda_container/ ./s3_file --recursive

 

 

< 도커 용어정리 >

CMD ? ENTRYPOINT? → 컨테이너 실행시 동작 명령어 (전자) , 컨테이너 구동시 실행할 명령어 (후자)

ARG?

ARG 명령어 는 빌드 시 전달할 수 있는 변수를 정의합니다 . Dockerfile에 정의되면 이미지를 빌드하는 동안 --build-arg 플래그로 전달할 수 있습니다. Dockerfile에 여러 ARG 명령어가 있을 수 있습니다. ARG는 Dockerfile에서 FROM 명령어 앞에 올 수 있는 유일한 명령어입니다.2019. 9. 16.

https://github.com/heowc/programming-study/issues/90

alpine?

http://labs.brandi.co.kr/2021/01/20/hwangsg.html

초반에는 직접 빌드하여 올려두고 사용하였으나 현재는 각종 공식 업체에서 기본 이미지를 생성하여 제공하고 있고, Dockerfile에 alpine버전으로 가져와서 필요한 것만 빌드하여 저용량으로 이미지를 수월하게 만들 수 있게 되었습니다. 이렇게 생성된 이미지를 가지고 실행하면 컨테이너가 생성되고 해당 공간은 내부에 전혀 영향 없는 독립적인 별개의 공간으로 활용 할 수 있습니다. docker-compose를 이용하면 더 쉽게 여러 개의 컨테이너를 실행 할 수 있습니다.

https://jonnung.dev/docker/2020/04/08/optimizing-docker-images/ (좋음!)

  • RUN, ADD, COPY 이 3가지 단계만이 레이어로 저장되고, CMD, LABEL, ENV, EXPOSE 등과 같이 메타 정보를 다루는 부분은 임시 레이어로 생성되지만 저장되지 않아 도커 이미지 사이즈에 영향을 주지 않는다.
  • ..
  • 그래서 Alpine 리눅스 이미지를 사용한다면 모든 Python 패키지에서 C 코드를 컴파일 해야 하므로 도커 이미지를 빌드하는 시간이 상당히 많이 소모된다. → GCC 나온이유!!!!!!
  • 추가로 덧붙이자면 Alpine 리눅스 이미지를 베이스 이미지로 사용한 Python 이미지는 용량도 크고, 몇 가지 버그들에 대한 취약점도 갖고 있다고 한다.
도커관련해서 최적화하는 방법 !!!!!!
  • 이미지 레이어 개수를 줄이는 것이 좋다.(성능영향엔 별상관없긴한데 최적화 측면에서 도움됨+ 가독성,유지보수에좋음)
RUN apt-get update && apt-get install -y \
    gcc \
    git \
    locales
  • 애플리케이션 코드 복사 명령(COPY) 은 자주 변경되지 않는 명령문 다음에 오는 것이 이미지 빌드 시간을 단축하는 데 유리하다.
  • 이전 단락에서 의존성 패키지를 명시한 파일로 requirements.txt를 사용했다. 이 파일은 Python의 공식 패키지 관리자인 PIP에서 사용하는 관행적으로 지칭하는 파일이다.Python 개발 환경을 기준으로 봤을 때 PIP는 패키지별 상호 의존성에 관계를 관리할 때 부족한 면이 있다. 그래서 요즘은 좀 더 발전된 Locking 시스템을 갖춘 Pipenv나 Poetry를 사용하는 것을 추천한다.
  • 이 도구들을 이용해 생성된 Lock 파일 (예: Pipfile)을 기반으로 패키지가 설치될 수 있도록 한다면 위 (3) 단락에서 설명한 캐시 레이어의 장점을 얻을 수 있고, 예상치 못한 패키지 버전 업데이트도 방지할 수 있다.
  • 멀티-스테이지 빌드
     는 위 (2), (3), (4) 단락에서 했던 노력보다 훨씬 더 효과적으로 도커 이미지 사이즈를 줄이는 방법이다.
  • 멀티-스테이지 빌드는 Dockerfile 1개에 FROM 구문을 여러 개 두는 방식이다.각 FROM 명령문을 기준으로 스테이지를 구분한다고 했을 때 특정 스테이지 빌드 과정에서 생성된 것 중 사용되지 않거나 불필요한 모든 것들을 무시하고, 필요한 부분만 가져와서 새로운 베이스 이미지에서 다시 새 이미지를 생성할 수 있다.

https://dodonam.tistory.com/126 참조

 

https://stackoverflow.com/questions/59747986/how-to-use-tensorflow-2-0-with-aws-lambda →  (EFS,Container)

 

Uploaded by Notion2Tistory v1.1.0

 

반응형

댓글()