GitHub Actions, AWS ECR, EC2, Docker, Nginx๋ฅผ ์กฐํฉํ์ฌ ์๋ ๋ฐฐํฌ DevOps ํ์ดํ๋ผ์ธ์ ์ค๊ณ ๋ฐ ๊ตฌํํ๋ค.
1. ์ํคํ ์ฒ ์ค๊ณ
์ ์ฒด ์๋ํ ํ๋ฆ์ ์๋์ ๊ฐ์ด ๊ตฌ์ฑํ๋ค.
(1) ๊นํ๋ธ ๋ ํฌ์งํ ๋ฆฌ์ ์ฝ๋๋ฅผ ํธ์ํ๋ฉด, GitHub Actions์ด ํธ๋ฆฌ๊ฑฐ๋์ด Dockerfile์ ๊ธฐ๋ฐ์ผ๋ก nginx ๊ธฐ๋ฐ ์ด๋ฏธ์ง๊ฐ ๋น๋๋๋ค.
(2) AWS ECR์ ๋น๋๋ ์ด๋ฏธ์ง๋ฅผ pushํ๊ณ , EC2 ์ธ์คํด์ค์์ pull ๋ฐ๋๋ค.
2. GitHub Actions
GitHub Actions๋ฅผ ์ฌ์ฉํ๋ฉด ์ฝ๋ ํธ์, PR ๋ฑ์ ์ด๋ฒคํธ๋ฅผ ํธ๋ฆฌ๊ฑฐ๋ก ์ผ์ ์๋ํ๋ ์ํฌํ๋ก์ฐ๋ฅผ ์คํํ ์ ์๋๋ก ํด์ค๋ค.
์ํฌํ๋ก์ฐ๋ ๋น๋, ํ
์คํธ, ๋ฐฐํฌ์ ๊ฐ์ ์ผ๋ จ์ ์์
๋ค์ ์ ์ํ ๊ตฌ์ฑ ํ์ผ์ด๋ฉฐ Repository ๋ด .github/workflows ๋๋ ํฐ๋ฆฌ์ YAML ํ์ผ๋ก ์์นํ๋ค.
๋๋ GitHub Actions๋ฅผ ํตํด ์ฝ๋๊ฐ main ๋ธ๋์น์ ํธ์๋ ๋ ์๋์ผ๋ก Docker ์ด๋ฏธ์ง๋ฅผ ๋น๋ํ๊ณ , ์ด๋ฅผ ECR์ ์ ๋ก๋ํ ๋ค EC2 ์ธ์คํด์ค์์ ์ปจํ ์ด๋๋ฅผ ์ฌ์์ํ๋๋ก ์ค์ ํด์ผ ํ๋ค.
๋ฐ๋ผ์, ๋จผ์ ์๋์ ํ์ผ ์์น์ yaml ํ์ผ์ ์์ฑํด์คฌ๋ค.
name: Deploy Frontend
on:
push:
branches:
- main
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v3
- name: ์ํฌํ๋ก์ฐ์ ์ด๋ฆ
- on - push: ์ํฌํ๋ก์ฐ๊ฐ main branch์ push ์ด๋ฒคํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ์คํ๋๋ค๋ ๋ป
- jobs: ์ํฌํ๋ก์ฐ์์ ์คํํ ์์ ๋ค์ ์งํฉ์ ์ ์
- runs-on: deploy๋ job์ด ์ด๋ค OS ํ๊ฒฝ์์ ์คํ๋ ์ง๋ฅผ ์ ํ๋ ๋ถ๋ถ์ผ๋ก ์ต์ Ubuntu ๊ฐ์ ํ๊ฒฝ์์ ์คํํ๊ฒ ๋ค๋ ์๋ฏธ (์คํ๋๋ ์๋ฒ๋ GitHub Actions์ด ๋งค ์ํฌํ๋ก์ฐ ์คํ ์ ์๋์ผ๋ก ์์ฑํ๊ณ ์ญ์ ํ๋ ์ผ์์ ์ธ ๋จธ์ ์ ๋ปํ๋ค.)
- actions/checkout@v3: GitHub์ด ๊ณต์ ์ ๊ณตํ๋ ์ก์ ์ค ํ๋๋ก, ๋จธ์ ์ ํ์ฌ ๋ธ๋์น์ ์ฝ๋๋ฅผ ๋ด๋ ค๋ฐ๋๋ค๋ ๋ป
3. ECR ์์ฑ๊ณผ IAM ๊ถํ ๋ถ์ฌ
ECR์ AWS์์ ์ ๊ณตํ๋ Docker ์ด๋ฏธ์ง ์ ์ฅ์๋ก, ๋ด๊ฐ ๋น๋ํ ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ฏธ์ง๋ฅผ ์์ ํ๊ฒ ์ ์ฅํ๊ณ , EC2๋ ECS์ ๊ฐ์ AWS ๋ฆฌ์์ค์์ ์ฝ๊ฒ pullํ์ฌ ์ฌ์ฉํ ์ ์๋๋ก ํด์ค๋ค. (๋์ปคํ๋ธ์ ๋น์ทํ ์ญํ )
(1) ECR ์์ฑ
GitHub Actions์์ ๋น๋ํ Docker ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํ ์ ์๋๋ก ECR ๋ฆฌํฌ์งํ ๋ฆฌ๋ฅผ ์์ฑํ๋ค.
๋ํ, GitHub Actions์์ ๋งค๋ฒ docker build ํ docker push ํ๋ฉด์ ์ ์ด๋ฏธ์ง๊ฐ ์์ด๊ธฐ ๋๋ฌธ์ ์ด๋ฅผ ์ํ ์๋ช ์ฃผ๊ธฐ์ ์ฑ ์ ์ค์ ํด์คฌ๋ค.
(2) IAM ๊ถํ ๋ถ์ฌ
ECR๊ณผ EC2์ ์ ๊ทผํ๊ธฐ ์ํด์๋ IAM ๊ถํ์ด ํ์ํ๋ค.
GitHub Actions์์ ECR์ ๋ก๊ทธ์ธํ์ฌ ์ด๋ฏธ์ง๋ฅผ pushํด์ผ ํ๊ณ , ECR์์ ์ด๋ฏธ์ง๋ฅผ pull ๋ฐ์ EC2 ์ธ์คํด์ค์ ๋ฐฐํฌํด์ผ ํ๋ค.
๋ฐ๋ผ์ IAM ์ฝ์์์ ์๋ก์ด ์ฌ์ฉ์๋ฅผ ์์ฑํ๊ณ , AmazonEC2ContainerRegistryFullAccess ๊ถํ์ ๋ถ์ฌํด์คฌ๋ค.
(3) GitHub Secret ๋ฑ๋กํ๊ธฐ
IAM ์ฌ์ฉ์์ AWS Secret Key, Access Key๋ฅผ ๋ฐ๊ธ ๋ฐ์ ์ด ํค๋ฅผ ํตํด ECR์ ๋ก๊ทธ์ธํด์ผ ํ๋ค. ๋ฐ๋ผ์ GitHub ๋ฆฌํฌ์งํ ๋ฆฌ์ Settings → Secrets and variables → Actions์ ํด๋น ํค๋ค์ ๋ฑ๋กํ๋ค.
๋ฑ๋ก ํ, build job์ ์ด yaml ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
jobs:
build:
name: Build Docker Image and Push to ECR
runs-on: ubuntu-latest
steps:
- name: Checkout source code
uses: actions/checkout@v3
- name: Configure AWS Credentials
uses: aws-actions/configure-aws-credentials@v2
with:
aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}
aws-region: ap-northeast-2
- name: Login to AWS ECR
id: login-ecr
uses: aws-actions/amazon-ecr-login@v2
- name: Build Docker Image
run: docker build -t $REPOSITORY_NAME:$IMAGE_TAG .
- name: Tag Docker Image
run: docker tag $REPOSITORY_NAME:$IMAGE_TAG ${{ steps.login-ecr.outputs.registry }}/$REPOSITORY_NAME:$IMAGE_TAG
- name: Push Image to ECR
run: docker push ${{ steps.login-ecr.outputs.registry }}/$REPOSITORY_NAME:$IMAGE_TAG
4. EC2์์ ๋ฐฐํฌ
deploy job์ ์๋ก ์ ์ธํด์ค๋ค. ECR์ ์ฌ๋ผ๊ฐ Docker Image๋ฅผ EC2 ์ธ์คํด์ค์์ pullํ๊ณ ์คํํ๋ ๋จ๊ณ์ด๋ค.
nees: build๋ฅผ ์ถ๊ฐํ์ฌ build ํ ์คํ๋๋๋ก ์ค์ ํด์ค๋ค.
runner ์๋ฒ์์ ssh๋ฅผ ํตํด์ ec2์ ์ ์ํด์ผ ํ๊ธฐ ๋๋ฌธ์, github secrets์ EC2์ ๊ด๋ จ๋ ๋ณ์๋ ์ถ๊ฐํด์ค๋ค.
PEM ํค๋ฅผ ๋ฃ์๋ ๊ผญ -----BEGIN RSA PRIVATE KEY----- ๋ถํฐ ๋๊น์ง ๋ฃ์ด์ผํจ..!!
GitHub Actions์์ ์ ๊ณตํ๋ ssh-action์ ์ฌ์ฉํ๋ค.
env ํ์ผ์ workflow์ ์ ์ธํ๊ณ jobs๋ค์์ ์ฌ์ฉํ๋ ค๊ณ ํ์ผ๋... ec2์ ssh๋ก ์ ์ํ๋ฉด์ ์ ์ญ๋ณ์์ธ env๋ฅผ ์ฌ์ฉํ ์ ์๊ฒ ๋์ด ์๋ฌ๊ฐ ๋ฌ๋ค.
outputs์ผ๋ก registry๋ฅผ ์ ์ธํ๊ณ ๋ฐ๋ ๋ฐฉ์๋ ํด๋ดค์ง๋ง ์คํจ..
์ด๋ ๊ฒ ์คํฌ๋ฆฝํธ ๋ด๋ถ์์ export ํ๋ ๋ฐฉ์๋ ์คํจ...
์์ฒญ ํค๋งค๋ค๊ฐ ๊ฒฐ๊ตญ ... secrets์ ecr uri์ ๋ค์ด๊ฐ๋ account id๋ฅผ ์ถ๊ฐํด์ฃผ๊ณ env ๋ณ์๋ฅผ ํ๋ํ๋ ๋ฃ์ด์ฃผ๋ ๋ฐฉ์์ผ๋ก ํด๊ฒฐํ์ ใ
์ด๊ฒ ์ต์ ์ธ์ง๋ ๋ชจ๋ฅธ๋ค..
๋ฐ๋ผ์ ๊ฒฐ๊ณผ์ ์ผ๋ก deploy ๋ถ๋ถ์ ์ฝ๋๋ ์๋์ ๊ฐ๋ค.
deploy:
name: Deploy to EC2
runs-on: ubuntu-latest
needs: build
steps:
- name: Deploy to EC2 via SSH
uses: appleboy/ssh-action@v1.0.3
with:
host: ${{ secrets.EC2_HOST }}
username: ec2-user
key: ${{ secrets.EC2_SSH_KEY }}
script: |
docker stop ${{ env.REPOSITORY_NAME }} || true
docker rm ${{ env.REPOSITORY_NAME }} || true
aws ecr get-login-password --region ap-northeast-2 | docker login --username AWS --password-stdin ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com/${{ env.REPOSITORY_NAME }}
docker pull ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com/${{ env.REPOSITORY_NAME }}:latest
docker run -d --name ${{ env.REPOSITORY_NAME }} -p 80:80 ${{ env.AWS_ACCOUNT_ID }}.dkr.ecr.ap-northeast-2.amazonaws.com/${{ env.REPOSITORY_NAME }}:latest
๊ทธ๋ฐ๋ฐ๋ ์์ ์๋ฌ๊ฐ ๋จ๋ฉฐ ์๋ผ์ ์ฐพ์๋ณด๋.. EC2์๋ AWS key๊ฐ์ด ์ ๋ฌ๋์ง ์๊ธฐ ๋๋ฌธ์ ECR์ ์ ๊ทผํ ์ ์๋ ์ญํ ์ ๋ถ์ฌ์ค์ผ ํ๋ค.
IAM์ ์ญํ ์์ฑ์์ EC2 ์๋น์ค์ AmazonEC2ContainerRegistryFullAccess ์ ์ฑ
์ ์ฐ๊ฒฐํด์ฃผ๊ณ , ์ด ์ญํ ์ ๋ด๊ฐ ๋ง๋ ์ธ์คํด์ค์ ๋ถ์ฌํด์คฌ๋ค.
๋๋์ด ์ฑ๊ณต ,,
์ด์ ํผ๋ธ๋ฆญ IP๋ก ์ ์ํ๋ฉด ์น์ด ๋ณด์ด๊ฒ ๋์๋ค!
'Infra & DevOps' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
[FE] ๋ชจ๋ฐ์ผ ์ฒญ์ฒฉ์ฅ - ๋๋ฉ์ธ ์ฐ๊ฒฐ (3) | 2025.06.19 |
---|---|
[Linux] Fail2Ban์ด SSH ํฌํธ์์ ๋์ํ์ง ์๋ ์ด์ ์ ํธ๋ฌ๋ธ์ํ (0) | 2025.02.04 |
[AWS] Native Observability - Logs ์ค์ต (1) | 2024.11.12 |
[Docker] PostgreSQL ์ปจํ ์ด๋์์ timezone ์ค์ ํ๊ธฐ (0) | 2024.10.31 |
[Windows] Windows Server 2019์ ssh ์๋ฒ ์ค์น (0) | 2024.10.01 |