๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
IT/Aws

GitHub Actions CI/CD ๊ตฌ์ถ• ์™„๋ฒฝ ๊ฐ€์ด๋“œ: React ์•ฑ AWS S3 + CloudFront ์ž๋™ ๋ฐฐํฌ

by Full~ day ๐Ÿ˜€ 2026. 9. 1.
728x90
๋ฐ˜์‘ํ˜•

GitHub Actions CI/CD ๊ตฌ์ถ• ์™„๋ฒฝ ๊ฐ€์ด๋“œ: React ์•ฑ AWS S3 + CloudFront ์ž๋™ ๋ฐฐํฌ

"ํŒ€์žฅ๋‹˜, ์ œ๊ฐ€ ์ˆ˜๋™์œผ๋กœ ๋นŒ๋“œํ•ด์„œ ์˜ฌ๋ฆฌ๋‹ค๊ฐ€ ์‹ค์ˆ˜๋กœ ์˜›๋‚  ์ฝ”๋“œ๋ฅผ ๋ฎ์–ด์”Œ์› ์Šต๋‹ˆ๋‹ค..."

์•ˆ๋…•ํ•˜์„ธ์š”! ํ•ญ์ƒ ๋” ํšจ์œจ์ ์œผ๋กœ ์ผํ•  ๊ถ๋ฆฌ๋ฅผ ํ•˜๋Š” ์•„์ด๋””์–ด ๋ฑ…ํฌ, ํ”„๋ก ํŠธ์—”๋“œ ๊ฐœ๋ฐœ์ž์ž…๋‹ˆ๋‹ค.

์ฒ˜์Œ ํ˜„์—… ํ”„๋กœ์ ํŠธ๋ฅผ ๋งก์•˜์„ ๋•Œ์˜ ๊ธฐ์–ต์ด ๋‚ฉ๋‹ˆ๋‹ค. ๊ธฐ๋Šฅ ๊ฐœ๋ฐœ์„ ๋งˆ์น˜๋ฉด ๋กœ์ปฌ์—์„œ npm run build๋ฅผ ์‹คํ–‰ํ•˜๊ณ , AWS S3 ์ฝ˜์†”์— ๋กœ๊ทธ์ธํ•œ ๋’ค, ๊ธฐ์กด ํŒŒ์ผ์„ ์‚ญ์ œํ•˜๊ณ  ์ƒˆ ๋นŒ๋“œ ํŒŒ์ผ์„ ๋“œ๋ž˜๊ทธ ์•ค ๋“œ๋กญ์œผ๋กœ ์˜ฌ๋ฆฌ๋Š” ์ผ๋ จ์˜ ๊ณผ์ •์„ ํ•˜๋ฃจ์—๋„ ์„œ๋„ˆ ๋ฒˆ์”ฉ ๋ฐ˜๋ณตํ–ˆ์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‹ค ํ•œ ๋ฒˆ์€ ํŒŒ์ผ์„ ๋œ ์˜ฌ๋ฆฌ๊ฑฐ๋‚˜ ์‹ค์ˆ˜๋กœ CloudFront ์บ์‹œ ๋ฌดํšจํ™”๋ฅผ ๋นผ๋จน์–ด์„œ ์„œ๋น„์Šค ํ™”๋ฉด์ด ๊นจ์ง€๋Š” ๋Œ€ํ˜• ์‚ฌ๊ณ ๋ฅผ ์น˜๊ธฐ๋„ ํ–ˆ์ฃ .

