GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. GitHub Actions는 DevOps 이상의 기능을 제공하며 저장소에서 다른 이벤트가 발생할 때 워크플로를 실행할 수 있게 해 줍니다. GitHub는 워크플로를 실행하기 위한 Linux, Windows 및 macOS 가상 머신을 제공하며, 자체 데이터 센터 또는 클라우드 인프라에서 자체 호스팅 실행기를 호스팅 할 수도 있습니다.
오늘은 Github Actions와 CodeDeploy를 이용하여 Github Repository에 새로운 코드가 push 되었을 때 EC2 서버에 코드를 반영하는 워크플로를 만들어봅시다.
1. AWS 리소스 준비
Amazon Linux를 사용하는 EC2 Instance 하나를 준비합니다.

연결한 IAM Role에 AmazonEC2RoleforAWSCodeDeploy Policy를 추가합니다.

EC2 Instance에 CodeDeploy Agent를 설치합니다. user data를 이용하면 더 편리합니다.
#!/bin/bash
yum update -y
yum install -y ruby
AWS_DEFAULT_REGION="ap-northeast-2"
cd /home/ec2-user
wget https://aws-codedeploy-$AWS_DEFAULT_REGION.s3.$AWS_DEFAULT_REGION.amazonaws.com/latest/install
chmod +x ./install
./install auto
CodeDeploy Console에 접속하여 Create application을 누릅니다.

Application의 이름을 지정하고, Compute platform을 EC2/On-premises로 선택합니다. Create application을 눌러 생성합니다.

Deployment group을 생성하기 전, service role을 생성합니다. IAM Role을 생성할 때, Use case로 CodeDeploy를 선택하여 자유롭게 생성합니다.

Application에 들어가 Create deployment group을 누릅니다.

Deployment group의 이름을 지정하고, 생성했던 service role을 선택합니다.

Deployment type은 인스턴스 자체를 업데이트하는 In-place와 인스턴스를 교체하여 텀을 없애는 Blue/green이 있습니다. 오늘은 인스턴스 하나만 준비되었기 때문에 In-place 방식을 선택하겠습니다. 태그를 이용하여 업데이트할 인스턴스도 선택합니다.

CodeDeploy Agent는 이미 설치했으므로 설치하지 않고, Deployment configuration은 한번에 모두 업데이트하는 AllAtOnce를 선택하겠습니다.

로드밸런서 설정은 끄고, Create deployment group을 눌러 생성합니다.

Github Repository에 있는 파일들을 임시 저장하기 위해 S3 Bucket도 하나 생성해줍니다.

2. Github Actions 설정
Github에서 새 Repository 하나를 생성합니다. 그 후 Settings > Secrets and variables > Actions를 누릅니다.

배포에 필요한 권한을 가지고 있는 IAM User에서 Access Key를 발급받은 후, Repository secrets에서 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 각각 등록합니다.

로컬로 Repository를 clone 하여 CI/CD에 필요한 파일들을 작성합니다.
- .github/workflows/main.yml : CI/CD 워크플로가 진행되는 조건이나 과정 등을 명시합니다. 꼭 .github/workflows에 위치해야 하고, yml 파일 이름은 상관없습니다.
- scripts/, appspec.yml : CodeDeploy의 배포 과정에 있어 필요한 파일들입니다.
- main.go, go.mod : Golang 애플리케이션입니다. /v1/color에 접속하면 랜덤 하게 색깔을 반환하도록 코드를 짰습니다.

