๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

AWS

AWS / CI/CD

CI/CD

Continuous Integration, Continuous Development

ํ…Œ์ŠคํŠธ, ํ†ตํ•ฉ, ๋ฐฐํฌ์˜ ๊ณผ์ •์„ ์ž๋™ํ™”ํ•˜๋Š” ๊ฒƒ์„ ์˜๋ฏธ

 

์ฝ”๋“œ๋ฅผ ์—…๋ฐ์ดํŠธ / ์ถ”๊ฐ€ ์ž‘์„ฑ ํ›„ ์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜์— Merge, ๋ฐฐํฌ, s3 ์ฝ”๋“œ ๋ณ€๊ฒฝ, ๋ฌดํšจํ™” ๋“ฑ...์˜ ๋ฒˆ๊ฑฐ๋กœ์šด ๊ณผ์ •์„ ์ž๋™ํ™”์‹œํ‚จ๋‹ค. => ์ฝ”๋“œ์—๋งŒ ์ง‘์ค‘ํ•  ์ˆ˜ ์žˆ์Œ! 

 

CI/CD์˜ ๊ณผ์ •

 

 

CI/CD ๊ตฌ์ถ• ํˆด ์ข…๋ฅ˜

  • Github Actions
  • Jenkins
  • Circle CI
  • Travis CI

 

Jenkins ์ž์ฒด๋Š” ๋งŽ์ด ์“ฐ์ด์ง€๋งŒ, ๋ณ„๋„ ์„œ๋ฒ„์— ๊ตฌ์ถ•์„ ํ•ด์•ผํ•œ๋‹ค๋Š” ๋‹จ์ ์ด ์žˆ๋‹ค.

๋ฐ˜๋ฉด Github Actions๋Š” ๋ณ„๋„์˜ ์„œ๋ฒ„ ๊ตฌ์ถ• ์—†์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์–ด์„œ ๋น„์šฉ์ ์ธ ์ธก๋ฉด์œผ๋กœ๋‚˜ ์„œ๋ฒ„ ์…‹ํŒ…์ด ํ•„์š”์—†๋‹ค

 

 

Github Actions

๊นƒํ—ˆ๋ธŒ์—์„œ ๊ณต์‹์ ์œผ๋กœ ์ œ๊ณตํ•˜๋Š” CI/CD ํˆด๋กœ, ๋นŒ๋“œ-ํ…Œ์ŠคํŠธ-๋ฐฐํฌ ๋กœ์ง์„ ์‹คํ–‰์‹œํ‚ค๋Š” ์—ญํ• 

 

๋”๋ณด๊ธฐ
  1. ์ฝ”๋“œ ์ž‘์„ฑ ํ›„ Commit
  2. Github์— Push
  3. Push๋ฅผ ๊ฐ์ง€ํ•ด์„œ Github Actions์— ์ž‘์„ฑํ•œ ๋กœ์ง์ด ์‹คํ–‰
    1. ๋นŒ๋“œ(Build)
    2. ํ…Œ์ŠคํŠธ(Test)
    3. ์„œ๋ฒ„๋กœ ๋ฐฐํฌ(Deploy)
  4. ์„œ๋ฒ„์—์„œ ๋ฐฐํฌ๋œ ์ตœ์‹  ์ฝ”๋“œ๋กœ ์„œ๋ฒ„๋ฅผ ์žฌ์‹คํ–‰

 

 

 


 

 

 

์‹ค์Šต

์ผ๋‹จ ์‹ค์Šต์šฉ์œผ๋กœ ์ƒˆ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋ฅผ ํ•˜๋‚˜ ์ƒ์„ฑํ–ˆ๋‹ค.

 

github actions ์‹ค์Šต์šฉ์ด๋ฏ€๋กœ ํ”„๋กœ์ ํŠธ๋ฅผ ๋”ฐ๋กœ ๊ตณ์ด ๋งŒ๋“ค ํ•„์š”๋Š” ์—†์–ด์„œ

