λ³Έλ¬Έ λ°”λ‘œκ°€κΈ°
πŸ§‘πŸ»‍πŸ’» Develop/AWS

GitHub μ—μ„œ EC2 둜 μžλ™ 배포(CD) λ„μž…ν•˜κΈ° (AWS)

by dev-jaesoon 2023. 2. 14.

μžλ™ 배포(CD) μ™œ ν•„μš”ν•œκ°€?

  ν”„λ‘œμ νŠΈλ₯Ό 진행 쀑 일정 λ‹¨μœ„μ˜ 개발이 μ™„λ£Œλœλ‹€λ©΄, λ³€κ²½ λ‚΄μš©μ„ μ‹€μ œ μ„œλ²„μ— λ°˜μ˜ν•˜κΈ° μœ„ν•œ Deployment λ₯Ό μ§„ν–‰ν•˜κ²Œ λœλ‹€. ν•˜μ§€λ§Œ, μ΄λŸ¬ν•œ Deploy μž‘μ—…μ΄ 무언가 νŠΉλ³„ν•œ μƒˆλ‘œμš΄ 과정이 μžˆλŠ” 것이 μ•„λ‹ˆλΌ 늘 같은 과정을 λ°˜λ³΅ν•˜λŠ” 것이기 λ•Œλ¬Έμ—, 개발 이외에 λ§Žμ€ 곡수λ₯Ό μž‘μ•„λ¨ΉλŠ” μž‘μ—… 쀑 ν•˜λ‚˜μ΄λ‹€.

  그리고, μ‹€μ œ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ„ μš΄μ˜ν•¨μ— μžˆμ–΄μ„œλ„ μ΄λŸ¬ν•œ Deploy μž‘μ—…μ„ 인간이 μˆ˜λ™μœΌλ‘œ μ‹€μ‹œν•˜λ‹€λ³΄λ©΄, μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ˜ λ³€κ²½ λ‚΄μš©κ³Ό 관계없이 μ‚¬λžŒμ˜ μ‹€μˆ˜λ‘œ μΈν•œ μž₯μ• κ°€ λ°œμƒν•˜κΈ°λ„ ν•œλ‹€. μ΄λ ‡κ²Œ Deploy μž‘μ—…μ— λΆˆν•„μš”ν•˜κ³  λΉ„νš¨μœ¨μ μœΌλ‘œ λ§Žμ€ μ‹œκ°„μ„ μ†Œλͺ¨ν•œλ‹€λ©΄, μ΄λŠ” μœ μ €μ— λŒ€ν•œ μƒˆλ‘œμš΄ κΈ°λŠ₯κ³Ό μ„œλΉ„μŠ€ 제곡이 λŠ¦μ–΄μ§μ„ μ˜λ―Έν•œλ‹€.

  κ·Έλž˜μ„œ μ΄λŸ¬ν•œ 문제λ₯Ό ν•΄κ²°ν•˜κΈ° μœ„ν•œ λ…Έλ ₯으둜 λ§Žμ€ μ• ν”Œλ¦¬μΌ€μ΄μ…˜μ— CI/CD κ°€ λ„μž…λ˜κ³  있고, κ·Έ μ€‘μ—μ„œλ„ CDλŠ” 지속적인 μ„œλΉ„μŠ€ 제곡(Continuous Delivery) 및 지속적인 배포(Continuous Deployment)λ₯Ό μ˜λ―Έν•˜κ³  μžˆλ‹€.

 

μ‚¬μš©ν•  AWS μ„œλΉ„μŠ€

  • CodeDeploy : μ‹€μ œλ‘œ EC2에 Source Code λ₯Ό μ—…λ‘œλ“œν•˜μ—¬, Deploy λ₯Ό μ‹€μ‹œ
  • CodePipeline : GitHub, S3, CodeDeploy 와 μ—°κ³„ν•˜μ—¬ Auto deploy κ°€ κ°€λŠ₯ν•˜λ„λ‘ νŒŒμ΄ν”„λΌμΈμ„ 제곡
  • EC2 : Source Code κ°€ Deploy λ˜λŠ” λŒ€μƒ μ„œλ²„
  • S3 : λ³€κ²½λœ Source Code λ₯Ό μ €μž₯ν•˜κΈ° μœ„ν•œ μ €μž₯μ†Œ

 

μžλ™ 배포의 흐름

 

사전 μž‘μ—…

