AWS

[AWS] aws 강의 섹션 24 - 1 (CI/CD, Code Commit, Code Build, Code Deploy)

대기업 가고 싶은 공돌이 2024. 11. 20. 23:03

CI/CD란

  • 자동으로 코드를 리포지토리에 푸시하고
  • 자동으로 테스트를 진행하며
  • 배포까지 자동으로 진행해주는 모든 과정을 말한다.

CI 란

  • 여러 종류의 코드 리포지토리가 존재한다. (대표적으로 github)
  • CI는 Continious Intergration의 약자로 지속적 통합을 의미한다.
  • 코드를 저장소에 푸시했을 때 자동으로 코드를 빌드하고, 테스트를 진행하여 코드 빌드에 문제가 없는지 확인하는 과정이 ci이다.
  • 이 빌드 과정이 무사히 통과 된다면, 바로 배포를 할 수 있다는 의미이다.

CD란

  • Continious Delivery의 약자다.
  • ci를 통해서 빌드 테스트가 통과된 코드를 배포 서버에 올려서 자동으로 배포하는 과정이다.
  • 코드를 저장소에 푸시할 때마다. 자동으로 모든 과정이 이뤄지게 만들 수 있다.

여러 가지 CI/CD 툴

  • 그림을 보면 알 수 있듯
  • 빌드와 테스트는 aws 코드 빌드에서 이뤄지고
  • 배포는 aws 코드 디플로이에서 이뤄진다.
  • 만약 provision을 하고 싶다면 elastic beanstalk을 사용할 수 있다.
  • 이 모든 과정을 한 곳에서 관리하는 도구는 AWS Code PipeLine이다.

AWS CodeCommit

  • 먼저 버전 관리라는 개념에 대해서 살펴보자
  • 코드의 모든 버전을 기록해 놓음으로서, 코드를 롤백시키거나 과거의 작업을 확인할 수 있는 유용한 기능이다.
    • 누가 커밋했고, 수정 사항, 제거 사항 등 모든 것을 확인할 수 있다.
    • 협업에 아주 유용한 도구라고 볼 수 있다.
  • AWS CodeCommit은 이러한 버전관리 도구이다. (github라고 생각하면 편하다.)
  • 용량의 제한이 없고, 완전 관리형이다.
  • 모두 암호화 되어 저장되기 때문에 보안성이 높다고 한다.

AWS CodeCommit - Security

  • 깃허브와 호환된다. 깃 명령어를 사용할 수 있다. 다만 인증은 해야한다.
    • SSH키를 사용하여 코드 커밋 레포지토리에 접근할 수 있다.
    • 비밀 번호를 사용해서 접근할 수도 있다.
  • IAM 정책을 이용해서, 사용자와 특정 리포지토리에 대한 역할 권한을 관리할 수 있다.
  • 코드는 모두 KMS를 이용해서 암호화 된다.
  • 코드를 푸시할 때는 오로지 SSH 또는 HTTPS 프로토콜에서만 푸시할 수 있다.

AWS CodePipeline

  • aws 안에서 ci/cd 툴들을 관리할 수 있게 해주는 시각적 워크 플로우 툴이다.
  • 여러 가지를 다룰 수 있다.
    • source: 코드 커밋, ECR, S3, Bitbucket, Github 중에서 코드를 가져올 수 잇다.
    • Build: 말 그대로 코드 빌드다. CoidBuild, Jenkins, CloudBees, TeamCity등이 있다.
    • Test: CodeBuild, AWS Device Farm, 다른 기타 툴 ,,
    • Deploy: CodeDeploy, Elastic Beanstalk, CloudFormation, ECS, S3
  • 이러한 단계는 순차적으로 진행할 수도 있고, 병렬적으로 구성할 수도 있다.

