CI/CD
왜 CI/CD 를 사용하나?
CD/CD 는 개발 -> 배포 흐름을 반복하면서 실수를 줄이고 안정적으로 자주 배포하기 위해 사용한다.
수동으로 배포했을때는 누가, 언제, 무엇을 배포했는지 기록이 흐려지고 장애나면 롤백이 느리거나 불가능 할 수 있다.
CI
CD
현재 CI/CD 를 사용할때 정말 많은 툴이 있지만 이번에는 깃액션과 AWS CodeDeploy를 통해 진행하여 두개를 위주로 설명하였다.
GitHub(서비스/플랫폼)
개발 흐름을 간단하게 보면
1. 로컬에서 작업하고 git add / git commit
2. GitHub로 git push 해서 공유
3. GitHub에서 PR로 리뷰/머지
4. 머지되면 CI/CD가 자동으로 돌아감
실습
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 에 배포 명령을 내릴 수 있게 권한을 발급하기 위함이다.
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 등록
Settings 탭 → Secrets and variables 선택 → Actions 선택 → New repository secret 버튼 클릭Add secret 버튼 클릭~/.ssh/access_key.json 파일을 복사해서 붙여넣기
Add secret 버튼 클릭CodeDeploy Application 생성
애플리케이션 탭 → 애플리케이션 생성 버튼 클릭
Amazon EC2 인스턴스 체크로드 밸런싱 활성화 체크 x
CodeDeploy Agent 설정
CodeDeploy Agent 설치
관련 패키지 다운로드, 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/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 트리거
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 블로그에서 했던 실습을 정리해보면 최종적으로는 이러한 아키텍쳐를 구성한것을 볼 수 있다. 합쳐보니 나름 큰 흐름을 만들 수 있었던거같다. 학생신분으로 비용때문에 이러한 아키텍쳐를 다시 구성할 수 있을진 모르겠지만 기회가 되면 다양한 기능을 사용해서 프로젝트를 기획하고싶다.