์–ด์ œ ์‹ค์Šต์šฉ์œผ๋กœ ์ƒ์„ฑํ–ˆ๋˜ vite ํ”„๋กœ์ ํŠธ๋ฅผ ๋“ค๊ณ ์™€์„œ pushํ–ˆ๋‹ค.

 

git init # ๊นƒ ์ดˆ๊ธฐํ™”
git add . # ํŒŒ์ผ ์ถ”๊ฐ€
git commit -m "first commit" # ์ปค๋ฐ‹
git branch -M main # main ๋ธŒ๋žœ์น˜๋กœ
git remote add origin ๋ ˆํฌ์ง€ํ† ๋ฆฌ ๋งํฌ # ๋ ˆํฌ์ง€ํ† ๋ฆฌ์™€ ์—ฐ๊ฒฐํ•˜๊ธฐ
git push -u origin main # pushํ•˜๊ธฐ

 

 

๊ทธ๋ฆฌ๊ณ  ํ”„๋กœ์ ํŠธ ํด๋” ๋‚ด ์ตœ์ƒ๋‹จ์— ๋‹ค์Œ๊ณผ ๊ฐ™์ด ํด๋” ๋ฐ ํŒŒ์ผ์„ ์ƒ์„ฑํ•œ๋‹ค. Github Actions๋ฅผ ์‹คํ–‰์‹œํ‚ค๊ธฐ ์œ„ํ•ด์„œ๋Š” ๋ฐ˜๋“œ์‹œ ๋งŒ๋“ค์–ด์ค˜์•ผ๋œ๋‹ค..

ํ”„๋กœ์ ํŠธ ํด๋”
แ„‚.github
    แ„‚workflows
        แ„‚deploy.yml

 

deploy.yml

# Workflow : ํ•˜๋‚˜์˜ yml ํŒŒ์ผ์„ ํ•˜๋‚˜์˜ Workflow๋ผ๊ณ  ๋ถ€๋ฆ„
name: Github Actions ์‹คํ–‰์‹œํ‚ค๊ธฐ

# Event : ์‹คํ–‰๋˜๋Š” ์‹œ์ ์„ ์„ค์ •
# main์ด๋ผ๋Š” ๋ธŒ๋žœ์น˜์— push ๋  ๋•Œ ์•„๋ž˜ Workflow๋ฅผ ์‹คํ–‰
on:
  push:
    branches:
      # - ๋ธŒ๋žœ์น˜๋ช… << ์ด๋Ÿฐ์‹์œผ๋กœ ๋„์–ด์“ฐ๊ธฐ ๊ผญ ํ• ๊ฒƒ..
      - main

# Workflow๋Š” ์—ฌ๋Ÿฌ ๊ฐœ์˜ Job์œผ๋กœ ์ด๋ฃจ์–ด์งˆ ์ˆ˜ ์žˆ๊ณ  ๋ณ‘๋ ฌ์ ์œผ๋กœ ์ˆ˜ํ–‰๋จ
jobs:
  # Job์„ ์‹๋ณ„ํ•˜๋Š” id
  My-Develop-Job:
    runs-on: ubuntu-latest
    # ํ•˜๋‚˜์˜ Job์€ ์—ฌ๋Ÿฌ ๊ฐœ์˜ step์œผ๋กœ ์ด๋ฃจ์–ด์ ธ ์žˆ์Œ
    steps:
      - name: Hello World ์ถœ๋ ฅํ•˜๊ธฐ # Step์˜ ์ด๋ฆ„
        run: echo "Hello World" # ์‹คํ–‰์‹œํ‚ฌ ๋ช…๋ น์–ด

      - name: ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด ๋ฌธ์žฅ ์ž‘์„ฑํ•˜๊ธฐ
        # ์—ฌ๋Ÿฌ ๋ช…๋ น์–ด ์ž‘์„ฑํ•  ๋•Œ๋Š” | ์‚ฌ์šฉํ•˜๊ธฐ
        run: |
          echo "Good"
          echo "Morning"
          pwd

      # ์ฐธ๊ณ : https://docs.github.com/en/actions/learn-github-actions/variables
      - name: Github Actions ์ž์ฒด์— ์ €์žฅ๋œ ๋ณ€์ˆ˜ ์‚ฌ์šฉ
        run: |
          echo $GITHUB_REPOSITORY
          echo $GITHUB_SHA

      - name: Github Actions Secret ๋ณ€์ˆ˜ ์‚ฌ์šฉ
        run: |
          echo ${{ secrets.MY_NAME }}
          echo ${{ secrets.MY_HOBBY }}

 

