이 연재글은 AWS 람다(lambda) 실습의 7번째 글입니다.

CircleCI란?

CircleCI는 지속적인 통합 및 배포( continuous intergration/deploy)를 지원하는 애플리케이션입니다. github에서는 MarkerPlace를 통해 설치하여 쉽게 사용할 수 있습니다. CircleCi는 개발 용도에 따라 여러 가지 방식으로 사용될 수 있지만 주로 개발한 소스에 대한 지속적인 통합을 위한 빌드, 테스트, 배포를 자동화하기 위해 사용합니다. 설치형인 jenkins와 유사한 기능을 제공하는 애플리케이션이라고 보면 됩니다.

장점

별도 서버에 설치할 필요가 없습니다. circleci에서 필요한 환경은 docker를 통해 내부적으로 생성하여 작업 환경을 구성하도록 되어있으며 작업이 완료되면 작업 환경을 삭제하는 구조로 되어있습니다. 따라서 개발자가 CI환경을 구축하기 위한 서버 리소스를 준비할 필요가 없는 serverless 애플리케이션으로 볼 수 있습니다.

yml 작성만으로 작업을 수행할 수 있어 복잡한 스크립트나 언어를 익힐 필요가 없습니다. 개발 소스의 루트에 config.yml 파일을 작성해 놓으면 circleci가 해당 파일을 읽어 자동으로 환경을 구축하고 열거된 명령을 수행하게 됩니다. 이러한 특성은 docker나 ansible 같은 infrastructure as code로서의 특징과 유사합니다.

설치와 동시에 자신의 github repository와 곧바로 연동이 되므로 repository와 ci 간의 연동을 위한 추가 작업이 필요하지 않습니다.

Web ui를 제공하여 작업 진행과정을 스텝별로 상세하게 확인할 수 있습니다. 각 스텝별로 로그를 화면에 출력하기 때문에 실패가 발생할 경우 즉시 확인 후 조치가 가능합니다.

단점

설치형이 아니기 때문에 좀 더 빠르고 고성능의 ci환경을 구축하고 싶으면 더 높은 등급의 요금제를 구독하여 사용해야 합니다.

yml을 읽어 작업을 수행하므로 복잡한 명령을 수행하는 yml을 작성하는 데 있어 어려움이 따를 수 있습니다. 아무래도 jenkins 같은 설치형에 비해서는 다양한 plugin 사용 및 자유로운 환경 구축에 대한 자유도는 다소 부족하다고 볼 수 있습니다.

그렇지만 circleci는 별다른 사전 준비 없이도 Light Weight 하게 곧바로 작업을 진행할 수 있다는 점에서 큰 메리트가 있다고 할 수 있습니다.

CircleCI 설치

github 상단 메뉴에서 Marketplace를 클릭하고 circleci를 검색합니다.

검색결과의 CircleCI를 클릭하면 circleci 앱으로 이동하는데 Set up a plan을 눌러 가격 및 정책을 확인하고 Setup을 진행합니다.

비용에 따른 상품별로 성능이 다른 환경을 제공하므로 자신이 필요로 하는 구독 정책을 선택하여 진행합니다. 실습에서는 별다른 성능이 필요치 않으므로 Free를 선택하여 진행하겠습니다. 왼편에 Free를 선택하고 Install it for free 버튼을 클릭합니다.

선택한 내용에 대해서 한번더 확인 후에 Complete order and begin installation를 클릭합니다.

circleci가 github repository에 접근이 가능하도록 권한을 요청하는데 Authorize circleci를 클릭하여 권한을 부여합니다.

github 연동이 완료되면 작업을 수행할 organization을 선택합니다.

circleci 설치과정이 완료되고 메인화면으로 이동합니다. 별다른 문제없이 연동되었다면 아래와 같이 github repository를 확인할 수 있습니다.

실습에서는 로컬에서 작성한 lambda 코드를 aws에 배포하는 용도로 circleci를 사용할 것입니다. 연동할 repository(ServerlessAwsLambda)의 오른편에 있는 Set Up Project를 클릭합니다.

이동한 화면에서는 선택한 프로젝트에서 사용되는 언어를 선택합니다. 언어를 선택하면 해당 언어별로 환경을 구성하기 위한 config.yml 예제 코드가 제공됩니다. lambda는 node로 작성되었으므로 Node를 선택 후 Start Building을 클릭합니다.

circleci가 작업을 진행하기 위해서는 소스 Repository의 root에 config.yml이 존재해야 하는데 자동으로 만들 것인지 수동으로 만들 것인지 안내하는 화면이 아래처럼 노출됩니다. 여기서는 Add Config를 눌러 자동으로 파일을 추가합니다.

이때 master 기준으로 circleci-project-setup 브랜치가 신규로 생성되며 해당 repository root에 선택한 언어의 예제 코드가 .circleci/config.yml로 추가됩니다. 이때 config.yml 예제 코드의 내용에 의해 자동으로 circleci 작업이 수행됩니다.

작업이 실패하였는데 FAILED -> build-and-test를 클릭하여 들어가 보면 작업 진행 내용에 대한 상세한 로그를 확인할 수 있습니다. test가 정의되어 있지 않아 오류가 발생한 것을 로그를 통해 알 수 있습니다.