์ด๋Ÿฐ ๋‹จ์ˆœํ•˜๊ณ  ๋ฐ˜๋ณต์ ์ธ, ๊ทธ๋ฆฌ๊ณ  ์‚ฌ๋žŒ์˜ ์‹ค์ˆ˜๊ฐ€ ๊ฐœ์ž…ํ•˜๊ธฐ ์‰ฌ์šด ๋ฐฐํฌ ๊ณผ์ •์„ 100% ์ž๋™ํ™”ํ•ด ์ฃผ๋Š” ๋งˆ๋ฒ• ๊ฐ™์€ ๊ธฐ์ˆ ์ด ๋ฐ”๋กœ CI/CD(์ง€์†์  ํ†ตํ•ฉ/์ง€์†์  ๋ฐฐํฌ)์ž…๋‹ˆ๋‹ค. ์˜ค๋Š˜์€ ์ฃผ๋‹ˆ์–ด ๊ฐœ๋ฐœ์ž๋„ ์‰ฝ๊ฒŒ ๋”ฐ๋ผ ํ•  ์ˆ˜ ์žˆ๋„๋ก GitHub Actions๋ฅผ ํ™œ์šฉํ•ด React ์•ฑ์„ AWS S3์™€ CloudFront์— ์ž๋™์œผ๋กœ ๋ฐฐํฌํ•˜๋Š” ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ•๋ฒ•์„ ํ•˜๋‚˜๋ถ€ํ„ฐ ์—ด๊นŒ์ง€ ์•Œ๊ธฐ ์‰ฝ๊ฒŒ ์„ค๋ช…ํ•ด ๋“œ๋ฆฌ๊ฒ ์Šต๋‹ˆ๋‹ค.

1. CI/CD์™€ GitHub Actions: ์ง๊ด€์ ์ธ ๋น„์œ ๋กœ ์ดํ•ดํ•˜๊ธฐ

'ํŒŒ์ดํ”„๋ผ์ธ', '์›Œํฌํ”Œ๋กœ์šฐ', 'CI/CD' ๊ฐ™์€ ๋‚ฏ์„  ๊ธฐ์ˆ  ์šฉ์–ด๋“ค์ด ๋‚˜์˜ค๋ฉด ์ง€๋ ˆ ๊ฒ๋จน๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์ด๋ฅผ ์šฐ๋ฆฌ๊ฐ€ ์ตํžˆ ์•„๋Š” '์ „์ž๋™ ๋กœ๋ด‡ ๊ณต์žฅ'์— ๋น„์œ ํ•ด ๋ณด๊ฒ ์Šต๋‹ˆ๋‹ค.

  • ์ˆ˜๋™ ๋ฐฐํฌ (๊ณผ๊ฑฐ์˜ ๋‚˜):
  • ์ˆ˜์ œ ๋ฒ„๊ฑฐ์ง‘ ์‚ฌ์žฅ๋‹˜์ž…๋‹ˆ๋‹ค. ์žฌ๋ฃŒ๋ฅผ ์ฐ๊ณ (์ฝ”๋”ฉ), ํŒจํ‹ฐ๋ฅผ ๊ตฝ๊ณ (๋นŒ๋“œ), ํฌ์žฅํ•ด์„œ(์••์ถ•), ์ง์ ‘ ์˜คํ† ๋ฐ”์ด๋ฅผ ํƒ€๊ณ  ์†๋‹˜ ์ง‘(AWS S3)๊นŒ์ง€ ๋ฐฐ๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ์†๋‹˜์ด ๋งŽ์•„์ง€๋ฉด ์‹ค์ˆ˜๊ฐ€ ์žฆ์•„์ง€๊ณ  ์‚ฌ์žฅ๋‹˜์€ ์“ฐ๋Ÿฌ์ง‘๋‹ˆ๋‹ค.
  • CI/CD ํŒŒ์ดํ”„๋ผ์ธ (GitHub Actions):
  • ์ตœ์ฒจ๋‹จ ๋กœ๋ด‡ ์ปจ๋ฒ ์ด์–ด ๋ฒจํŠธ์ž…๋‹ˆ๋‹ค. ๊ฐœ๋ฐœ์ž๋Š” ๋ ˆ์‹œํ”ผ(์ฝ”๋“œ)๋งŒ ์ž‘์„ฑํ•ด์„œ main ๋ธŒ๋žœ์น˜๋ผ๋Š” ์ƒ์ž์— ํˆญ ๋˜์ ธ ๋„ฃ๊ธฐ๋งŒ ํ•˜๋ฉด ๋ฉ๋‹ˆ๋‹ค(git push). ๊ทธ๋Ÿฌ๋ฉด ๋Œ€๊ธฐํ•˜๊ณ  ์žˆ๋˜ ๋กœ๋ด‡(GitHub Actions)์ด ์•Œ์•„์„œ ์ฝ”๋“œ๋ฅผ ๊ฒ€์‚ฌํ•˜๊ณ , ๋นŒ๋“œํ•˜๊ณ , ํฌ์žฅํ•ด์„œ AWS ์„œ๋ฒ„๊นŒ์ง€ 0.1์ดˆ ๋งŒ์— ๋กœ์ผ“ ๋ฐฐ์†ก์„ ์™„๋ฃŒํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“Š ์ˆ˜๋™ ๋ฐฐํฌ vs GitHub Actions ์ž๋™ ๋ฐฐํฌ ๋น„๊ต

