AWS (CodeDeploy)

엄경문·2026년 1월 20일

AWS

목록 보기
9/10

CI/CD

CI/CD

왜 CI/CD 를 사용하나?
CD/CD 는 개발 -> 배포 흐름을 반복하면서 실수를 줄이고 안정적으로 자주 배포하기 위해 사용한다.
수동으로 배포했을때는 누가, 언제, 무엇을 배포했는지 기록이 흐려지고 장애나면 롤백이 느리거나 불가능 할 수 있다.

CI

  • 코드가 바뀔 때마다 자동으로 빌드/테스트
  • 깨진 코드를 운영에 올리기 전에 잡을 수 있다
  • 팀 협업에서 바로 배포 상황을 공유

CD

  • 배포를 버튼/자동으로 만듦
  • 항상 같은 방식으로 배포
  • 실패하면 자동 롤백

현재 CI/CD 를 사용할때 정말 많은 툴이 있지만 이번에는 깃액션과 AWS CodeDeploy를 통해 진행하여 두개를 위주로 설명하였다.

Git이란

  • 버전 관리 시스템으로 로컬 PC 안에 로컬 저장소를 만들어 커밋으로 변경 히스토리를 쌓는것이다. 즉 내컴퓨터에서 버전 이력을 관리한다.

GitHub(서비스/플랫폼)

  • Git 저장소를 원격으로 올려서 여러 사람이 함께 쓰게 해주는 협업 플랫폼이다.
  • PR(풀리퀘스트), 코드리뷰, 이슈 등 협업 기능을 제공하고 커밋 및 머지 흐름을 시각화 해준다. 즉 Git 저장소를 인터넷에 올려 협업하게 해주는 서비스이다.

개발 흐름을 간단하게 보면
1. 로컬에서 작업하고 git add / git commit
2. GitHub로 git push 해서 공유
3. GitHub에서 PR로 리뷰/머지
4. 머지되면 CI/CD가 자동으로 돌아감


AWS CodeDeploy

  • 만들어진 Artifact를 받아서 EC2/ECS/Lambda/온프레미스 등에 배포
  • 배포 방식:
    • In-Place(기존 서버에 덮어 배포)
    • Blue/Green(새 환경에 올리고 트래픽 전환)
  • 실패하면 롤백을 지원
  • EC2에 배포할 땐 CodeDeploy Agent 설치가 필요
  • 어디에/어떻게 배포할지는 appspec.yml 에 정의한다

실습

IAM user 생성해서 정책을 할당

ubuntu@ip-10-0-1-211:/Workshop$ aws iam create-user --user-name lab-edu-user-github
{
    "User": {
        "Path": "/",
        "UserName": "lab-edu-user-github",
        "UserId": "AIDAYUSGRV52WFOGKOCU6",
        "Arn": "arn:aws:iam::593927188341:user/lab-edu-user-github",
        "CreateDate": "2026-01-19T07:23:27+00:00"
    }
}

정책 할당 명령어

aws iam attach-user-policy --user-name lab-edu-user-github --policy-arn arn:aws:iam::aws:policy/AWSCodeDeployFullAccess

정책 확인

ubuntu@ip-10-0-1-211:/Workshop$ aws iam list-attached-user-policies --user-name lab-edu-user-github
{
    "AttachedPolicies": [
        {
            "PolicyName": "AWSCodeDeployFullAccess",
            "PolicyArn": "arn:aws:iam::aws:policy/AWSCodeDeployFullAccess"
        }
    ]
}

IAM 을 만드는 이유는 GitHub Action 에서 AWS 에 배포 명령을 내릴 수 있게 권한을 발급하기 위함이다.

GitHub용 Access Key / Secret key 생성

CI/CD에서 AWS 작업을 하는 주체(Identity) 가 두 종류로 나누어진다.

외부 주체 = GitHub Actions
AWS에 배포시작과 같은 API 호출을 해야 함
그래서 IAM User + Access Key 가 필요

AWS 내부 주체 = CodeDeploy 서비스 자체
배포를 실제로 진행하면서 EC2/ASG/태그/배포그룹 등 AWS 리소스에 접근해야 함
그래서 IAM Role (Service Role) 이 필요

GitHub용 Access Key / Secret key 생성

ubuntu@ip-10-0-1-211:/Workshop$ aws iam create-access-key --user-name lab-edu-user-github > ~/.ssh/access_key.json

CodeDeploy용 IAM Role 생성