main.yml의 코드는 다음과 같습니다.
- .on : main 브랜치의 파일들이 push 되었을 때 워크플로가 진행되도록 합니다. workflow_dispatch도 추가하여 수동으로 워크플로를 실행할 수 있게 합니다.
- .env : 워크플로에 사용되는 환경변수를 정의합니다. (배포 리전, S3 Bucket 이름, CodeDeploy Application 이름, CodeDeploy Deployment Group 이름)
- .job.build.steps
- Checkout release : Github Repository의 코드를 Github가 제공하는 CI 서버로 전달시킵니다.
- Setup Go : CI 서버에 1.21 버전의 Golang을 설치합니다.
- Build : 소스 코드를 바이너리 파일로 컴파일합니다.
- AWS configure credentials : Secret으로 입력한 Access Key를 등록합니다.
- Upload to AWS S3 : CodeDeploy에서 사용할 파일들을 압축하여 S3 Bucket으로 보냅니다.
- Deploy to AWS EC2 from S3 : CodeDeploy & S3를 이용하여 EC2로 코드를 배포합니다.
name: Deploy to Amazon EC2
on:
push:
branches:
- main
workflow_dispatch:
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: deploy-archive-arco
CODE_DEPLOY_APPLICATION_NAME: ec2-deploy
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: ec2-golang-dg
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout release
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Build
run: go build -o main
- name: AWS configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name $CODE_DEPLOY_APPLICATION_NAME \
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
--ignore-hidden-files \
--source .
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name $CODE_DEPLOY_APPLICATION_NAME \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name $CODE_DEPLOY_DEPLOYMENT_GROUP_NAME \
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
appspec.yml의 코드는 다음과 같습니다.
- .files : 모든 파일들을 /home/ec2-user 디렉터리로 복사합니다.
- .hooks
- ApplicationStop : 수정된 파일들을 다운로드하기 전에 stop.sh를 이용하여 기존 애플리케이션을 종료시킵니다.
- ApplicationStart : 수정된 파일들과 start.sh를 이용하여 애플리케이션을 다시 시작시킵니다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user
hooks:
ApplicationStop:
- location: scripts/stop.sh
timeout: 60
runas: root
ApplicationStart:
- location: scripts/start.sh
timeout: 60
runas: root
stop.sh의 코드는 다음과 같습니다.
fuser 명령어를 이용하여 8080 포트를 사용하는 프로세스를 죽입니다.
#!/bin/bash
fuser -k 8080/tcp && echo "Stop Server" || echo "Not Running"
start.sh의 코드는 다음과 같습니다.
nohup 명령어를 이용하여 실행파일을 백그라운드로 실행시킵니다.
#!/bin/bash
cd /home/ec2-user
nohup ./main > nohup.out 2>&1 &
3. CI/CD 테스트
기존 코드에서는 /v1/color에서 Red, Green, Blue 색상을 랜덤으로 반환했습니다.

이번에는 Red, Green, Yellow를 랜덤으로 반환하도록 코드를 수정해 보겠습니다.

이제 코드를 commit & push 하여 애플리케이션에 반영됐는지 확인해 봅시다.
Github Repository의 Actions 탭에 가보면 CI/CD가 성공적으로 진행된 것을 확인할 수 있습니다.

웹사이트를 새로고침 하면 Red, Green, Yellow가 랜덤으로 반환되는 것을 볼 수 있습니다.

오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] Github Actions로 ECS 서비스에 배포 (Blue / Green) (2) | 2023.12.31 |
---|---|
[AWS] Github Actions로 ECS 서비스에 배포 (Rolling Update) (0) | 2023.12.29 |
[AWS] SSH 액세스 실패를 감지하여 이메일에 알리기 (0) | 2023.11.28 |
[AWS] Golang Gin 이미지를 만들어서 ECR에 Push (0) | 2023.10.14 |
[AWS] Managed Service for Apache Flink로 스트리밍 데이터 분석 - Studio notebooks (1) (0) | 2023.10.13 |
GitHub Actions는 빌드, 테스트 및 배포 파이프라인을 자동화할 수 있는 CI/CD 플랫폼입니다. GitHub Actions는 DevOps 이상의 기능을 제공하며 저장소에서 다른 이벤트가 발생할 때 워크플로를 실행할 수 있게 해 줍니다. GitHub는 워크플로를 실행하기 위한 Linux, Windows 및 macOS 가상 머신을 제공하며, 자체 데이터 센터 또는 클라우드 인프라에서 자체 호스팅 실행기를 호스팅 할 수도 있습니다.
오늘은 Github Actions와 CodeDeploy를 이용하여 Github Repository에 새로운 코드가 push 되었을 때 EC2 서버에 코드를 반영하는 워크플로를 만들어봅시다.
1. AWS 리소스 준비
Amazon Linux를 사용하는 EC2 Instance 하나를 준비합니다.