๋น„๊ต ํ•ญ๋ชฉ ๊ธฐ์กด ์ˆ˜๋™ ๋ฐฐํฌ ๋ฐฉ์‹ GitHub Actions ์ž๋™ ๋ฐฐํฌ (CI/CD)
์†Œ์š” ์‹œ๊ฐ„ ๊ฐœ๋ฐœ์ž๊ฐ€ ์ง์ ‘ 5~10๋ถ„๊ฐ„ ํ™”๋ฉด์„ ๋ณด๋ฉฐ ๋Œ€๊ธฐํ•ด์•ผ ํ•จ git push ํ•œ ๋ฒˆ์ด๋ฉด ๋ฐฑ๊ทธ๋ผ์šด๋“œ์—์„œ ์ž๋™ ์‹คํ–‰ (0๋ถ„ ์†Œ์š”)
์•ˆ์ •์„ฑ (ํœด๋จผ ์—๋Ÿฌ) ๋นŒ๋“œ ๋ช…๋ น์–ด ๋ˆ„๋ฝ, ํด๋” ์—…๋กœ๋“œ ์‹ค์ˆ˜ ๋“ฑ ์œ„ํ—˜ ์กด์žฌ ์‚ฌ์ „์— ์ž‘์„ฑ๋œ ์Šคํฌ๋ฆฝํŠธ(YAML)๋Œ€๋กœ๋งŒ 100% ๋™์ผํ•˜๊ฒŒ ๋™์ž‘
๋น„์šฉ ๋ฐ ์ ‘๊ทผ์„ฑ ๋ณ„๋„ ์ธํ”„๋ผ ์ง€์‹์ด ํ•„์š” GitHub์—์„œ ๋ฌด๋ฃŒ๋กœ ์ œ๊ณตํ•˜๋ฉฐ ์„ค์ •์ด ๋งค์šฐ ๊ฐ„ํŽธํ•จ
ํ˜‘์—… ํšจ์œจ ํ•œ ์‚ฌ๋žŒ์ด ๋ฐฐํฌ ๊ถŒํ•œ์„ ๋…์ ํ•˜์—ฌ ๋ณ‘๋ชฉ ํ˜„์ƒ ๋ฐœ์ƒ ํŒ€์› ๋ˆ„๊ตฌ๋‚˜ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉ(Merge)๋งŒ ํ•˜๋ฉด ์ž๋™์œผ๋กœ ๋ฐฐํฌ๋จ

2. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• 1๋‹จ๊ณ„: AWS ๋ณด์•ˆ ์„ค์ • (๊ฐ€์žฅ ์ค‘์š”!)