1. μžλ™ 배포λ₯Ό 진행할 μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 생성 및 μ„€μ • (GitHub)

μ• ν”Œλ¦¬μΌ€μ΄μ…˜ 생성은 κ°„λ‹¨ν•œ 절차라고 μƒκ°ν•˜κΈ° λ•Œλ¬Έμ— μ—¬κΈ°μ—μ„œλŠ” ꡬ체적으둜 μ„€λͺ…ν•˜μ§€ μ•ŠλŠ”λ‹€. κ·Έλƒ₯ GitHub Repository λ₯Ό ν•˜λ‚˜ μƒμ„±ν•˜κ³ , μžμ‹ μ΄ 개발 쀑인 ν”„λ‘œμ νŠΈλ₯Ό Push ν•˜λ©΄λœλ‹€. 단, CodeDeploy μ‚¬μš©μ„ μœ„ν•΄ μž‘μ„±μ΄ ν•„μš”ν•œ 파일이 μžˆλ‹€. 

EC2 에 Source Code λ₯Ό λ°°ν¬ν•˜λŠ” 것이기 λ•Œλ¬Έμ—, Source Coder λ₯Ό μ–΄λ–€ 디렉터리 ꡬ쑰에 λ°°μΉ˜ν•΄μ•Όν•˜κ³ , 배포 μ‹œμ— μ–΄λ–€ μž‘μ—…μ„ μ‹€ν–‰ν•΄μ•Όν•˜λŠ”μ§€ μ •μ˜ν•˜κΈ° μœ„ν•΄μ„œ, Source directory root 에 appspec.yml μ΄λΌλŠ” YAML νŒŒμΌμ„ μž‘μ„±ν•΄μ•Όν•œλ‹€.

version: 0.0
os: linux
# Source Code λ₯Ό λ°°μΉ˜ν•  μœ„μΉ˜, overwrite 을 μ˜΅μ…˜μœΌλ‘œ μ‚¬μš©κ°€λŠ₯
files:
  - source: /
    destination: /var/www/html
    overwrite: yes
# ν•„μš”μ— λ”°λΌμ„œλŠ” 배포 ν›„ 파일의 κΆŒν•œμ„ μ„€μ •ν•  수 있음
permissions:
  - object: /var/www/html
    owner: develop
    group: develop
    mode: 755
    type:
      - directory
  - object: /var/www/html
    owner: develop
    group: develop
    mode: 664
    type:
      - file
# CodeDeploy μ‹€ν–‰ μ „/ν›„λ‘œ ν•„μš”ν•œ λ™μž‘μ„ sh νŒŒμΌμ— μ •μ˜ν•΄ μ‹€ν–‰
# (BeforeInstall, AfterInstall, ApplicationStart, ApplicationStop 등이 있음)
# hooks 의 install_dependencies.sh λŠ” ν•„μš”μ— 따라 자유둭게 μž‘μ„±
hooks:
  AfterInstall:
    - location: scripts/install_dependencies.sh
      runas: develop

 

2.  AWS - GitHub 계정 연동

CodeDeploy 의 섀정을 μ§„ν–‰ν•˜κΈ°μ— μ•žμ„œ AWS CodeDeploy 에 GitHub 계정을 연동할 ν•„μš”κ°€ μžˆλ‹€. CodeDeploy - Settings - Connections - Create connection μ—μ„œ GitHub λ₯Ό μ„ νƒν•˜μ—¬ 정보λ₯Ό μž…λ ₯ν•œ ν›„, Connect to GitHub 을 ν΄λ¦­ν•˜λ©΄ GitHub SSO 연동 νŽ˜μ΄μ§€κ°€ λœ¬λ‹€.

μœ„μ™€ 같이 Status κ°€ Available 이 되면 성곡

3.  EC2 Tag μ„€μ • 및 CodeDeploy Agent μ„€μΉ˜

CodeDeploy 의 섀정이 크게 Applications 생성 → Deployment groups 생성 순으둜 μ§„ν–‰λ˜λŠ”λ°, Deployment groups 의 배포 λŒ€μƒμ΄ λ˜λŠ” EC2 λ₯Ό μ‹λ³„ν•˜κΈ° μœ„ν•΄ EC2 에 Tag λ₯Ό μΆ”κ°€ν•΄μ•Ό ν•œλ‹€. λ‚˜λŠ” Key λ₯Ό deploy, Value λŠ” code-deploy 둜 ν•΄μ£Όμ—ˆλ‹€.