aws iam create-role --role-name lab-edu-role-codedeploy --assume-role-policy-document file://support_files/policy/codedeploy_trust_policy.json

IAM Role에 정책 할당 명령어 실행

aws iam attach-role-policy --role-name lab-edu-role-codedeploy --policy-arn arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole

할당 된 정책 확인 명령어

ubuntu@ip-10-0-1-211:/Workshop$ aws iam list-attached-role-policies --role-name lab-edu-role-codedeploy
{
    "AttachedPolicies": [
        {
            "PolicyName": "AWSCodeDeployRole",
            "PolicyArn": "arn:aws:iam::aws:policy/service-role/AWSCodeDeployRole"
        }
    ]
}

깃허브 레파지토리 생성

vscode 서버에 깃허브 레파지토리 연동

ubuntu@ip-10-0-1-211:/Workshop$ git init
Initialized empty Git repository in /Workshop/.git/
ubuntu@ip-10-0-1-211:/Workshop$ git branch -M main
ubuntu@ip-10-0-1-211:/Workshop$ git remote add origin https://github.com/eomkyeongmun/cloud-wave.git

추후에 push

git add .
git commit -m "first commit"
git push -u origin main

GitHub Repository 설정
Access Key 등록

  • 개인 GitHub Repository 접속 → Settings 탭 → Secrets and variables 선택 → Actions 선택 → New repository secret 버튼 클릭
  • Access key 정보 입력 → Add secret 버튼 클릭
    • Name: AWS_ACCESS_KEY
    • Secret: [AWS_ACCESS_KEY_VALUE]

~/.ssh/access_key.json 파일을 복사해서 붙여넣기

  • Sccess key 정보 입력 → Add secret 버튼 클릭
    • Name: AWS_SECRET_KEY
    • Secret: [AWS_SECRET_KEY_VALUE]

CodeDeploy 생성

CodeDeploy Application 생성

  • CodeDeploy 콘솔 메인 화면 → 애플리케이션 탭 → 애플리케이션 생성 버튼 클릭
  • Application 생성 정보 입력
    • 애플리케이션 이름: lab-edu-cd-application-streamlit
    • 컴퓨팅 플랫폼: EC2/온프레미스

  • 배포 그룹 생성 정보 입력
    • 배포 그룹 이름: lab-edu-cd-deploygroup
    • 서비스 역할: lab-edu-role-codedeploy
    • Amazon EC2 인스턴스 체크
    • 키: Name
    • 값: lab-edu-ec2-web
    • 기본 스케줄러 값 : 1일
    • 로드 밸런싱 활성화 체크 x

CodeDeploy Agent 설정

CodeDeploy Agent 설치

  • VS Code IDE Terminal 접속 → SSH 명령어 실행

관련 패키지 다운로드, CodeDeploy Agent 설치 프로그램 다운로드, CodeDeploy Agent 서비스 실행 및 상태 확인 명령

ssh web-server
sudo yum update -y && sudo yum install ruby -y && sudo yum install wget -y
wget https://aws-codedeploy-ap-northeast-2.s3.ap-northeast-2.amazonaws.com/latest/install
chmod +x ./install
sudo ./install auto
systemctl status codedeploy-agent   # sudo service codedeploy-agent status
systemctl start codedeploy-agent    # sudo service codedeploy-agent start

GitHub Actions 설정

GitHub Actions 코드 구성
폴더명 입력: .github/workflows
.github 클릭 → workflows 클릭 → New Files 클릭 → 파일명 입력: streamlit.yml

streamlit.yml 파일에 CI Code 입력

name: Streamlit CI

on:
  push:
    branches: [ "main" ]

env:
  AWS_REGION: ap-northeast-2

jobs:
  build-and-test:
    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.11]
    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Test with pytest
      run: |
        pip install pytest
        pytest --collect-only || true

  core-realese:
    needs: build-and-test
    runs-on: ubuntu-latest
    steps:
      # Step 1
      - name: Configure AWS credentials
        uses: aws-actions/configure-aws-credentials@v3
        with:
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_KEY }}
          aws-region: ${{ env.AWS_REGION }}

      # Step 2
      - name: Create CodeDeploy Deployment
        id: deploy
        run: |
          aws deploy create-deployment \
            --application-name lab-edu-cd-application-streamlit \
            --deployment-group-name lab-edu-cd-deploygroup \
            --deployment-config-name CodeDeployDefault.OneAtATime \
            --github-location repository=${{ github.repository }},commitId=${{ github.sha }}