๋กœ๋ด‡(GitHub Actions)์ด ๋‚ด AWS ์ฐฝ๊ณ (S3)์— ๋ฌผ๊ฑด์„ ๋„ฃ์œผ๋ ค๋ฉด ์ฐฝ๊ณ  ์—ด์‡ ๊ฐ€ ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค. ๋ณด์•ˆ์ƒ ๋‚ด ๋งˆ์Šคํ„ฐ ๊ณ„์ •์„ ์ฃผ๋ฉด ์•ˆ ๋˜๊ณ , "์˜ค์ง S3 ์—…๋กœ๋“œ์™€ CloudFront ๊ฐฑ์‹ ๋งŒ ํ•  ์ˆ˜ ์žˆ๋Š” ์•Œ๋ฐ”์ƒ์šฉ ์—ด์‡ (IAM)"๋ฅผ ๋”ฐ๋กœ ๋งŒ๋“ค์–ด์ฃผ์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. AWS ์ฝ˜์†”์—์„œ IAM (Identity and Access Management) ์„œ๋น„์Šค๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. ์ƒˆ๋กœ์šด ์‚ฌ์šฉ์ž(User)๋ฅผ ์ƒ์„ฑํ•˜๊ณ  ์ด๋ฆ„์„ github-actions-deploy-user ๋“ฑ์œผ๋กœ ์ง“์Šต๋‹ˆ๋‹ค.
  3. ๊ถŒํ•œ ์„ค์ •์—์„œ ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์ •์ฑ…(Policy)์„ ์—ฐ๊ฒฐํ•ฉ๋‹ˆ๋‹ค.
    • AmazonS3FullAccess (๋˜๋Š” ํ•ด๋‹น ๋ฒ„ํ‚ท์—๋งŒ ์ ‘๊ทผํ•˜๋Š” ์ปค์Šคํ…€ ๊ถŒํ•œ)
    • CloudFrontFullAccess (์บ์‹œ ๋ฌดํšจํ™” ์ฒ˜๋ฆฌ๋ฅผ ์œ„ํ•ด ํ•„์š”)
  4. ์‚ฌ์šฉ์ž ์ƒ์„ฑ ํ›„ ๋ณด์•ˆ ์ž๊ฒฉ ์ฆ๋ช… ํƒญ์—์„œ ์•ก์„ธ์Šค ํ‚ค(Access Key) ๋งŒ๋“ค๊ธฐ๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  5. ๋ฐœ๊ธ‰๋œ Access Key ID์™€ Secret Access Key๋ฅผ ๋ณต์‚ฌํ•ด ๋‘ก๋‹ˆ๋‹ค. (์ด ์ฐฝ์„ ๋‹ซ์œผ๋ฉด ๋‹ค์‹œ ๋ณผ ์ˆ˜ ์—†์œผ๋‹ˆ ์ฃผ์˜ํ•˜์„ธ์š”!)

3. CI/CD ํŒŒ์ดํ”„๋ผ์ธ ๊ตฌ์ถ• 2๋‹จ๊ณ„: GitHub Secrets์— ์—ด์‡  ์ˆจ๊ธฐ๊ธฐ

๋ฐœ๊ธ‰๋ฐ›์€ AWS ์—ด์‡ ๋ฅผ ์†Œ์Šค ์ฝ”๋“œ์— ๊ทธ๋Œ€๋กœ ์ ์–ด ์˜ฌ๋ฆฌ๋ฉด ์ „ ์„ธ๊ณ„ ํ•ด์ปค๋“ค์˜ ๋จน์ž‡๊ฐ์ด ๋ฉ๋‹ˆ๋‹ค. ์•ˆ์ „ํ•œ ๊ธˆ๊ณ ์ธ GitHub Secrets์— ์—ด์‡ ๋ฅผ ๋ณด๊ด€ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  1. ๋ฐฐํฌํ•  React ํ”„๋กœ์ ํŠธ์˜ GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค.
  2. Settings -> Secrets and variables -> Actions ๋ฉ”๋‰ด๋ฅผ ํด๋ฆญํ•ฉ๋‹ˆ๋‹ค.
  3. New repository secret ๋ฒ„ํŠผ์„ ๋ˆŒ๋Ÿฌ ์•„๊นŒ ๋ฉ”๋ชจํ•ด ๋‘” AWS ์ •๋ณด๋“ค์„ ๋“ฑ๋กํ•ฉ๋‹ˆ๋‹ค.
    • AWS_ACCESS_KEY_ID: ๋ณต์‚ฌํ•œ ์•ก์„ธ์Šค ํ‚ค ID
    • AWS_SECRET_ACCESS_KEY: ๋ณต์‚ฌํ•œ ์‹œํฌ๋ฆฟ ํ‚ค
    • AWS_REGION: ์„œ์šธ ๋ฆฌ์ „์ธ ๊ฒฝ์šฐ ap-northeast-2

