섹션 15: Additional Hands On - Github actions with AWS EC2

쌀과자AI·2025년 8월 26일

📌 요약: 섹션 15 – GitHub Actions 기반 CI/CD 파이프라인 (AWS EC2 배포)

1. 섹션 개요

  • 목표: Python 기반 Flask 애플리케이션을 GitHub Actions를 활용하여 CI/CD 파이프라인을 구축하고, AWS EC2에 자동 배포.
  • 핵심 흐름:
    1. Flask 앱 개발 → 2) Docker 컨테이너화 → 3) GitHub Actions 워크플로우 → 4) ECR 이미지 푸시 → 5) EC2에 배포

👉 핵심 포인트: 이 섹션은 실습 중심(Hands-on) 으로 진행되며, CI/CD 파이프라인 구축 과정을 처음부터 끝까지 다룸 .


2. 프로젝트 구성 파일

✅ app.py

  • Flask 기반의 간단한 웹 애플리케이션.
  • / 경로 접근 시 → "Hello from CI/CD powered by Flask app v1" 문자열 반환 .

✅ requirements.txt

  • 주요 라이브러리:
    • flask (웹 프레임워크)
    • gunicorn (WSGI 서버)
    • requests (HTTP 요청 처리)

✅ Dockerfile

  • Python 3.10 기반 컨테이너 이미지 작성.
  • requirements.txt 설치 후 애플리케이션 실행.
  • 포트 8080 노출 → Flask 앱 실행 .

✅ tests.py

  • 간단한 테스트 스크립트:
    • 상태 코드 200 확인
    • 응답 데이터에 “hello” 포함 여부 확인

👉 핵심 포인트: CI 단계에서 자동화된 테스트로 애플리케이션 정상 동작 여부 확인.


3. GitHub Actions 워크플로우 (actions.yaml)

  • 트리거: main 브랜치에 push 발생 시 실행.
  • 주요 단계:
    1. Python 환경 세팅 (3.10)
    2. 의존성 설치 (pip install -r requirements.txt)
    3. 테스트 실행 (pytest 등)
    4. Docker 이미지 빌드 (my-flask-app:latest)
    5. AWS 로그인 → ECR 푸시
    6. EC2 접속 → 기존 컨테이너 중단 및 새 컨테이너 실행

👉 핵심 포인트: 코드 변경 → 자동 빌드 & 배포까지 연결되는 완전 자동화 파이프라인.


4. AWS 설정 (Prerequisites)

  1. ECR (Elastic Container Registry)
    • my-flask-app 리포지토리 생성 → Docker 이미지 저장소 역할.
  2. EC2 인스턴스
    • Amazon Linux 2 기반, Docker 설치 필수.
    • 보안 그룹에서 HTTP/HTTPS 허용.
    • IAM Role → ECR Full Access 권한 부여 .
  3. GitHub Secrets 등록
    • AWS_ACCESS_KEY_ID / AWS_SECRET_ACCESS_KEY
    • EC2_HOST, EC2_SSH_KEY, EC2_USER
    • AWS_ACCOUNT_ID, AWS_REGION

👉 핵심 포인트: GitHub Actions ↔ AWS 간 통신은 Secrets 기반 인증 필수.


5. 배포 및 테스트

  • 코드 변경 후 git push → GitHub Actions 파이프라인 자동 실행.
  • ECR에 새 이미지 업로드 → EC2 컨테이너 자동 교체 배포.
  • 예시: app.py에서 "v1" → "v2" 변경 후 배포 → 웹 브라우저에서 즉시 반영 확인 .

👉 핵심 포인트: 코드 변경 → 자동 테스트 & 배포 → 즉시 서비스 반영.


6. 마무리 및 보안

  • Hands-on 종료 후 AWS 리소스 정리 필요:
    • 생성된 Access Key 삭제
    • EC2 인스턴스 종료
    • ECR 리포지토리 삭제

👉 핵심 포인트: 보안 유지 및 비용 절감을 위해 정리 작업은 필수.


✅ 최종 정리

  • CI/CD 핵심: 코드 변경 시 자동으로 테스트 → 빌드 → 배포까지 처리.
  • 도구 조합: Flask + Docker + GitHub Actions + AWS (ECR + EC2).
  • 학습 포인트:
    • GitHub Actions 워크플로우 구조 이해
    • AWS 리소스와 연동하는 방법
    • 자동화된 테스트 & 배포 파이프라인 실습

📘 연습문제 세트 (섹션 15 기반)

🔹 하 (기본 개념 확인)

문항 1. GitHub Actions 워크플로우 파일(.yaml)의 실행 트리거 조건으로 올바른 것은?

① git fetch 실행 시

② main 브랜치에 push 발생 시

③ Docker Hub에서 이미지 빌드 완료 시

④ AWS EC2 인스턴스 재부팅 시

👉 정답:

📖 해설: 강의에서는 main 브랜치에 push 이벤트가 발생하면 GitHub Actions 워크플로우가 실행되도록 구성함 .


문항 2. requirements.txt 파일에 포함된 라이브러리가 아닌 것은?

