ASAC-SK플래닛 T아카데미 데이터 엔지니어

25.11.14 27일차 [git action을 이용한 EC2 배포 자동화하기]

Datadesigner 2025. 11. 14. 12:57

오늘은 어제에 이어서 git action 복습을 진행하고 

 

git action으로 EC2 를 이용하여 배포를 자동화하는 과정을 실습했다.

 


노션 업데이트

 

DevOps

DevOps

DevOps는 **개발(Dev)**과 **운영(Ops)**의 합성어로, 소프트웨어 개발과 IT 운영 팀 간의 협업을 강화하여 소프트웨어 개발 및 제공 속도를 높이는 문화, 철학, 방법론입니다. 이는 개발, 운영, 품질 엔지니어링, 보안 등 여러 팀 간의 사일로를 제거하고, 지속적인 통합(CI) 및 지속적인 배포(CD)를 자동화하며, 더 빠르고 안정적인 소프트웨어 제공을 목표로 합니다.

주요 특징 및 목표

  • 협업 문화: 개발과 운영 팀이 함께 일하며 공동 책임을 공유하는 문화를 만듭니다.
  • 자동화: 빌드, 테스트, 배포와 같은 작업을 자동화하여 효율성을 높입니다.
  • 지속적인 통합/배포 (CI/CD): 코드 변경이 지속적으로 통합되고 배포될 수 있도록 프로세스를 구축합니다.
  • 효율성 향상: 기존 프로세스보다 제품을 더 빠르고 안정적으로 혁신하고 개선할 수 있게 합니다.
  • 성능 향상: 고성능 애플리케이션과 서비스를 더 빠르게 제공할 수 있도록 조직의 역량을 향상시킵니다.

DevOps 엔지니어의 역할

  • 개발 및 운영의 통합된 프로세스를 구성하고 관리합니다.
  • CI/CD 파이프라인을 구축하고 운영하며, 배포 자동화를 담당합니다.
  • 개발 환경 설정, 인프라 운영 및 모니터링을 수행합니다.
  • 개발자들이 제품을 더 빠르고 안정적으로 배포할 수 있도록 지원하는 것이 주요 목적입니다
yml