위 YAML 은 “GitHub Actions로 CI 돌리고, 성공하면 CodeDeploy로 배포 트리거” 하는 파이프라인이다.

자세히 보면 main branch에 push 되면
1. build-and-test: 파이썬 환경 세팅 + 의존성 설치 +pytest로 테스트 확인
2. core-realese: 위 과정이 끝나면 CodeDeploy 배포 생성(create-deployment) 호출

CI/CD 흐름에서 보면
CI = build-and-test
CD = core-realese (배포 생성)


깃에 push

확인

AWS 에서 확인하면 배포가 진행중인것을 볼 수 있다.

DB 준비 → 코드 수정 → Git push로 CI/CD 트리거

  • DB에 로그인 계정(샘플 유저) 데이터를 넣음
  • 코드/파일을 수정(또는 이름 변경)함
  • git commit + push로 파이프라인 시작**
ubuntu@ip-10-0-1-211:/Workshop$ psql -U user -d trip_advisor -h db 주소
psql (15.15 (Ubuntu 15.15-1.pgdg24.04+1), server 15.12)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, compression: off)
Type "help" for help.

trip_advisor=> CREATE TABLE users (
    id SERIAL PRIMARY KEY,
    username VARCHAR(50) UNIQUE NOT NULL,
    email VARCHAR(255) UNIQUE NOT NULL,
    password VARCHAR(255) NOT NULL
);
CREATE TABLE
trip_advisor=> INSERT INTO users (username, email, password) 
VALUES ('user', 'user@admin.abc', '1234');
INSERT 0 1
trip_advisor=> 
ubuntu@ip-10-0-1-211:/Workshop$ vi main.py -> main.py 변경

ubuntu@ip-10-0-1-211:/Workshop/backend$ ls
add_destination.py                get_destination.py
app.py                            get_destination_redis.py
db_connection.py                  login_connection.py
db_connection_secrest_manager.py  update_destination.py
delete_destination.py
ubuntu@ip-10-0-1-211:/Workshop/backend$ vi db_connection.py -> db_connetion.py 변경

ubuntu@ip-10-0-1-211:/Workshop$ ls
README.md    images   requirements.txt  support_files
appspec.yml  main.py  scripts           widget
backend      menu     serverless_code
ubuntu@ip-10-0-1-211:/Workshop$ vi appspec.yml -> appsepec.yml 변경
ubuntu@ip-10-0-1-211:/Workshop$ vi appspec.yml 
ubuntu@ip-10-0-1-211:/Workshop$ git add .
ubuntu@ip-10-0-1-211:/Workshop$ git commit -m "login 기능 추가"
[main e855397] login 기능 추가
 3 files changed, 19 insertions(+), 18 deletions(-)
ubuntu@ip-10-0-1-211:/Workshop$ git push
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 8 threads
Compressing objects: 100% (6/6), done.
Writing objects: 100% (6/6), 710 bytes | 710.00 KiB/s, done.
Total 6 (delta 5), reused 0 (delta 0), pack-reused 0 (from 0)
remote: Resolving deltas: 100% (5/5), completed with 5 local objects.
To https://github.com/eomkyeongmun/cloud-wave.git
   2655c87..e855397  main -> main
ubuntu@ip-10-0-1-211:/Workshop$ 

확인해보면

로그인 페이지가 생성된것을 볼 수 있다.
(코드는 CI/CD 주제에서는 중요하지않아 생략했다)

마무리

이번 실습에서는 코드자체보다는 CI/CD 의 흐름을 이해하는것을 위주로 하였다. GitHub에 push → GitHub Actions가 실행 → AWS 자격증명(IAM 키)로 AWS 호출 → CodeDeploy가 EC2에 배포 하는 흐름을 실습을 통해 직접 확인했다. CI/CD 흐름을 이해하는것을 목표로 하였고 추후에 개발 프로젝트에서 CI/CD 를 진행하면 더욱 자세하게 정리 할 예정이다.

앞선 모든 AWS 블로그에서 했던 실습을 정리해보면 최종적으로는 이러한 아키텍쳐를 구성한것을 볼 수 있다. 합쳐보니 나름 큰 흐름을 만들 수 있었던거같다. 학생신분으로 비용때문에 이러한 아키텍쳐를 다시 구성할 수 있을진 모르겠지만 기회가 되면 다양한 기능을 사용해서 프로젝트를 기획하고싶다.

0개의 댓글