์ด๋ ‡๊ฒŒ ๊ธˆ๊ณ ์— ๋„ฃ์–ด๋‘๋ฉด, ๋‚˜์ค‘์— ์ž‘์„ฑํ•  ์Šคํฌ๋ฆฝํŠธ์—์„œ ${{ secrets.AWS_ACCESS_KEY_ID }}๋ผ๋Š” ์ด๋ฆ„ํ‘œ๋กœ ์•ˆ์ „ํ•˜๊ฒŒ ๊บผ๋‚ด ์“ธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

4. ์‹ค์ „! GitHub Actions YAML ์Šคํฌ๋ฆฝํŠธ ์ž‘์„ฑํ•˜๊ธฐ

์ด์ œ ๋กœ๋ด‡์—๊ฒŒ ์ง€์‹œํ•  ์ž‘์—… ์ง€์‹œ์„œ(Workflow)๋ฅผ ์ž‘์„ฑํ•  ์ฐจ๋ก€์ž…๋‹ˆ๋‹ค. React ํ”„๋กœ์ ํŠธ ์ตœ์ƒ๋‹จ ๊ฒฝ๋กœ์— .github/workflows/deploy.yml ํŒŒ์ผ์„ ๋งŒ๋“ค๊ณ  ์•„๋ž˜ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•ฉ๋‹ˆ๋‹ค. ์ฃผ์„์„ ๊ผผ๊ผผํžˆ ์ฝ์–ด๋ณด์„ธ์š”!

YAML
 
# ์›Œํฌํ”Œ๋กœ์šฐ์˜ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค. GitHub Actions ํƒญ์—์„œ ์ด ์ด๋ฆ„์œผ๋กœ ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.
name: React App CI/CD to AWS S3 & CloudFront

# ์–ด๋–ค ์ด๋ฒคํŠธ๊ฐ€ ๋ฐœ์ƒํ–ˆ์„ ๋•Œ ์ด ๊ณต์žฅ์„ ๊ฐ€๋™ํ• ์ง€ ๊ฒฐ์ •ํ•ฉ๋‹ˆ๋‹ค.
on:
  push:
    branches:
      - main # main ๋ธŒ๋žœ์น˜์— push๋‚˜ merge๊ฐ€ ์ผ์–ด๋‚  ๋•Œ๋งŒ ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค.