YML은

  • ***YAML(YAML Ain't Markup Language)의 확장자

로, 사람이 읽기 쉬운 구성 파일이나 데이터 직렬화 형식으로 널리 사용됩니다. YML과 YAML은 동일하며, 들여쓰기를 통해 데이터의 계층 구조를 나타냅니다. 스프링 애플리케이션 설정, Docker 컴포즈 파일, GitHub Actions 등 다양한 분야에서 활용됩니다.

YML의 특징

  • 사람이 읽기 쉬운 형식: XML이나 JSON보다 간결하고 읽기 쉬운 문법을 사용합니다.

구성 파일: 애플리케이션의 데이터베이스 연결 정보, 서버 설정 등을 정의하는 데 사용됩니다.

  • 구성 파일: 애플리케이션의 데이터베이스 연결 정보, 서버 설정 등을 정의하는 데 사용됩니다.

데이터 직렬화: 구조화된 데이터를 사람이 읽을 수 있는 형태로 표현하는 데 사용됩니다.

  • 데이터 직렬화: 구조화된 데이터를 사람이 읽을 수 있는 형태로 표현하는 데 사용됩니다.

계층 구조: 들여쓰기를 사용하여 데이터를 계층적으로 구성하며, 탭 대신 공백을 사용합니다 (주로 2칸).

  • 계층 구조: 들여쓰기를 사용하여 데이터를 계층적으로 구성하며, 탭 대신 공백을 사용합니다 (주로 2칸).

확장자: .yml 또는 .yaml 확장자를 사용합니다. 옛날 윈도우의 3글자 제한 때문에 .yml 확장자가 사용되기도 했습니다.

  • 확장자: .yml 또는 .yaml 확장자를 사용합니다. 옛날 윈도우의 3글자 제한 때문에 .yml 확장자가 사용되기도 했습니다.

JSON 호환성: JSON의 상위 집합이므로 JSON 파일을 YAML에서 사용할 수 있습니다.

  • JSON 호환성: JSON의 상위 집합이므로 JSON 파일을 YAML에서 사용할 수 있습니다.

YML의 활용 예시

Spring Boot: application.yml 파일을 사용하여 스프링 애플리케이션의 다양한 설정을 정의합니다.

  • Spring Boot: application.yml 파일을 사용하여 스프링 애플리케이션의 다양한 설정을 정의합니다.

Docker: docker-compose.yml 파일을 사용하여 여러 컨테이너를 정의하고 관리합니다.

  • Docker: docker-compose.yml 파일을 사용하여 여러 컨테이너를 정의하고 관리합니다.

GitHub Actions: *.yml 파일을 사용하여 CI/CD 워크플로우를 설정합니다.

  • GitHub Actions: .yml 파일을 사용하여 CI/CD 워크플로우를 설정합니다.

 

  • 레퍼지토리 상에 시크릿 변수 추가
    • 목표
      • 외부 노출되면 안되는 정보들을 저장
      • 계정, 비번, 호스트, 각종 키값
    • 메뉴 위치
      • 레포지토리 > setting > secr... > actions > new Repository secrets 버튼 클릭 > 제목, 내용 입력 > 저장
    • 예시

 

  • 최종 추가 내용
    • EC2_KEY → xxx.pem 파일 내용
    • EC2_HOST → EC2 인스턴스의 IP
    • APP_ENV → .env 내용 동일
    • EC2_USERNAME → ubuntu

  • 배포후 서버 중단(가동 안됨)
    • 로그 확인 - 로그 확인하는 명령어
    • sudo journalctl -u hello.service -n 50 --no-pager

 

 

FAST api memo CICD

 

 

GitHub - siwoo01231324-crypto/fastapi_memo: 메모관리 프로젝트를 통한 fastapi 전체적기능 적용

메모관리 프로젝트를 통한 fastapi 전체적기능 적용. Contribute to siwoo01231324-crypto/fastapi_memo development by creating an account on GitHub.

github.com

  • 전략
    • main 브런치 → main-cicd 기본 세팅
    • design-dev pull request & merge → main
    • auth-dev pull request & merge → main
    • main-cicd → pull request & merge → main
      • CICD 확장
  • AWS상에서 접근 가능한 MySQL 필요함
    • MySQL 설치
      • EC2에 직접 설치하는 방식 (불편하지만 별도 비용 X, EC2에 부하 발생)
      • RDS 서비스에 데이터베이스 생성(간편하지만 별도 비용 청구) → 설치
        • 계정에 다음 권한 필요
          • 방법
            • ROOT계정에서 → IAM 접속
            • 사용자별 부여
            • 사용자가 속한 그룹에 부여
          • AmazonRDSFullAccess
            • RDS의 모든 권한 (인스턴스 생성, 삭제, 수정, 스냅샷 생성, 파라미터/ 보안그룹 설정 등등)
          • AmazonRDSReadOnlyAccess - 옵션
  • MySQL 생성(구성)
    • Aurora and RDS > 데이터베이스 > 데이터베이스 생성
    • 생성 방식 : 표준 생성 (직접 구성)
    • 엔진 옵션 → MySQL 선택

엔진 버전, 기타 속성( 기본값 그대로 사용 )

 

 

템플릿 : 개발 & 테스트용

 

가용성 및 내구성 : 단일 AZ DB 인스턴스 배포

 

DB 인스턴스 식별자

 

  • 자격 증명 설정
    • 마스터(루트)사용자 정의

비밀번호

 

인스턴스 유형 (기존에 사용한 t계열)

스토리지 구성

  • 연결
    • 외부망(인터넷 0.0.0.0)을 통해서 접속 OR 내부망을 통해서 접속 기본 설정
    • EC2와 연결 설정 → X 무조건 외부망(인터넷)을 통해서 접속 가능하도록 구성
    • 아래 구성은 테스트 디비 구성시 적절함

퍼블릭 엑세스 - 동의

vpc 보안그룹 (방화벽) -> 인바운드 -> 차후 3306번 추가 필요

 


  • 추가 구성
    • 초기 데이터베이스 이름(선택)

백업 → off / 상용화시에는 고려해야함

삭제 방지 활성화 → 서비스 시에는 체크

 

  • Mysql 접속
    • 데이터베이스 생성 클 
      • 5~10분 후 데이터베이스 생성 완료 → 엔드포인트 세팅이 완료되면 사용가능
    •  

엔드포인트가 떠야된다

 

  • 보안그룹
    • EC2 > 네트워크 및 보안 > 보안그룹 > 위에서 설정한 보안그룹 선택 > 인바운드 편집 > 3306번 포트 추가(MySQL / Aurora) > 저장

 

하이디sql > 세션 추가

 

 

실제 연결되면 데이터에 용량이 뜬다


git action

 

내용 설명

 

1번 코드 : action 이름

3~8 코드 : main - 브랜치에 - push - 하겠다 (on)

12~26 코드 : 개별 작업 하겠다 - deploy라는 작업 - ubuntu에서 하겠다 - 이 단계로 - 코드 checkout이라는 이름의 작업을

- 사용한다 (uses : actions/checkout@v3) 

그 다음 검증이라는 작업을 하겠다 - run | = 모든 것을 - ls -al(숨겨진 파일까지 모두 보여줘라) - bash에서

이제 이해가 좀 갔다.

 

예시 : 현재 검증파트 코드이다, pwd = 현재 경로 출력/ ls -al = 모든 파일 출력 / cat requirements.txt = txt파일 내용 출력

github에서 git action에 들어가서 검증파트 내용을 살펴보면, 현재 경로, 경로내의 모든 파일, requirements.txt의 내용 출력

검증 파트의 모든 코드가 작동한것을 확인할 수 있다.

 

이제 git action을 통해서 EC2를 이용해서 바로 웹사이트를 자동으로 켜지게 만들어서 

우리가 터미널을 하지 않아도 서비스가 구동되게 하는 코드를 써보자

환경변수 파일(.env) 동적 생성 이름의 작업을 만들어준다

# 2. 작업 run : echo (아까 github에서 세팅한 키 / 레포지터리상에 세팅한 시크릿 변수) 를 .env파일에 넣어서 만들어라.

# 3. 작업 필요한 파일을 ec2에 복사 / 이 때 appleboy라는 라이브러리를 사용한다, scp-action@master가 밑의 내용들을 ubuntu에 그대로 복사해오는 기능을 수행한다. 그리고 복사할 대상은 . 로 모두 지정하고, EC2상의경로를 지정해준다.

 

# 4. 작업 SCRIPT를 구동하고, 서비스를 재시작하는 작업이다.

마찬가지로 APPLEBOY를 사용해서 라이브러리를 가져오고 밑에 주황색 주석은 사실 작동하는 코드이다.

주석표기 #가 붙은 내용은 실제 구동되진 않는다.

순서는 

해당 프로젝트 폴더로 이동 - 현재 프로젝트 내 파일을 확인 - 패키지 설치 - RESTART (서비스명 ) 을 구동하라는 코드이다.

이제 이 내용들을 GIT에 SYNC해주면

git 에 commit 한 이름으로 action이 생긴다.

이름은 자유이고 수업중 commit 한 내용이 수정때문에 많아서 이름은 다르다.

수업의 포인트는 가상환경으로 우리가 세팅한 파일만 넘어가기 때문에

코드를 구동할 때 필요한 템플릿(ex / fastapi,uvicorn, jinja2 등) 들도 requirements.txt에 넣어줘야 한다, 그렇지 않으면 템플릿은 가상환경 내에는 없기때문에 오류가 계속해서 뜰것이다.

ubuntu상에서 구동에 성공한 모습이다.

이제 우리가 받아온 public ip를 웹사이트상에서 구동하면

main.py에 세팅한 html 파일의 내용이

ec2로 받아온 인스턴스에 있는 퍼블릭 ip의 웹 사이트상에

yml을 타고 그 안에 있는 명령어가

git action을 사용해서 자동으로 ubuntu에서 불러오기 되어서

ec2를 타고 웹 사이트에 출력되는 모습을 확인할 수 있다.

배포에 성공한것이다!

 

 

이제 우리가 만든 메모 웹페이지를 연동시켜서 git action으로 자동으로 CICD 환경을 구성할 예정이다.

 


MySQL, RDS 이용한 memos 데이터베이스 연동

 

 

1. fastapi-memo 폴더의 main.py를 수정해준다.

가린 부분의 문법은 관리자이름:데이터베이스 마스터 비밀번호@rds로 생성한 데이터베이스 엔드포인트이다.

 

그리고 아까 웹서비스를 EC2를 사용해서 구동할 때 필요했던 .env 파일과 yml 파일이 들어있는 폴더, 두가지를 가져온다.

/.github/workflows/deploy.yml 과 .env파일

이렇게 하고 uvicorn main:app --reload .... 명령어를 통해 서버를 가동시키면

 

RDS 데이터베이스에 연결이 된다.

하이디SQL에 AWS 밑으로 MEMOS 데이터베이스가 들어간 모습,

이제 웹 상의 데이터베이스를 구동했다.

 

그런데 main.py에 내 비밀번호, 엔드포인트 등 공개되면 안될 정보들이 있다. 그래서 이를 해결하기 위해서 .env 파일을 사용한다.

1. .gitignore

git ignore 파일에 있는 파일들은 깃에 업로드할때 같이 업로드 되지 않는다. 그래서 이 곳에 각종 비밀번호, 키, 토큰등을 저장해두고 업로드한다.

 

138번 줄에 있는 .env 파일을 기본적으로 만들어준다.

그리고 이곳에 아까 입력했던 값들을 변수로 지정해준다.

.env 파일을 불러오기 위한 라이브러리 requirements.txt에 추가 / python-dotenv

10~14 코드 : .env 파일을 읽어오기 위한 라이브러리 불러오기

 

그리고 환경변수 파일 가져온다.

 

22~26 코드 : 환경변수들을 각각 host, user, pwd 변수에 담아준다.

 

그리고 url 입력칸에 f포맷팅을 이용해서 넣어준다.

 

다시 구동해보면 하이디sql에서 다시 데이터가 보인다.

이후 git action에서 작업을 담당해줄 yml 파일의 제목과 브랜치를 다시 설정해준다.

 

이렇게 하면 ec2 터미널에서 status가 작동으로 돌아가면서 하이디sql에도 데이터가 뜨고

 

그 사이트를 xxx.xxx.xxx.xxx/docs에 들어가면 작동을 확인할 수 있는데

 

근데 지금 데이터베이스랑 인스턴스 복습하려고 껐다가 다시 켰는데 접속이 안된다.

 

뭔가 꼬인거같은데 챗gpt랑 아무리 얘기를 해봐도 고쳐지지가 않아서 추후 다시 해야할 것 같다.

 

다른 이미지들은 다시 올리겠다. 아무튼 과정은 이렇다

 

1. sql url에 aws RDS 데이터베이스 이름,비밀번호,호스트 입력하기

2. .env파일 이용해서 중요한 개인정보 숨겨서 변수화하기

3. yml파일 이용해서 제목과 브랜치 설정해주기

추후 다시 기술하겠다.