ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • CodePipeline으로 CI/CD 구축하기
    인프라/aws 2024. 3. 19. 03:22

    프로젝트를 진행하면서 게시글 서비스를 github action과 docker hub를 사용해서 ci/cd를 구축해서 사용하고 있었습니다.

    이번에 유저 서비스를 새로 만들면서 인프라 툴을 여러 곳에 분산해서 사용하는 것보다 한 곳으로 모으는 것에 이점이 있을 것 같아서 

    이미지 관리와 CI/CD 방법을 변경하면서 작성하는 글입니다.

     

    여러 차례 막히는 구간이 생겨서 하루 종일 고생하다가 정리해두는 것이 좋을 것 같아 오랜만에 글로 남깁니다.

     

    [관련 포스팅]

    1. Elastic Container Registry (ECR) 로 도커 이미지 관리하기

    2. CodeBuild로 ECR 갱신하기

    3. CodeDeploy로 EC2에 배포하기

    4. CodePipeline으로 CI/CD 구축하기

     


     

    글은 크게 5가지 항목으로 진행됩니다.

     

    1. 내가 이해한 CodePipeline

    2. 개별 stage 준비하기

    3. pipeline 생성하기

    4. pipeline 트리거 추가하기

    5. 동작확인하기

     

     

    위에 적어둔 관련 포스팅에 작성한 CodeBuild와 CodeDeploy를 적용해서 pipline을 구성합니다.

    똑같은 환경에서 진행하고 싶으신 분들은 이전 글들을 참고 부탁드립니다.

    ( V2 타입으로 생성한 파이프라인은 프리티어에서 비용을 발생시킬 수 있습니다. 100분까지 무료 by 2024.03.19 비용링크)

     

     

    1.  내가 이해한 CodePipeline

    Jenkins 나 Github Action과 기본적인 흐름은 동일하다고 이해하고 있습니다. 각 ci/cd 툴마다 용어는 조금씩 다르지만 특정 기능을 하는 프로세스를 미리 정의해두고, 필요한 시점에 미리 정의된 기능들을 가져다 실행시켜주는 방식으로 진행이 됩니다.

     

    aws의 CodePipline 역시 CodeBuild, CodeDeploy 와 같은 서비스를 특정 사용자의 요구에 맞추어 특정 시점에 실행되도록 실행 흐름을 만들어주는 서비스라고 생각합니다. (이전 stage의 결과물을 다음 stage의 input으로 넘겨주도록 설계가 되어있습니다.)

     

     

    2.  개별 stage 준비하기

    코드 파이프라인은 여러 단계의 stage로 구성되어있고, 해당 stage에 설정된 서비스를 실행시켜주는 방식으로 동작합니다.

     

    2-1. S3에 pipeline 서비스가 사용할 bucket 생성하기

    pipeline이 stage의 결과물을 전달하기 위해서 s3를 사용기 때문에, 이를 위한 공간을 확보해주어야합니다.

    버킷 이름만 잘 정해주고 기본설정으로 생성합니다.

     

     

    2-2. CodeBuild 수정하기

    앞선 글에서 작업했던 방식은 CodeBuild를 독립적으로 사용하는 방식이었습니다. pipeline에서는 CodeBuild의 다음 단계인 CodeDeploy에 artifacts를 넘겨주어야하기 때문에 관련 설정 변경이 필요합니다.

     

    우선 buildspec.yml에 artifact 관련 설정을 추가합니다.

    현재 CodeBuild가 가지고 있는 모든 내용을 artifacts로 전달하겠다는 의미의 '**/*' 입니다.

    version: 0.2
    phases:
      pre_build:
        commands:
          - aws ecr get-login-password --region $AWS_DEFAULT_REGION | docker login --username AWS --password-stdin $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com
      build:
        commands:
          - docker build -t $IMAGE_REPO_NAME:$IMAGE_TAG .
          - docker tag $IMAGE_REPO_NAME:$IMAGE_TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
      post_build:
        commands:
          - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$IMAGE_TAG
    
    artifacts:
      files:
        - '**/*'

     

     

    현재 build과정에서 파일이 생성되는 것이 아니고 ECR에 도커 이미지를 push 하기 때문에 별도의 결과물은 없지만, Code pipeline의 동작이 항상 artifacts를 넘기도록 설정되어있습니다. 따라서 build project 수정 페이지에서 S3에 artifacts를 남기도록 설정해줍니다.

     

     

    CodeBuild는 이전 stage에서 github에 올라가있는 소스코드를 전달받아서 가지고 있습니다. CodeBuild 다음 단계인 CodeDeploy도 소스코드를 기반으로 동작하도록 설정이 되어있기 때문에 artifacts로 빌드의 결과물이 아닌 소스코드를 전달합니다.

     

     

    2-3. EC2에 권한 부여

    CodeDeploy가 EC2에서 S3에 있는 artifacts를 가져오기 위해서 추가 권한이 필요합니다.

    해당 버킷의 read 권한이면 충분합니다. (저는 AmazonS3FullAccess 권한을 부여하였습니다.)

     

     

     

    3.  pipeline 생성하기

    크게 pipeliine 생성 > 소스 stage > 빌드 stage > 배포 stage 순서로 진행됩니다.

     

     

    2-1. pipeline 생성

    다른 서비스와 비슷하게 전체를 관리하는 레벨인 pipeline을 생성하고, pipeline에게 필요한 권한을 설정합니다.

     

     

    2-2. 소스코드 출처 선택

    저는 github에 있는 제 소스코드를 기반으로 pipeline을 구축하고 있습니다.

    Connection 파트는 이전에 연결한 기록이 있다면 바로 선택이 가능하고 없다면 Connect to Github으로 원하는 계정과 연결을 해주어야합니다.

     

     

    2-3. 빌드 툴 선택

    jenkins와 CodeBuild 중에 선택해서 사용할 수 있습니다. 저는 이미 작동은 확인한 CodeBuild를 가지고 있기 때문에 여기에 바로 연결해서 사용하겠습니다. 하나의 툴을 사용했을 때 편리해짐을 느낄 수 있습니다.

     

    2-4. 배포 툴 선택

    마찬가지로 미리 작성해둔 CodeDeploy Application을 연결해줍니다.

     

     

     

    4.  pipeline 트리거 추가하기

    마지막으로 어느 시점에 지금까지 생성한 파이프 라인이 동작하기를 원하는지 설정해주어야합니다.

    저는 build에 서버 재시작까지 포함한 스크립트를 실행시키기 때문에 pr이 closed 되면 실행되는 것으로 지정하겠습니다.

     

    먼저 파이프라인 수정하기 페이지로 이동합니다.

    Trigger 섹션에서 Add trigger로 trigger를 추가합니다.

     

    여러가지 옵션 중에 저는 dev 브랜치 관련된 pr이 closed 하는 시점에 실행되도록 작성하였습니다.

     

     

     

    5.  동작 확인하기

    init-cicd 의 내용을 dev 에 머지하는 pr을 생성하고 머지를 진행했습니다.

     

    dev에 머지되고 pr이 close 되면서 Codepipeline이 실행되는 것을 확인할 수 있습니다.

     

    프리티어가 아니라면 pr 생성 시에 빌드를 확인하는 파이프라인을 더 만들면 좋겠지만 비용상의 이슈로 빌드 실행 파이프라인만 구축해봅니다.

     

     

    감사합니다

Designed by Tistory.