# ๋กœ๋ด‡์ด ์ˆ˜ํ–‰ํ•  ์ž‘์—…(jobs) ๋ชฉ๋ก์ž…๋‹ˆ๋‹ค.
jobs:
  deploy:
    runs-on: ubuntu-latest # ์ตœ์‹  ์šฐ๋ถ„ํˆฌ ๋ฆฌ๋ˆ…์Šค ํ™˜๊ฒฝ์˜ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ๋ฅผ ํ•œ ๋Œ€ ๋นŒ๋ฆฝ๋‹ˆ๋‹ค.

    steps:
      # 1. ๋‚ด GitHub ์ €์žฅ์†Œ์˜ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ๋กœ ๊ฐ€์ ธ์˜ต๋‹ˆ๋‹ค. (Checkout)
      - name: 1. ์ €์žฅ์†Œ ์ฝ”๋“œ ๊ฐ€์ ธ์˜ค๊ธฐ
        uses: actions/checkout@v3

      # 2. React๋ฅผ ๋นŒ๋“œํ•˜๊ธฐ ์œ„ํ•ด Node.js ํ™˜๊ฒฝ์„ ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
      - name: 2. Node.js ํ™˜๊ฒฝ ์„ค์ •
        uses: actions/setup-node@v3
        with:
          node-version: '18' # ํ”„๋กœ์ ํŠธ์— ๋งž๋Š” ๋…ธ๋“œ ๋ฒ„์ „ ์‚ฌ์šฉ

      # 3. ํŒจํ‚ค์ง€(๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ)๋“ค์„ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.
      - name: 3. ์˜์กด์„ฑ ํŒจํ‚ค์ง€ ์„ค์น˜ (npm ci)
        run: npm ci # npm install๋ณด๋‹ค ๋น ๋ฅด๊ณ  ์ •ํ™•ํ•˜๊ฒŒ package-lock.json ๊ธฐ์ค€์œผ๋กœ ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค.

      # 4. React ์†Œ์Šค์ฝ”๋“œ๋ฅผ ๋ธŒ๋ผ์šฐ์ €๊ฐ€ ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ์ •์  ํŒŒ์ผ(HTML/CSS/JS)๋กœ ์••์ถ•(๋นŒ๋“œ)ํ•ฉ๋‹ˆ๋‹ค.
      - name: 4. ํ”„๋กœ์ ํŠธ ๋นŒ๋“œํ•˜๊ธฐ
        run: npm run build

      # 5. AWS ์—ด์‡ (์ธ์ฆ ์ •๋ณด)๋ฅผ ๊ฐ€์ƒ ์ปดํ“จํ„ฐ์— ์„ธํŒ…ํ•ฉ๋‹ˆ๋‹ค.
      - name: 5. AWS ์ž๊ฒฉ ์ฆ๋ช… ๊ตฌ์„ฑ
        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: ${{ secrets.AWS_REGION }}

      # 6. ๋นŒ๋“œ๋œ ๊ฒฐ๊ณผ๋ฌผ(build ํด๋”)์„ AWS S3 ๋ฒ„ํ‚ท์œผ๋กœ ์—…๋กœ๋“œ(๋™๊ธฐํ™”)ํ•ฉ๋‹ˆ๋‹ค.
      - name: 6. S3์— ๋นŒ๋“œ ํŒŒ์ผ ์—…๋กœ๋“œ (Sync)
        run: aws s3 sync ./build s3://my-react-bucket-name --delete
        # --delete ์˜ต์…˜: S3์—๋Š” ์žˆ์ง€๋งŒ ์ƒˆ ๋นŒ๋“œ ํด๋”์—๋Š” ์—†๋Š” ์˜›๋‚  ํŒŒ์ผ๋“ค์„ ์•Œ์•„์„œ ์‚ญ์ œํ•ด ์ค๋‹ˆ๋‹ค.

      # 7. CloudFront์˜ ์บ์‹œ๋ฅผ ์‹น ์ง€์›Œ์ค๋‹ˆ๋‹ค. (์ด๊ฑธ ์•ˆ ํ•˜๋ฉด ์‚ฌ์šฉ์ž๋Š” ์˜›๋‚  ํ™”๋ฉด์„ ๋ณด๊ฒŒ ๋ฉ๋‹ˆ๋‹ค!)
      - name: 7. CloudFront ์บ์‹œ ๋ฌดํšจํ™” (Invalidation)
        run: aws cloudfront create-invalidation --distribution-id E1A2B3C4D5E6F7 --paths "/*"
        # E1A2B3C4D5E6F7 ๋ถ€๋ถ„์€ ๋ณธ์ธ์˜ CloudFront ๋ฐฐํฌ ID๋กœ ๋ณ€๊ฒฝํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

์ด ํŒŒ์ผ์„ ์ปค๋ฐ‹ํ•˜๊ณ  main ๋ธŒ๋žœ์น˜์— ํ‘ธ์‹œ(Push)ํ•˜๋Š” ์ˆœ๊ฐ„, GitHub ๋ ˆํฌ์ง€ํ† ๋ฆฌ์˜ Actions ํƒญ์—์„œ ๋…ธ๋ž€์ƒ‰ ๋ถˆ์ด ๋“ค์–ด์˜ค๋ฉฐ ํ†ฑ๋‹ˆ๋ฐ”ํ€ด๊ฐ€ ์‹ ๋‚˜๊ฒŒ ๋Œ์•„๊ฐ€๋Š” ์งœ๋ฆฟํ•œ ๊ด‘๊ฒฝ์„ ๋ชฉ๊ฒฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค!