μ € Tag λ₯Ό μ‚¬μš©ν•˜μ—¬, CodeDeploy μ—μ„œ EC2 λ₯Ό 식별

그리고 μ•„λž˜μ˜ Document λ₯Ό μ°Έκ³ ν•˜μ—¬, EC2 에 CodeDeploy Agent λ₯Ό μ„€μΉ˜ν•œλ‹€.

4. S3 Bucket 생성

CodePipeline 을 μ„€μ •ν•  λ•Œ, Source Code λ₯Ό μ••μΆ•ν•˜μ—¬ 보관할 μœ„μΉ˜λ₯Ό 지정할 수 μžˆλ‹€. Default λ₯Ό μ‚¬μš©ν•˜λ©΄ Bucket name 에 hash  string 이 λΆ™κΈ° λ•Œλ¬Έμ—, λͺ…ν™•ν•˜κ²Œ μ΄λ¦„μœΌλ‘œ ꡬ뢄 κ°€λŠ₯ν•Ÿλ„λ‘ λ”°λ‘œ Bucekt 을 μƒμ„±ν•΄μ£Όμ—ˆλ‹€. S3 에 νŠΉλ³„νžˆ μ„€μ •ν•  것은 μ—†μ§€λ§Œ, EC2 와 S3, CodeDeploy 와 CodePipeline 이 λͺ¨λ‘ 같은 Region μ•ˆμ— μžˆλ„λ‘ 생성해야 ν•œλ‹€.

 

5. IAM 생성

μžλ™ 배포가 μ‹€ν–‰λ˜λŠ” κ³Όμ •μ—μ„œ EC2 λŠ” S3에 CodeDeploy 와 CodePipeline 은 CodeDeploy 의 μ—¬λŸ¬ 정보(GitHub 계정 연동 정보와 같은) 에 μ ‘κ·Όν•˜κΈ° λ•Œλ¬Έμ—, 총 2개의 IAM Role 생성이 ν•„μš”ν•˜λ‹€. IAM - Role - Create Role 을 ν΄λ¦­ν•˜μ—¬, μ•„λž˜μ™€ 같이 IAM Role 에 각각 ν•„μš”ν•œ Policyλ₯Ό λΆ€μ—¬ν•œλ‹€. 단, S3 에 λŒ€ν•œ Permissions 의 경우 μ΄λ²ˆμ—λŠ” AmazoneS3FullAccess Policy λ₯Ό λΆ€μ—¬ν•˜μ§€λ§Œ, μ‹€μ œλ‘œλŠ” ν•„μš”ν•œ S3 Bucket 만으둜 λ²”μœ„λ₯Ό μ’ν˜€μ„œ μ„€μ •ν•˜λŠ” 것을 ꢌμž₯ν•œλ‹€.

IAM Role 1 : Select trusted entity - Use case EC2 + AmazoneS3FullAccess

 

IAM Role 2 : Select trusted entity - Use case CodeDeploy + AWSCodeDeployRole

CD μ„€μ •

1. CodeDeploy μ„€μ •

μ•žμ—μ„œλ„ 잠깐 μ΄μ•ΌκΈ°ν–ˆμ§€λ§Œ, CodeDeploy 의 μ„€μ •μ—λŠ”  Applications κ³Ό Deployment groups 생성이 ν•„μš”ν•˜λ‹€. CodeDeploy - Deploy - Applications - Create application 을 ν΄λ¦­ν•˜μ—¬, μ•„λž˜μ™€ 같이 μž…λ ₯ν•΄μ€€λ‹€. ν˜Ήμ‹œ 배포 λŒ€μƒμ΄ EC2 κ°€ μ•„λ‹ˆλΌλ©΄, Compute platform μ—μ„œ λ°°ν¬ν•˜κ³ μž ν•˜λŠ” λŒ€μƒμ„ μ„ νƒν•˜λ©΄ λœλ‹€.

