MINI PROJECT #1 - 하차역 알려주는 서비스 (3)

yooooooona·2025년 1월 15일

MLOPS

목록 보기
10/12

MINI PROJECT #1 - 하차역 알려주는 서비스 (1)
MINI PROJECT #1 - 하차역 알려주는 서비스 (2)

이어지는 과제...

  • 시크릿 정보 보호하기
  • cronjob으로 주기적 다운로드 기능 만들기
  • 최종 도커 컴포즈 검토
  • 조교님께 전달하기
  • 깃허브액션 만들기
  • 깃허브액션 조교님 서버에서 테스트!

01 시크릿 정보 보호하기

1. 작업중인 파일에 .env 파일을 만들고 그곳에 아래와 같이 비밀 정보들을 저장한다

# .env 파일
AWS_ACCESS_KEY_ID=ㅇㅇㅇㅇㅇㅇㅇ
AWS_SECRET_ACCESS_KEY=12121212\
GIT_TOKEN=ghp_ㅇㅇㅇㅇㅇ

2. 도커파일이나 도커컴포즈, 기타 깃허브로 공유해야하는 작업 파일들에서 해당 부분을 아래와 같이 처리한다.

# 도커컴포즈
    environment:
      AWS_ACCESS_KEY_ID: ${AWS_ACCESS_KEY_ID}
      AWS_SECRET_ACCESS_KEY: ${AWS_SECRET_ACCESS_KEY}
      AWS_DEFAULT_REGION: ap-northeast-2 
      
      GIT_TOKEN: ${GIT_TOKEN}
      
      
      
   
# 도커파일 
ENV GIT_TOKEN=${GIT_TOKEN}
RUN git clone https://${GIT_TOKEN}:x-oauth-basic@github.com/yoona-seline/TargetPassengerAI . 

3. .env를 .gitignore 파일에 넣어 해당 파일이 깃허브에 올라가지 않도록 만든다.

# .gitignore 파일
.env

4. 해당 시크릿 정보들을 필요로 하는 동료들에게 .env를 안전한 방법으로 공유한다.

02 cronjob 사용하기

크론 잡(Cron Job)은 유닉스 계열 운영체제(예: 리눅스)에서 특정 시간에 주기적으로 작업을 실행하도록 예약하는 작업 스케줄러입니다. 크론 데몬(crond)이 시스템 백그라운드에서 실행되며, 사용자가 설정한 스케줄에 따라 명령어 또는 스크립트를 실행합니다.

크론 잡은 유닉스 계열에서만 실행할 수 있다! 즉 윈도우에서는 사용할 수 없어서 다른 대체 방법을 사용해야한다.

사용방법

1. 우선 awcli와 cron을 설치한다

sudo apt-get awscli cron

2. 크론 데몬 시작하기. 부팅 시 자동으로 시작되도록 설정합니다.

sudo systemctl start cron
sudo systemctl enable cron

3. 크론 데몬이 올바르게 실행되고 있는지 확인하려면 다음 명령어를 사용

sudo systemctl status cron

4. 아래의 명령어를 통해 crontab 파일을 연다.이 파일에 크론으로 명령하고 싶은 내용이 적혀있다. 아래 명령어를 입력하면 crontab의 내용물이 vim 또는 nano로 열린다.

crontab -e

만약 vim이나 nano가 안깔려있다면 그 아래의 방법으로 설치.

sudo apt-get install vim
export EDITOR=vim

5. crontab 작성방법

분 시 일 월 요일 명령어

  • 분(Minute): 0 - 59
  • 시(Hour): 0 - 23 (0 = 자정)
  • 일(Day of Month): 1 - 31
  • 월(Month): 1 - 12
  • 요일(Day of Week): 0 - 7 (0과 7 = 일요일, 1 = 월요일, ...)

현재 위 그림의 명령어는 "매일 00시에 fetch_data.sh를 실행해라"라는 뜻이다.

6. fetch_data.sh 작성하기