연결한 IAM Role에 AmazonEC2RoleforAWSCodeDeploy Policy를 추가합니다.

EC2 Instance에 CodeDeploy Agent를 설치합니다. user data를 이용하면 더 편리합니다.
#!/bin/bash
yum update -y
yum install -y ruby
AWS_DEFAULT_REGION="ap-northeast-2"
cd /home/ec2-user
wget https://aws-codedeploy-$AWS_DEFAULT_REGION.s3.$AWS_DEFAULT_REGION.amazonaws.com/latest/install
chmod +x ./install
./install auto
CodeDeploy Console에 접속하여 Create application을 누릅니다.

Application의 이름을 지정하고, Compute platform을 EC2/On-premises로 선택합니다. Create application을 눌러 생성합니다.

Deployment group을 생성하기 전, service role을 생성합니다. IAM Role을 생성할 때, Use case로 CodeDeploy를 선택하여 자유롭게 생성합니다.

Application에 들어가 Create deployment group을 누릅니다.

Deployment group의 이름을 지정하고, 생성했던 service role을 선택합니다.

Deployment type은 인스턴스 자체를 업데이트하는 In-place와 인스턴스를 교체하여 텀을 없애는 Blue/green이 있습니다. 오늘은 인스턴스 하나만 준비되었기 때문에 In-place 방식을 선택하겠습니다. 태그를 이용하여 업데이트할 인스턴스도 선택합니다.

CodeDeploy Agent는 이미 설치했으므로 설치하지 않고, Deployment configuration은 한번에 모두 업데이트하는 AllAtOnce를 선택하겠습니다.

로드밸런서 설정은 끄고, Create deployment group을 눌러 생성합니다.

Github Repository에 있는 파일들을 임시 저장하기 위해 S3 Bucket도 하나 생성해줍니다.

2. Github Actions 설정
Github에서 새 Repository 하나를 생성합니다. 그 후 Settings > Secrets and variables > Actions를 누릅니다.

배포에 필요한 권한을 가지고 있는 IAM User에서 Access Key를 발급받은 후, Repository secrets에서 AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY를 각각 등록합니다.

로컬로 Repository를 clone 하여 CI/CD에 필요한 파일들을 작성합니다.
- .github/workflows/main.yml : CI/CD 워크플로가 진행되는 조건이나 과정 등을 명시합니다. 꼭 .github/workflows에 위치해야 하고, yml 파일 이름은 상관없습니다.
- scripts/, appspec.yml : CodeDeploy의 배포 과정에 있어 필요한 파일들입니다.
- main.go, go.mod : Golang 애플리케이션입니다. /v1/color에 접속하면 랜덤 하게 색깔을 반환하도록 코드를 짰습니다.