CodePipeline - Artifacts

  • 코드 커밋, 코드 빌드, 코드 디플로이 모든 곳에서 아티팩트를 생성할 수 있다.
    • 아티팩트란 코드 파이프라인 내에서 생성된 모든 것을 아티팩트라 부른다.
  • 아티팩트는 S3버킷에 저장된 후 다음 단계로 전달된다.
    • 여기서 다음 단계란, code build이후에 code deploy로 이동하는 것 등을 의미한다.
  • 아티팩트를 받음으로서, 다음 단계를 수행할 수 있는 것이다.

  • 예시를 살펴보자
    1. 코드 커밋에 코드를 푸시한다.
    2. 코드가 모두 추출되어 아티팩트가 만들어지고, 해당 아티팩트는 S3에 저장된다.
    3. 코드 빌드가 호출된다.
    4. 코드 빌드는 S3에 접근하여, 아티펙트를 가져와 빌드한다.
    5. 이후 빌드한 결과물을 다시 아티팩트로 만들어 S3에 저장한다.
    6. 코드 디플로이가 호출된다.
    7. S3에서 아티팩트를 가져와 배포를 진행한다.

AWS CodeBuild

  • 코드 빌드에서도 여러 가지 단계가 존재한다.
    • Source: 소스 코드를 얻는 저장소로 코드 커밋, S3, Bitbucket, Github등이 있다.
      • Build instrctions: 소스 안에 존재하는 것으로 빌드 지침이다.
        해당 파일의 이름은 buildspec.yml 이다.
        해당 파일은 루트 폴더 안에 존재해야 한다.
    • Output logs: 빌드 완료 이후 로그는 S3, CloudWatch Logs에 저장된다.
    • CloudWatch Metrics로 빌드 통계를 볼 수 있고
    • EventBridge로 빌드 실패나 트리거 알림을 감지할 수 있다.
    • CloudWatch Alarms로 임계값을 설정한 후 해당 임계값을 넘는 횟수의 실패를 알림할 수도 있다.
    • Build Project는 코드 파이프라인 또는 CodeBuild에서 정의될 수 있다.

  • 다음과 같은 환경을 지원한다.

CodeBuild - 실행 순서

  • 코드 커밋에서 소스 코드와 빌드 지침 파일을 가져온다.
  • 코드 빌드는 환경에 맞는 컨테이너를 지니고 있으며, 해당 컨테이너 내부로 모든 코드를 불러온다.
    • 도커 이미지를 통해 컨테이너를 빌드할 수도 있다.
  • 이후 빌드 지침에 따라 빌드를 수행한다.
    • 성능의 향상을 위해 S3를 캐시로 사용할 수도 있다.
  • 생성된 아티팩트는 S3로 이동하며,
  • 로그는 S3, CloudWatch Logs에 저장된다.

CodeBuild - 빌드 지침

  • 빌드 지침은 buildspec.yml에 저장된다.
  • 코드 디렉터리 최상단에 위치해야 한다.
  • 이제 변수를 살펴보자
    • env: 환경 변수를 설정하는 곳이다.
      • plaintext variable - 플레인 텍스트의 환경 변수를 설정할 수도 있고
      • parameter-store - SSM 파라미터 스토어에서 가져올 수도 있다.
      • secrets-manager - AWS Secrets Manager에서 변수를 가져올 수도 있다.
    • phases: 코드 빌드가 무엇을 할 지를 정의하는 곳이다. 주로 install이 많다.
      • install: 사전에 필요한 패키지 등을 설치하기 위한 명령어 등이 존재한다.
      • pre_build: 빌드 직전에 실행되는 명령어를 적어둔 곳이다.
      • build: 실제 빌드 명령어로 매우 중요하다. 
      • post_build: 마무리 작업으로 빌드가 되면 .zip결과물 등을 만드는 일을 의미한다.
    • artifacts: 도커 컨테이너에서 추출 되어 S3로 보내지는 파일이며, KMS로 암호화 되어 있다.
    • cache: 빌드 속도를 올리기 위해 캐싱할 파일이나 종속 항목들을 의미한다.