fetch_data.sh라는 파일명의 파일을 만들고 루틴하게 s3에서 하고 싶은 업무 명령어를 적는다.
아래의 예시는 매일 그 날짜로 된 파일을 다운로드 받아오는 것이다.

TODAY=$(date +%Y%m%d)
aws s3 cp s3://dlddu-seoul-line-dvc-1-dataset/yoona/dataset_$TODAY.xlsx /data/dataset_$TODAY.xlsx

특급주의!!!!!

도커 컨테이너는 처음 열릴때 한국시간대로 열리지 않는다!!!
뜨헋!!! 그러므로 CRON을 사용하려면 반드시 도커의 시간대를 바꿔주는 작업이 꼭 필요하다

apt-get install -y tzdata

# 한국 표준시(KST)로 시간대 설정 
ENV TZ=Asia/Seoul 
RUN ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone

03 git-hub action!

1. 깃허브 레포지토리의 아래의 위치에 디렉토리 생성

mkdir -p .github/workflows

2. 위의 위치에 워크플로우 파일 생성하기.

이 워크플로우 파일로 깃허브액션은 작동/관리된다.

touch .github/workflows/update-pipeline.yml

3. 워크플로우 파일을 vim으로 열어 원하는 내용을 넣는다.

(예시)

name: Update Pipeline

on:
  push:
    branches:
      - main     #트리거 명시: 메인브랜치에 push가 생기면! 

jobs:
  update:
    runs-on: ubuntu-latest   #아래의 step들이 수행될 환경 명시

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2  #이 워크플로우가 해당 레포지토리를 인식하는 단계 
       
    - name: Pull updates in container
      run: |
        docker exec my-app /app/pull_updates.sh  #pull 행동을 일으킬 pull_updates.sh 파일 실행
  • jobs:
    워크플로우의 작업(Job)을 정의하는 섹션입니다. 여러 개의 작업을 정의할 수 있으며, 각각의 작업은 병렬 또는 순차적으로 실행될 수 있습니다.

  • update:
    작업의 이름을 정의합니다. 이 이름은 사용자 정의가 가능하며, 의미 있는 이름으로 설정할 수 있습니다. 여기서는 update라는 작업 이름을 사용합니다.

-steps:
작업 내에서 실행될 단계를 정의합니다. 각 단계는 순차적으로 실행됩니다.

  • name: Checkout repository
    이 단계의 이름을 정의합니다. Checkout repository라는 이름은 현재 리포지토리의 코드를 체크아웃하는 작업을 의미합니다.

  • uses: actions/checkout@v2
    GitHub에서 제공하는 공식 액션을 사용하여 리포지토리의 코드를 체크아웃합니다. actions/checkout@v2는 이 액션의 버전을 지정합니다.
    actions/checkout: GitHub에서 제공하는 공식 액션 중 하나로, 리포지토리의 코드를 체크아웃(클론)하는 기능을 합니다. 이를 통해 워크플로우에서 현재 코드베이스를 가져올 수 있습니다. 즉, 워크플로우 파일이 해당 레포지토리를 '인식'한다는 의미이다.

4. 이를 사용하고자 하는 도커파일에 가서 스크립트 관련 명령어를 추가한다.

#dockerfile

# 스크립트 복사 및 권한 설정 
COPY pull_updates.sh /app/pull_updates.sh RUN chmod +x /app/pull_updates.sh

5. 도커파일과 같은 경로에 pull_updates.sh 파일을 만들어 트리거를 받았을때 작동해야하는 명령어를 넣는다


#pull_updates.sh

cd /app
git pull origin main

6. 변경된 깃을 커밋하고 푸시!

7. 깃허브 홈페이지-레포지토리-워크플로우 메뉴에서 해당 워크플로우가 잘 작동했는지 확인 및 수정도 가능하다.

아래의 그림처럼 빨간색 x는 해당 액션이 수행되지 못했다는 뜻이다! 세부 페이지에 들어가면 어떤 단계에서 막혔는지를 로그를 알 수 있다!! 아주 편리하다!

profile
배우고 있습니다.

0개의 댓글