main.yml의 코드는 다음과 같습니다.
- .on : main 브랜치의 파일들이 push 되었을 때 워크플로가 진행되도록 합니다. workflow_dispatch도 추가하여 수동으로 워크플로를 실행할 수 있게 합니다.
- .env : 워크플로에 사용되는 환경변수를 정의합니다. (배포 리전, S3 Bucket 이름, CodeDeploy Application 이름, CodeDeploy Deployment Group 이름)
- .job.build.steps
- Checkout release : Github Repository의 코드를 Github가 제공하는 CI 서버로 전달시킵니다.
- Setup Go : CI 서버에 1.21 버전의 Golang을 설치합니다.
- Build : 소스 코드를 바이너리 파일로 컴파일합니다.
- AWS configure credentials : Secret으로 입력한 Access Key를 등록합니다.
- Upload to AWS S3 : CodeDeploy에서 사용할 파일들을 압축하여 S3 Bucket으로 보냅니다.
- Deploy to AWS EC2 from S3 : CodeDeploy & S3를 이용하여 EC2로 코드를 배포합니다.
name: Deploy to Amazon EC2
on:
push:
branches:
- main
workflow_dispatch:
env:
AWS_REGION: ap-northeast-2
S3_BUCKET_NAME: deploy-archive-arco
CODE_DEPLOY_APPLICATION_NAME: ec2-deploy
CODE_DEPLOY_DEPLOYMENT_GROUP_NAME: ec2-golang-dg
jobs:
build:
runs-on: ubuntu-latest
steps:
- name: Checkout release
uses: actions/checkout@v4
- name: Setup Go
uses: actions/setup-go@v4
with:
go-version: '1.21'
- name: Build
run: go build -o main
- name: AWS configure credentials
uses: aws-actions/configure-aws-credentials@v1
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ${{ env.AWS_REGION }}
- name: Upload to AWS S3
run: |
aws deploy push \
--application-name $CODE_DEPLOY_APPLICATION_NAME \
--s3-location s3://$S3_BUCKET_NAME/$GITHUB_SHA.zip \
--ignore-hidden-files \
--source .
- name: Deploy to AWS EC2 from S3
run: |
aws deploy create-deployment \
--application-name $CODE_DEPLOY_APPLICATION_NAME \
--deployment-config-name CodeDeployDefault.AllAtOnce \
--deployment-group-name $CODE_DEPLOY_DEPLOYMENT_GROUP_NAME \
--s3-location bucket=$S3_BUCKET_NAME,key=$GITHUB_SHA.zip,bundleType=zip
appspec.yml의 코드는 다음과 같습니다.
- .files : 모든 파일들을 /home/ec2-user 디렉터리로 복사합니다.
- .hooks
- ApplicationStop : 수정된 파일들을 다운로드하기 전에 stop.sh를 이용하여 기존 애플리케이션을 종료시킵니다.
- ApplicationStart : 수정된 파일들과 start.sh를 이용하여 애플리케이션을 다시 시작시킵니다.
version: 0.0
os: linux
files:
- source: /
destination: /home/ec2-user
hooks:
ApplicationStop:
- location: scripts/stop.sh
timeout: 60
runas: root
ApplicationStart:
- location: scripts/start.sh
timeout: 60
runas: root
stop.sh의 코드는 다음과 같습니다.
fuser 명령어를 이용하여 8080 포트를 사용하는 프로세스를 죽입니다.
#!/bin/bash
fuser -k 8080/tcp && echo "Stop Server" || echo "Not Running"
start.sh의 코드는 다음과 같습니다.
nohup 명령어를 이용하여 실행파일을 백그라운드로 실행시킵니다.
#!/bin/bash
cd /home/ec2-user
nohup ./main > nohup.out 2>&1 &
3. CI/CD 테스트
기존 코드에서는 /v1/color에서 Red, Green, Blue 색상을 랜덤으로 반환했습니다.

이번에는 Red, Green, Yellow를 랜덤으로 반환하도록 코드를 수정해 보겠습니다.

이제 코드를 commit & push 하여 애플리케이션에 반영됐는지 확인해 봅시다.
Github Repository의 Actions 탭에 가보면 CI/CD가 성공적으로 진행된 것을 확인할 수 있습니다.

웹사이트를 새로고침 하면 Red, Green, Yellow가 랜덤으로 반환되는 것을 볼 수 있습니다.

오늘의 글은 여기까지입니다. 감사합니다!
'AWS' 카테고리의 다른 글
[AWS] Github Actions로 ECS 서비스에 배포 (Blue / Green) (2) | 2023.12.31 |
---|---|
[AWS] Github Actions로 ECS 서비스에 배포 (Rolling Update) (0) | 2023.12.29 |
[AWS] SSH 액세스 실패를 감지하여 이메일에 알리기 (0) | 2023.11.28 |
[AWS] Golang Gin 이미지를 만들어서 ECR에 Push (0) | 2023.10.14 |
[AWS] Managed Service for Apache Flink로 스트리밍 데이터 분석 - Studio notebooks (1) (0) | 2023.10.13 |