5. ์‹ค๋ฌด ๊ฒฝํ—˜์—์„œ ์–ป์€ ํŠธ๋Ÿฌ๋ธ”์ŠˆํŒ… ๋ฐ ๊ฟ€ํŒ (E-E-A-T)

ํ˜„์—…์—์„œ CI/CD๋ฅผ ๊ตฌ์„ฑํ•  ๋•Œ ์ฒ˜์Œ์—” ๋ฌด์กฐ๊ฑด ํ•œ๋‘ ๋ฒˆ์˜ ์‹คํŒจ๋ฅผ ๊ฒช๊ฒŒ ๋ฉ๋‹ˆ๋‹ค. ์ œ๊ฐ€ ์ง์ ‘ ๊ฒช์—ˆ๋˜ ์‹œํ–‰์ฐฉ์˜ค์™€ ํ•ด๊ฒฐ ํŒ์„ ๊ณต์œ ํ•ฉ๋‹ˆ๋‹ค.

  • ์—๋Ÿฌ ์‚ฌ๋ก€ 1: CloudFront ์บ์‹œ ๋ฌดํšจํ™”(Invalidation)๋ฅผ ๋นผ๋จน์—ˆ์„ ๋•Œ
  • ์ดˆ๋ณด ์‹œ์ ˆ S3 ์—…๋กœ๋“œ๊นŒ์ง€๋งŒ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  "๋ฐฐํฌ ๋!"์„ ์™ธ์ณค์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฐ๋ฐ ๊ธฐํš์ž๋ถ„์ด "๋ฒ„ํŠผ ์ƒ‰๊น”์ด ๊ทธ๋Œ€๋กœ์ธ๋ฐ์š”?"๋ผ๊ณ  ํ•˜์‹œ๋”๊ตฐ์š”. CloudFront๋Š” ํ•œ ๋ฒˆ ๊ฐ€์ ธ๊ฐ„ S3 ํŒŒ์ผ์„ ์—ฃ์ง€ ๋กœ์ผ€์ด์…˜์— ๊ฝ‰ ์ฅ๊ณ (์บ์‹ฑ) ๋†“์•„์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์›Œํฌํ”Œ๋กœ์šฐ 7๋‹จ๊ณ„์˜ create-invalidation ๋ช…๋ น์–ด๋Š” ์„ ํƒ์ด ์•„๋‹Œ ํ•„์ˆ˜์ž…๋‹ˆ๋‹ค. "/*" ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•ด ๋ชจ๋“  ์บ์‹œ๋ฅผ ๊ฐ•์ œ๋กœ ๋น„์›Œ์ค˜์•ผ ์ƒˆ ์ฝ”๋“œ๊ฐ€ ์ฆ‰๊ฐ ๋ฐ˜์˜๋ฉ๋‹ˆ๋‹ค.
  • ํŒ: npm install ๋Œ€์‹  npm ci๋ฅผ ์‚ฌ์šฉํ•˜์„ธ์š”
  • ์›Œํฌํ”Œ๋กœ์šฐ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ๋ณด๋ฉด ํŒจํ‚ค์ง€ ์„ค์น˜ ์‹œ npm install ๋Œ€์‹  npm ci๋ฅผ ์ ์–ด๋‘์—ˆ์Šต๋‹ˆ๋‹ค. npm install์€ ์‹คํ–‰ํ•  ๋•Œ๋งˆ๋‹ค ํŒจํ‚ค์ง€ ๋ฒ„์ „์„ ๋ฏธ์„ธํ•˜๊ฒŒ ์˜ฌ๋ฆด ์œ„ํ—˜์ด ์žˆ์ง€๋งŒ, npm ci๋Š” package-lock.json์— ๋ช…์‹œ๋œ ๋ฒ„์ „๊ณผ ํ† ์”จ ํ•˜๋‚˜ ํ‹€๋ฆฌ์ง€ ์•Š๊ณ  ๋˜‘๊ฐ™์ด ์„ค์น˜ํ•ฉ๋‹ˆ๋‹ค. ๋นŒ๋“œ ์„œ๋ฒ„์™€ ๋กœ์ปฌ ๊ฐœ๋ฐœ ํ™˜๊ฒฝ์˜ ํ™˜๊ฒฝ ๋ถˆ์ผ์น˜๋ฅผ ๋ง‰์•„์ฃผ๋Š” ์•„์ฃผ ํ›Œ๋ฅญํ•œ ์•ˆ์ „์žฅ์น˜์ž…๋‹ˆ๋‹ค.
  • ๋ณด์•ˆ ๊ณ ๋„ํ™” (์‹œ๋‹ˆ์–ด ๋ ˆ๋ฒจ์—… ํฌ์ธํŠธ): OIDC(OpenID Connect) ํ™œ์šฉ
  • ์œ„ ๊ฐ€์ด๋“œ์—์„œ๋Š” ๊ฐ€์žฅ ์ง๊ด€์ ์ธ Access Key ๋ฐœ๊ธ‰ ๋ฐฉ์‹์„ ์„ค๋ช…ํ–ˆ์Šต๋‹ˆ๋‹ค. ํ•˜์ง€๋งŒ ์‹ค๋ฌด(์—”ํ„ฐํ”„๋ผ์ด์ฆˆ ํ™˜๊ฒฝ)์—์„œ๋Š” Access Key๊ฐ€ ์œ ์ถœ๋  ์œ„ํ—˜ ์ž์ฒด๋ฅผ ์—†์• ๊ธฐ ์œ„ํ•ด OIDC๋ผ๋Š” ๊ธฐ์ˆ ์„ ์”๋‹ˆ๋‹ค. ํ‚ค๋ฅผ ๋ฐœ๊ธ‰๋ฐ›์ง€ ์•Š๊ณ , AWS์™€ GitHub๊ฐ€ ์„œ๋กœ "๋„ˆํฌ ๊ณต์žฅ์—์„œ ์˜จ ๋กœ๋ด‡์ด ๋งž๊ตฌ๋‚˜" ํ•˜๊ณ  ์‹ ๋ขฐ ๊ด€๊ณ„๋ฅผ ๋งบ์–ด ์ž„์‹œ ๊ถŒํ•œ์„ ๋ถ€์—ฌํ•˜๋Š” ๋ฐฉ์‹์ž…๋‹ˆ๋‹ค. ์ถ”ํ›„ ๋ ˆ๋ฒจ์—…์„ ์›ํ•˜์‹ ๋‹ค๋ฉด 'GitHub Actions AWS OIDC ์—ฐ๋™' ํ‚ค์›Œ๋“œ๋กœ ํ•™์Šตํ•ด ๋ณด์‹œ๊ธธ ๊ฐ•๋ ฅํžˆ ์ถ”์ฒœํ•ฉ๋‹ˆ๋‹ค.

์ด์ œ ์—ฌ๋Ÿฌ๋ถ„์€ git push ๋ช…๋ น์–ด ๋‹จ ํ•œ ์ค„๋กœ ์ฝ”๋“œ๋ฅผ ์ „ ์„ธ๊ณ„์— ๋ฐฐํฌํ•  ์ˆ˜ ์žˆ๋Š” CI/CD ํŒŒ์ดํ”„๋ผ์ธ์„ ๊ฐ–๊ฒŒ ๋˜์—ˆ์Šต๋‹ˆ๋‹ค. ์ˆ˜๋™ ๋ฐฐํฌ๋กœ ๋ฒ„๋ ค์ง€๋˜ ์‹œ๊ฐ„๊ณผ ์—๋„ˆ์ง€๋ฅผ ์•„๊ปด, ๋” ๋‚˜์€ ์ฝ”๋“œ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ์ง‘์ค‘ํ•˜์‹œ๊ธธ ์‘์›ํ•ฉ๋‹ˆ๋‹ค!

728x90
๋ฐ˜์‘ํ˜•
LIST