생성을 μ™„λ£Œν•˜λ©΄ μƒμ„±ν•œ CodeDeploy Application νŽ˜μ΄μ§€λ‘œ μ΄λ™ν•˜λŠ”λ°, μ—¬κΈ°μ—μ„œ λ°”λ‘œ Create deployment group 을 ν΄λ¦­ν•˜μ—¬, ν•„μš”ν•œ 정보λ₯Ό μž…λ ₯ν•˜κ³  μ™„λ£Œν•΄μ€€λ‹€.

  • Service role : "IAM 생성" μ—μ„œ λ§Œλ“  CodeDeploy IAM Role μ„€μ •
  • Deployment type
    • In-place
    • μžμ‹ μ˜ Deploy ν™˜κ²½μ— 따라, Blue/green 배포 방식도 μ‚¬μš© κ°€λŠ₯
  • Environment configuration
    • Amazon EC2 instances : ν•œ λŒ€μ˜ EC2 에 λŒ€ν•΄μ„œ λ°°ν¬ν•˜λŠ” 것이기 λ•Œλ¬Έμ— (ASG μ‚¬μš© κ°€λŠ₯)
    • Key λŠ” deploy, Value λŠ” code-deploy μž…λ ₯ : μ •μƒμ μœΌλ‘œ EC2 λ₯Ό μΈμ‹ν•˜λ©΄ 1 unique matched instance 라고 좜λ ₯
  • Deployment settings
    • CodeDeployDefault.AllAtOnce 을 μ‚¬μš©
    • μžμ‹ μ˜ ν™˜κ²½μ— λ§žμΆ°μ„œ deployment configuration 을 λ§Œλ“€ 수 있음
  • Load balancer : Enable load balancing 에 체크 ν•΄μ œ (μ΄λ²ˆμ— λ”°λ‘œ μ„€μ •ν•˜μ§€ μ•ŠμŒ)

μž…λ ₯을 λͺ¨λ‘ μ™„λ£Œν•˜κ³  λ‚˜λ©΄, CodeDeploy 에 μ„€μ •λœ Application κ³Ό Deployment group 을 μ•„λž˜μ™€ 같이 확인할 수 μžˆλ‹€.

 

2. CodePipeline μ„€μ •

GitHub λ₯Ό 톡해 CodeDeploy κ°€ 싀행될 수 μžˆλ„λ‘ trigger λ₯Ό μ„€μ •ν•΄ μ£ΌλŠ” 뢀뢄이닀. CodeDeploy - Pipeline - Create pipeline 을 클릭해 ν•„μš”ν•œ 정보λ₯Ό μž…λ ₯ν•΄μ€€λ‹€.

  • Choose pipeline settings
    • Service role : μœ„μ—μ„œ 생성해쀀 IAM Role κ³Ό λ™μΌν•œ Role 을 μ‚¬μš©ν•˜κ±°λ‚˜, New service role 둜 해도 OK
    • Advanced settings - Custom location : S3 Bucket 을 지정
  • Add source stage
    • Source provider : GitHub (Version 2)
    • Connection : μœ„μ—μ„œ μ„€μ •ν•œ GitHub Connection 선택
    • Repository & Branch name
      • λ°°ν¬ν•˜κ³ μž ν•˜λŠ” Repository 의 branch 선택
      • PR Merge 도 Branch 의 Source Code κ°€ λ³€κ²½λœ 것이기 λ•Œλ¬Έμ—, λ˜‘κ°™μ΄ 싀행됨
    • Change detection options : Start the pipeline on source code change Check (μ½”λ“œκ°€ λ³€κ²½λ˜λ©΄ μžλ™μœΌλ‘œ μ‹€ν–‰)
       
    • Output artifact format : CodePipeline default
  • Add build stage : νŠΉλ³„νžˆ μ‚¬μš©ν•˜κ³  μžˆλŠ” build tools 이 μ—†λ‹€λ©΄, Skip build stage
  • Add deploy stage
    • Deploy provider : AWS CodeDeploy 선택
    • Application name & Deployment group : CodeDeploy μ—μ„œ μƒμ„±ν•œ 정보 μž…λ ₯
μž…λ ₯이 λͺ¨λ‘ μ™„λ£Œλ˜μ–΄ Pipeline 을 생성해주면, CodePipeline μƒμ„Έν™”λ©΄μœΌλ‘œ μžλ™μœΌλ‘œ μ΄λ™ν•˜μ—¬, Code deploy κ°€ μžλ™μœΌλ‘œ μ‹€ν–‰λœλ‹€.
ν˜Ήμ‹œλ‚˜ μ‹€νŒ¨ν•˜μ˜€λ‹€λ©΄, EC2 의 CodeDeploy Agent Log λ₯Ό 톡해 원인을 찾을 수 μžˆλ‹€. (/var/log/aws/codedeploy-agent/codedeploy-agent.log)

 

 

λŒ“κΈ€