์ด์ œ add commit push๋ฅผ ํ•ด๋ณด๋ฉด

 

 

์ด ๋•Œ ๋งˆ์ง€๋ง‰ Github Action Secret ๋ณ€์ˆ˜๋“ค์€ ์ถœ๋ ฅ๋˜์ง€ ์•Š๊ณ  ์žˆ๋Š”๋ฐ,

๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ฃผ์ง€ ์•Š์•˜๊ธฐ ๋•Œ๋ฌธ์— ๋‹น์—ฐํ•˜๋‹ค.

๋ณ€์ˆ˜๋ฅผ ์ง€์ •ํ•ด์ฃผ๋ ค๋ฉด ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ Settings ํƒญ์— ๋“ค์–ด๊ฐ€ Secrets and variables - Actions์œผ๋กœ ๋“ค์–ด๊ฐ„๋‹ค.

 


๊ทธ๋ฆฌ๊ณ  New repository secret์„ ์ƒ์„ฑํ•œ๋‹ค

 

 

์ด์ œ action์„ ์žฌ์‹คํ–‰ํ•ด์•ผํ•˜๋ฏ€๋กœ deploy.yml์—์„œ step ์ด๋ฆ„์„ ์กฐ๊ธˆ ์ˆ˜์ •ํ•˜๋˜๊ฐ€ ์ฃผ์„์„ ์ถ”๊ฐ€ํ•ด์„œ ๋ณ€๊ฒฝ์‚ฌํ•ญ์„ ๋งŒ๋“ค์–ด๋‚ด add commit push๋ฅผ ํ•œ ํ›„ ๋‹ค์‹œ action์„ ์‹คํ–‰ํ•ด๋ณด๋ฉด

 

 

๋ญ”๊ฐ€ ์ถœ๋ ฅ์€ ๋˜๋Š”๋ฐ ***๋กœ ์•”ํ˜ธํ™”๋ผ์„œ ๋ณด์—ฌ์ง€๊ณ ์žˆ๋‹ค 

๋ณดํ†ต ์ด๋Ÿฐ secret ๋ณ€์ˆ˜๋Š” ๋ฏผ๊ฐํ•œ ๊ฐ’(๋น„๋ฐ€๋ฒˆํ˜ธ ๋“ฑ)์„ ์ €์žฅํ•  ๋•Œ ์ƒ์„ฑํ•˜๊ธฐ ๋•Œ๋ฌธ์— ๋ณด์—ฌ์ฃผ์ง€ ์•Š๊ณ  ์žˆ๋‹ค.

 

 

 


 

 

 

React ํ”„๋กœ์ ํŠธ์— CI/CD ์ ์šฉ

์ „์ฒด์ ์ธ ํ๋ฆ„

 

 

์ผ๋‹จ github actions ์ž์ฒด๋Š” aws์˜ ์™ธ๋ถ€ ์„œ๋น„์Šค์ด๊ธฐ ๋•Œ๋ฌธ์— ๋”ฐ๋กœ ์•ก์„ธ์Šคํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์•„์•ผ ํ•œ๋‹ค.

 

IAM

 

์œ ๋ช…ํ•œ ๋…ธ๋ž˜๊ฐ€ ์ƒ๊ฐ๋‚˜์ง€๋งŒ ๊ทธ๊ฑด ์•„๋‹ˆ๊ณ 

Identity and Access Management์˜ ์•ฝ์ž๋กœ AWS ๋ฆฌ์†Œ์Šค์— ๋Œ€ํ•œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ๋ฅผ ํ•˜๋Š” ์„œ๋น„์Šค๋‹ค.