각각의 빌드 내역에 대해서는 https://circleci.com/vcs-authorize/ 에서 Login In with GitHub로 로그인하여 대시보드를 통해 언제든지 다시 확인이 가능합니다.

config.yml 작성

이제 config.yml을 입맛에 맞게 수정하여 Lambda코드의 빌드 및 배포가 가능하도록 변경해 보겠습니다. config.yml 수정을 위해 로컬에 circleci-project-setup 브랜치를 pull 받아 작업 내역을 작성합니다. 작성이 완료되면 해당 브랜치를 배포할 환경의 브랜치 (dev, sandbox, master… 등)에 merge 합니다.

config.yml 내용을 작성하는 방법에 대해서는 방대한 내용이므로 따로 설명하지 않고 링크로 대체하겠습니다. 공식 문서를 통해 사용하고자 하는 기능을 찾아 yml파일에 적용하도록 합니다.

https://circleci.com/docs/

circleci-project-setup 브랜치를 받으면 root에 .circleci 디렉터리가 생성되어있고 내부에 config.yml이 생성되어 있는 것을 확인할 수 있습니다.

aws credential 등록

작업 전에 circleci에 aws에 lambda를 등록하기 위한 credentials 등록 작업을 진행합니다. aws로부터 circleci를 실행할 권한을 가진 accessKey, SecretKey를 미리 발급받아 준비해 놓고 다음 내용을 진행합니다.

Organizaion Settings – Contexts – Create Context를 통해 하나의 환경을 생성합니다. 혹시 여러 국가의 서비스를 운용하고 있다면 Context를 여러 개 만들고 해당 환경의 Credential을 등록하여 상황에 맞는 Context를 선택하여 사용하는 것도 가능합니다.

생성된 context를 선택하고 개발자의 환경에 맞게 다음 3개의 환경변수를 등록합니다.

  • AWS_ACCESS_KEY_ID
  • AWS_SECRET_ACCESS_KEY
  • AWS_DEFAULT_REGION

config.yml 내용 수정

간략히 설명하면 flow는 다음과 같습니다. workflows에서 deploy context를 위에서 설정한 환경으로 세팅하면 해당 환경에 맞는 aws로 배포가 진행됩니다.

  1. docker로 node환경을 구축
  2. working_directory에 작업 브랜치를 다운로드(checkout)
  3. npm 명령으로 통해 프로젝트에 필요한 dependancies 설치
  4. serverless deploy 명령으로 aws에 배포
    1. workflow설정에 의해 dev 브랜치에 commit이 발생할경우
      $ sls deploy -s dev
    2. workflow설정에 의해 sandbox 브랜치에 commit이 발생할경우
      $ sls deploy -s sandbox
    3. workflow설정에 의해 production 브랜치에 commit이 발생할경우
      $ sls deploy -s production
version: 2.1
orbs:
  aws-cli: circleci/aws-cli@1.0.0
jobs:
  deploy:
    docker:
      - image: circleci/node:12.14.1
    working_directory: ~/lambda
    steps:
      - checkout
      - aws-cli/setup:
          profile-name: codej99
      - run:
          name: Install dependancies
          command: |
            sudo npm i -g serverless
            npm install
            npm install --save-dev serverless-offline
            npm install --save-dev serverless-prune-plugin
      - run:
          name: deploy lambda
          command: |
            echo "CIRCLE_BRANCH=> $CIRCLE_BRANCH"
            sls deploy -s $CIRCLE_BRANCH
workflows:
    version: 2.1
    build-and-deploy:
      jobs:
        - deploy:
            name: deploy-dev
            context: codej99
            filters:
              branches:
                only:
                  - dev
        - deploy:
            name: deploy-sandbox
            context: codej99
            filters:
              branches:
                only:
                  - sandbox
        - deploy:
            name: deploy-production
            context: codej99
            filters:
              branches:
                only:
                  - production

dev 브랜치에 수정한 내용을 Merge 하면 deploy-dev가 circleci에 의해 작동하면서 배포가 진행됩니다. yml에 작성한 작업이 Step by Step으로 진행되며 해당 내용은 circleci 웹 UI를 통해 확인 가능합니다.

모든 스탭이 성공적으로 수행되면 최종 Success 상태로 변경됩니다.

각 스텝별 상세내용은 해당 스텝을 펼쳐서 로그를 확인할 수 있습니다.

작업 진행 중 실패가 발생하면 Fail상태로 변경되며 Rerun을 선택하여 다시 작업을 수행하는 것도 가능합니다.

배포가 성공적으로 완료되면 aws lamdba 콘솔에 접속하여 방금 전 배포된 내역을 확인할 수 있습니다.

여기까지 실습을 통해 CircleCI를 통해 각 환경별로 자동으로 배포되는 시스템을 구축해 보았습니다. 자세한 소스 변경 사항은 아래 github를 통해 확인 가능합니다.

https://github.com/codej99/SeverlessAwsLambda

연재글 이동[이전글] aws lambda 개발하기(6) – Multi Endpoint Restful api 개발
[다음글] aws lambda 개발하기(8) – Asynchronous Tasks by SQS(Simple Queue Service)