앞에서 영화 정보 가져오기 + 영화 정보 cloud db에 저장까지 했다.
위의 작업을 수행하는 코드도 다 작성이 되었다.
(블로그에 올린건 일부, 원본은 github의 ChildMovie_backend 레포에 있음)
문제는 코드를 실행해야 하는 건데, 영화 정보(API)가 매일 추가되므로 코드도 하루에 한 번씩 실행해야 한다.
내가 매일매일 코드를 실행하는 것은 귀찮으므로 코드를 매일 실행하는 것을 자동화하도록 하자.
자동화에 사용할 서비스는 google cloud의 cloud run이다.
https://cloud.google.com/run?hl=ko
cloud run이란?
"Cloud Run은 Google의 확장 가능한 인프라에서 직접 컨테이너를 실행할 수 있게 해 주는 관리형 컴퓨팅 플랫폼입니다."
쉽게 말하면 컨테이너 이미지를 빌드하면, 빌드한 이미지로 컨테이너를 실행하는 서비스이다.
자동화의 과정은 다음과 같다.
- Dockerfile 작성
- Dockerfile로 image를 build 및 google cloud 저장소에 저장
- 저장소에 저장된 image로 container를 생성 및 실행 (하루에 한 번씩 실행하도록)
1. Dockerfile 작성
기본적으로는 requirements.txt에 있는 라이브러리 설치 후, 소스코드 실행 정도의 명령만 적으면 되는데 이 프로젝트에서는 한 가지 더 해줘야 할 게 있다. 바로 chrome driver 설치이다.
영화데이터를 가져오기 위해 selenium 라이브러리를 사용한다.
selenium 라이브러리를 사용하려면 기본적으로 chrome driver가 필요하다.
따라서 chrome driver 설치도 같이 해줘야 한다.
Dokerfile의 내용은 아래와 같다.
# 기본이미지 설정 및 디렉터리 경로 설정
FROM python:3.10
WORKDIR /usr/src
# chrome driver 설치 및 unzip에 필요한 패키지 설치
RUN apt-get -y update
RUN apt install wget
RUN apt install unzip
# chrome driver 설치 (zip파일)
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt -y install ./google-chrome-stable_current_amd64.deb
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
# 디렉터리 하나 만들고 거기에 위에서 다운로드한 zip파일 unzip
# chrome driver의 위치 => /usr/src/chrome
RUN mkdir chrome
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/src/chrome
# requirements.txt에 있는 라이브러리 설치
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
# 현제 디렉터리의 파일들 컨테이너로 이동 (copy)
COPY . .
# chrome 버전 확인 (다운 잘 받아졌나 확인용도)
RUN echo "Chrome: " && google-chrome --version
# 소스코드 실행 (main.py)
ENTRYPOINT [ "python", "main.py" ]
# Dockerfile
FROM python:3.10
WORKDIR /usr/src
RUN apt-get -y update
RUN apt install wget
RUN apt install unzip
RUN wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
RUN apt -y install ./google-chrome-stable_current_amd64.deb
RUN wget -O /tmp/chromedriver.zip http://chromedriver.storage.googleapis.com/` curl -sS chromedriver.storage.googleapis.com/LATEST_RELEASE`/chromedriver_linux64.zip
RUN mkdir chrome
RUN unzip /tmp/chromedriver.zip chromedriver -d /usr/src/chrome
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
RUN echo "Chrome: " && google-chrome --version
ENTRYPOINT [ "python", "main.py" ]
2. Dockerfile로 image 빌드 및 google cloud 저장소에 저장
아래 공식문서 참고 (나는 Dockerfile을 사용해서 이미지를 빌드할 계획이니, 'Dockerfile로 빌드' 항목을 보자)
https://cloud.google.com/build/docs/building/build-containers?hl=ko
우선 빌드한 이미지를 저장할 저장소를 만들어야 한다.
Artifact Registry에서 저장소를 만들자.
(Container Registry라고 컨테이너 이미지 저장, 관리하는 서비스가 있었는데 2024년 5월에 서비스 종료하고 Artifact Registry가 역할을 대신한다고 한다.)
저장소 만드는 방법
1. + 버튼 클릭
2. 이름 정하고 만들기 버튼 클릭
- gcr.io - 다중 리전
- asia.gcr.io - 아시어의 멀티 리전
- eu.gcr.io - 유럽의 멀티 리전
- us.gcr.io - 미국의 멀티 리전
위의 gcr.io 도메인을 사용하기 싫으면 원하는 이름 넣고 '위치 유형'에 원하는 리전 선택하면 된다.
저장소도 만들었으니 이제 image를 빌드해 보자.
Google CLI를 사용한다. (없으면 다운 ㄱㄱ)
나는 위에서 저장소의 리전을 asia로 했고, 저장소 이름이 asia.gcr.io이니
# PROJECT_ID랑 IMAGE_NAME은 별도로 입력해야 함!
# PROJECT_ID는 현재 프로젝트 ID, IMAGE_NAME은 원하는 이름으로
gcloud builds submit --tag asia-docker.pkg.dev/PROJECT_ID/asia.gcr.io/IMAGE_NAME
위의 명령를 CLI에서 실행했다.
실행하면 image를 빌드하고, 명령어에 넣은 저장소에 저장한다.
저장소로 가보면, 아래와 같이 이미지가 생성된 것을 알 수 있다.
이렇게 해서 빌드 및 저장까지 성공했다.
3. 실행
이제 모든 준비는 끝났다.
Cloud Run을 사용해서 image로 container를 생성 및 실행해 보자.
1. Cloud Run 서비스에서 '작업 만들기' 버튼을 클릭한다.
2. 컨테이너 이미지 URL 칸의 '선택' 버튼을 누르고, 위에서 빌드한 이미지를 선택한다.
3. 작업 이름, 리전, 태스크 수를 입력한다.
4. 메모리, CPU, 제한 시간 등 일반 설정 값들을 입력하고 '만들기' 버튼을 클릭한다.
(나는 selenium으로 웹사이트에 들어가서 정보를 가져오는 작업을 하므로, 메모리, 제한 시간, CPU를 넉넉히 할당했다.)
이렇게 하면 생성이 완료된다.
이제 이 컨테이너를 하루에 한 번씩 실행하도록 트리거를 만들자.
1. 위에서 만든 작업을 클릭하고, '트리거' 항목을 클릭한다.
2. '스케쥴러 트리거 추가'를 클릭한다.
3. 이름, 리전, 빈도, 시간대를 입력하고 '만들기' 버튼을 클릭한다.
(빈도는 unix-cron 형식을 사용한다고 함. 나는 매일 오후 10시에 실행하는 것을 원하니 "0 23 * * *"를 빈도에 입력)
(unix-cron => "분, 시, 일, 월, 요일" ex) "* * * * *" => 1분마다, "1 1 * * *" => 1시 1분마다)
리전과 시간대는 한국을 기준으로 한다.
생성 완료!
트리거가 추가되어 있다.
기록과 로그 버튼을 누르면 실행 기록과 로그를 볼 수 있으니 필요하면 보면 된다.
이렇게 해서 영화 데이터를 하루마다 가져와서 Firestore에 저장하는 작업을 자동화했다.
이제 영화 데이터는 매일 자동으로 Firestore에 저장되므로, 가져다 쓰기만 하면 된다.
https://github.com/harmlessman/ChildMovie-Backend
'프로젝트 > 아이의 영화' 카테고리의 다른 글
아이의 영화 앱 만들기#7-업데이트 (2) | 2023.11.01 |
---|---|
아이의 영화 앱 만들기#6-DB파일&Data Model&DB Class (0) | 2023.10.31 |
아이의 영화 앱 만들기#4-데이터 저장(Firestore) (0) | 2023.10.18 |
아이의 영화 앱 만들기#3-영화 데이터(2) (0) | 2023.10.17 |
아이의 영화 개인정보처리방침 (0) | 2023.10.14 |