① Flask

② Gunicorn

③ Requests

④ TensorFlow

👉 정답:

📖 해설: 본 프로젝트는 단순한 Flask 웹 애플리케이션 배포 실습용이므로 Flask, Gunicorn, Requests만 포함되어 있음 .


문항 3. (서술형) tests.py 파일에서 확인하는 두 가지 주요 검증 항목은 무엇인가요?

👉 정답:

  1. HTTP 응답 상태 코드가 200인지 확인
  2. 응답 데이터에 "hello" 문자열이 포함되어 있는지 확인

📖 해설: 이는 기본적인 애플리케이션 정상 동작을 확인하기 위한 최소 단위 테스트임.


🔹 중 (적용/이해 단계)

문항 4. CI/CD 파이프라인에서 Docker 이미지를 빌드한 후, 이를 저장하고 배포하기 위해 사용하는 AWS 서비스는?

① S3 (Simple Storage Service)

② ECR (Elastic Container Registry)

③ RDS (Relational Database Service)

④ CloudFront

👉 정답:

📖 해설: 빌드된 Docker 이미지는 AWS ECR에 푸시(push)한 후, EC2에서 풀(pull) 받아 실행함 .


문항 5. 강의에서 EC2 인스턴스 생성 시 Amazon Linux 2023 AMI 대신 Amazon Linux 2 AMI를 권장한 이유는 무엇인가?

① Amazon Linux 2023은 요금이 비싸서

② Amazon Linux 2에는 Docker 설치를 쉽게 해주는 aws extras 기능이 있어서

③ Amazon Linux 2가 더 빠른 CPU 성능을 제공해서

④ GitHub Actions과 호환되지 않아서

👉 정답:

📖 해설: Amazon Linux 2023은 기본적으로 Docker 설치에 필요한 extras 기능이 없어 에러가 발생할 수 있음. 따라서 Amazon Linux 2 사용을 권장 .


문항 6. (서술형) GitHub Secrets에 반드시 등록해야 하는 값들을 두 가지 이상 쓰세요.

👉 정답 예시:

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • EC2_HOST
  • EC2_SSH_KEY
  • AWS_REGION 📖 해설: GitHub Actions에서 AWS 및 EC2와 통신하기 위해 필수 인증 정보를 Secrets에 등록해야 함 .

🔹 상 (심화/실무 응용)

문항 7. 다음 중 CI/CD 파이프라인의 올바른 실행 흐름을 순서대로 나열한 것은?

① 코드 푸시 → ECR 푸시 → GitHub Actions 실행 → 테스트 실행 → EC2 배포

② GitHub Actions 실행 → 테스트 실행 → Docker 이미지 빌드 → ECR 푸시 → EC2 배포

③ EC2 배포 → Docker 이미지 빌드 → GitHub Actions 실행 → ECR 푸시

④ Docker 이미지 빌드 → 테스트 실행 → GitHub Actions 실행 → ECR 푸시

👉 정답:

📖 해설: GitHub Actions가 트리거되면 → 테스트 실행 → Docker 이미지 빌드 → ECR 푸시 → EC2 배포 순서로 진행됨 .


문항 8. 강의에서는 Flask 애플리케이션의 기본 응답 메시지를 "Hello from CI/CD powered by Flask app v1" 로 설정했다. 만약 "v2"로 변경 후 커밋한다면 어떤 현상이 발생하는가?

① EC2에 배포 실패

② GitHub Actions가 무시됨

③ 새 컨테이너가 자동으로 실행되며 브라우저에서 "v2" 반영

④ 수동으로 EC2 재시작해야 반영

👉 정답:

📖 해설: CI/CD 파이프라인은 코드 변경 후 자동으로 새 Docker 이미지 빌드 → ECR 푸시 → EC2 배포까지 진행하여 즉시 반영됨 .


문항 9. (서술형) 보안 및 비용 절감을 위해 Hands-on 종료 후 반드시 해야 할 정리(Cleanup) 작업 2가지를 서술하세요.

👉 정답 예시:

  • 생성된 AWS Access Key 삭제
  • EC2 인스턴스 종료(terminate)
  • ECR 리포지토리 삭제

📖 해설: 실습용 리소스를 방치하면 비용이 발생하며, Access Key를 그대로 두면 보안 위험이 있음 .


문항 10. (응용 서술형) GitHub Actions 없이 수동으로 Flask 앱을 배포한다고 가정했을 때, 최소한 어떤 단계들을 직접 수행해야 하나요?

👉 정답 예시:

  1. Flask 앱 소스코드 준비
  2. Dockerfile 빌드 → Docker 이미지 생성
  3. AWS ECR에 직접 푸시 (docker push)
  4. EC2 인스턴스에 SSH 접속 후 docker pull 실행
  5. 컨테이너 실행(docker run -p 80:8080)

📖 해설: GitHub Actions가 자동화한 작업을 수동으로 한다면 위 과정을 순서대로 수행해야 함.

profile
AI에 관심이 많은 23살 대학생입니다.

0개의 댓글