https://us-east-1.console.aws.amazon.com/iam/home?region=ap-northeast-2#/home 

 

 

1. ์‚ฌ์šฉ์ž ์ƒ์„ฑ

 

์•„๋ฌดํŠผ IAM์— ๋“ค์–ด๊ฐ€์„œ ์•ก์„ธ์Šค ๊ด€๋ฆฌ - ์‚ฌ์šฉ์ž - ์‚ฌ์šฉ์ž ์ƒ์„ฑ ํด๋ฆญ

์ด๋ฆ„์€ ์ž„์˜๋กœ ์•„๋ฌด๊ฑฐ๋‚˜ ์ฃผ๊ณ  ๋‹ค์Œ์œผ๋กœ ๋„˜์–ด๊ฐ„๋‹ค

 

 

์ด์ œ ๊ถŒํ•œ ์ •์ฑ…์„ ์—ฐ๊ฒฐํ•œ๋‹ค. ์ง์ ‘ ์ •์ฑ… ์—ฐ๊ฒฐ์„ ํด๋ฆญ ํ›„

1. Amazons3fullAccess

2. CloudFrontFullAccess

๋ฅผ ์ฒดํฌ ํ›„ ๋‹ค์Œ ํด๋ฆญ -> ์‚ฌ์šฉ์ž ์ƒ์„ฑ ํด๋ฆญ

 

 

์‚ฌ์šฉ์ž ์ƒ์„ฑ์„ ์™„๋ฃŒํ•œ๊ฒƒ์ด๋‹ค..

 

 

2. ์•ก์„ธ์Šค ํ‚ค ๋ฐœ๊ธ‰

์ด์ œ ์ƒ์„ฑ๋œ ์‚ฌ์šฉ์ž ํด๋ฆญ ํ›„ ๋ณด์•ˆ ์ž๊ฒฉ์ฆ๋ช… ํƒญ - ์•ก์„ธ์Šค ํ‚ค ํ•ญ๋ชฉ - ์•ก์„ธ์Šค ํ‚ค ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•œ๋‹ค.

 

๊ทธ๋‹ค์Œ AWS ์™ธ๋ถ€์—์„œ ์‹คํ–‰๋˜๋Š” ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜ ํด๋ฆญ - ์„ค๋ช… ํƒœ๊ทธ๋Š” ๊ตณ์ด ์•ˆ์“ฐ๊ณ  ์ƒ๋žตํ•˜๊ณ  ๋„˜์–ด๊ฐ - ์•ก์„ธ์Šคํ‚ค ๋งŒ๋“ค๊ธฐ!

 

 

์ด์ œ ์•ก์„ธ์Šค๊ฐ€ ๋งŒ๋“ค์–ด์กŒ๋Š”๋ฐ ์ด์ œ ์—ฌ๊ธฐ์„œ ์ฐฝ์„ ๋‚˜๊ฐ€๋ฉด ์•ˆ๋œ๋‹ค... ๋‚˜๊ฐ€๋ฉด์•ˆ๋˜๊ณ 

์•ก์„ธ์Šค ํ‚ค๋ž‘ ๋น„๋ฐ€ ์•ก์„ธ์Šคํ‚ค๋ฅผ ์–ด๋””๋‹ค ๋ฏธ๋ฆฌ๋ฏธ๋ฆฌ ๋ณต๋ถ™ํ•ด๋‘ฌ์•ผํ•œ๋‹ค

 

 

 

์ด์ œ ๋‹ค์‹œ ๋‚ด ๊นƒํ—ˆ๋ธŒ ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™

Settings - Secrets and variables - Actions ์ด๋™ํ•ด์„œ new repository secret ๋‘๊ฐœ ์ถ”๊ฐ€

1) AWS_ACCESS_KEY_ID : ์•ก์„ธ์Šค ํ‚ค

2) AWS_SECRET_ACCESS_KEY : ๋น„๋ฐ€ ์•ก์„ธ์Šค ํ‚ค

 

 

์ด์ œ ๋น„๋ฐ€ ํ‚ค๋„ ๋งŒ๋“ค๊ณ  ์ด๋ฅผ ์‚ฌ์šฉํ•ด์„œ deploy.yml์—์„œ ์ž๋™ํ™”ํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ด์ค˜์•ผ ํ•œ๋‹ค.

 

 

3. deploy.yml ์ž‘์„ฑ


์ผ๋‹จ ์—ฌ๊ธฐ์„œ ์ปค๋ฐ‹ ํ›„ Pushํ•œ ํŒŒ์ผ๋“ค์„ ๋ถˆ๋Ÿฌ์™€์•ผ ํ•˜๋Š”๋ฐ, ์ด๋ฅผ ์–ด๋–ป๊ฒŒํ•˜๋ƒ๋ฉด

github marketplace ์— ๊ฐ€์„œ checkout ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•ด์•ผํ•œ๋‹ค.

 

1) checkout v4 ์‚ฌ์šฉ

 

๊ธฐ๋ณธ ์‚ฌ์šฉ๋ฐฉ๋ฒ•์€ step์— -uses: action/checkout@v4 ๋ฅผ ์ถ”๊ฐ€ํ•˜๊ธฐ.

๊ทธ ์™ธ ๊ธฐํƒ€ ์„ค์ •์€ ํ•ด๋‹น ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ์ฐธ๊ณ 

 

์ด ์™ธ์—๋„ aws์™€์˜ ์—ฐ๊ฒฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋“ค์„ ์‚ฌ์šฉํ•˜๋Š”๋ฐ ๊ทธ๊ฑด ์•„๋ž˜ deploy.yml์— ์ ์–ด๋’€๋‹ค

name: Deploy To S3 and Invalidate CloudFront

on:
  push:
    branches:
      - main

jobs:
  deploy:
    runs-on: ubuntu-latest
    steps:
      - name: Github Repository ํŒŒ์ผ ๋ถˆ๋Ÿฌ์˜ค๊ธฐ
        # github ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ checkout ์‚ฌ์šฉ
        uses: actions/checkout@v4

      - name: ์˜์กด์„ฑ ์„ค์น˜
        run: npm i

      - name: ๋นŒ๋“œํ•˜๊ธฐ
        run: npm run build

      - name: AWS Resource์— ์ ‘๊ทผํ•  ์ˆ˜ ์žˆ๊ฒŒ AWS ์ธ์ฆ ์„ค์ •
        uses: aws-actions/configure-aws-credentials@v4
        with:
          aws-region: ap-northeast-2
          aws-access-key-id: ${{ secrets.AWS_ACCESS_KEY_ID }}
          aws-secret-access-key: ${{ secrets.AWS_SECRET_ACCESS_KEY }}

      - name: S3 ๊ธฐ์กด ํŒŒ์ผ๋“ค ์ „์ฒด ์‚ญ์ œ
        # 250528-facebook-web : S3์—์„œ์˜ ๋ฐฐํฌ๋ช…
        run: aws s3 rm --recursive s3://250528-facebook-web

      - name: S3์— ๋นŒ๋“œ๋œ ํŒŒ์ผ ์—…๋กœ๋“œํ•˜๊ธฐ
        run: aws s3 cp ./dist s3://250528-facebook-web/ --recursive

      - name: CloudFront ์บ์‹œ ๋ฌดํšจํ™”
        # --distribution-id ๋ฐฐํฌID
        run: aws cloudfront create-invalidation --distribution-id E233UE5GOZVBDT --paths "/*"

 

 

์ด์ œ ๋˜‘๊ฐ™์ด add commit push๋ฅผ ํ•˜๋ฉด ์ž๋™ํ™”๊ฐ€ ์ž˜ ๋  ๊ฒƒ์ด๋‹ค! 

 

 

 

 

 

 

์ด๋ฏธ์ง€ ์ถœ์ฒ˜
CI/CD ๊ณผ์ • : https://www.performetriks.com/post/load-test-in-a-cicd-environment