[AWS] Code Pipeline를 통한 배포 자동화: Elastic Beanstalk

Code Pipeline은 배포 자동화를 위한 AWS의 서비스다.
정확히는 Code Commit, Code Build, Code Deploy, Code Pipeline이라는 세부 서비스들로 구성이 된다.

하나씩 짚어보면서 ElasticBeanstalk에 자동배포 환경을 구축해보도록 하겠다.
다른 환경을 사용하더라도 크게 달라지는 것은 없을 것이다.




사전준비

배포할 환경으로 elastic beanstalk 리소스를 만들어놓고

저기다 배포할 서버 소스를 준비해주자.




Code Commit (선택)

Code Commit은 AWS 전용 git 레포지토리 서비스다.
그냥 github를 aws 내에서 만들어둔거라고 보면 된다.

요금은 다음과 같다.
5명까지는 거의 무료고, 과금이 되더라도 매달 1달러가 다다.
아마존 치고는 저렴한 편이다.

github나 gitlab 등의 기존 git 호스팅을 사용할거라면, 이건 무시하고 건너뛰어도 된다.

생성법은 어려울 것이 없다.
그냥 생성 누르고 이름 짓고, 만들면 된다.

그럼 git으로 제어할 수 있다.




Code Build

Code build는 말 그대로 빌드를 하는 것이다. 컴파일 등의 작업을 여기서 하면 된다.

요금 산정 방식은, 빌드 돌린 시간을 기준으로 분당으로 뜯어가는 것이다.

빌드 프로젝트는 다음과 같이 만들 수 있다.

이름과 설명을 잘 지어주고

소스 공급자를 선택한다.
나는 github으로 해놨다.

그리고 빌드에 사용할 환경을 지정할 수 있다.
관리형 이미지로는 아마존 리눅스와 우분투만 지원이 되고, 다른걸 쓰고싶다면 사용자 지정 이미지로 해서 이미지를 직접 설정해주면 된다.

그리고 buildspec이란 곳이 바로 빌드를 어떻게 할지를 정의하는 영역이다.
"빌드 명령 삽입"으로도 가능하긴 한데, 단순해서 좋긴 하지만 이걸로 복잡한 프로세스를 제어할 수는 없다.

아래는 buildspec의 기본 틀이다.

version: 0.2

run-as: Linux-user-name

env:
  shell: shell-tag
  variables:
    key: "value"
    key: "value"
  parameter-store:
    key: "value"
    key: "value"
  exported-variables:
    - variable
    - variable
  secrets-manager:
    key: secret-id:json-key:version-stage:version-id
  git-credential-helper: no | yes

proxy:
  upload-artifacts: no | yes
  logs: no | yes

batch:
  fast-fail: false | true
  # build-list:
  # build-matrix:
  # build-graph:

phases:
  install:
    run-as: Linux-user-name
    on-failure: ABORT | CONTINUE
    runtime-versions:
      runtime: version
      runtime: version
    commands:
      - command
      - command
    finally:
      - command
      - command
  pre_build:
    run-as: Linux-user-name
    on-failure: ABORT | CONTINUE
    commands:
      - command
      - command
    finally:
      - command
      - command
  build:
    run-as: Linux-user-name
    on-failure: ABORT | CONTINUE
    commands:
      - command
      - command
    finally:
      - command
      - command
  post_build:
    run-as: Linux-user-name
    on-failure: ABORT | CONTINUE
    commands:
      - command
      - command
    finally:
      - command
      - command
reports:
  report-group-name-or-arn:
    files:
      - location
      - location
    base-directory: location
    discard-paths: no | yes
    file-format: report-format
artifacts:
  files:
    - location
    - location
  name: artifact-name
  discard-paths: no | yes
  base-directory: location
  exclude-paths: excluded paths
  enable-symlinks: no | yes
  s3-prefix: prefix
  secondary-artifacts:
    artifactIdentifier:
      files:
        - location
        - location
      name: secondary-artifact-name
      discard-paths: no | yes
      base-directory: location
    artifactIdentifier:
      files:
        - location
        - location
      discard-paths: no | yes
      base-directory: location
cache:
  paths:
    - path
    - path

저걸 다 써야 할 필요는 없다.

저기서

env의 variables 속성은 말 그대로 환경변수를 넣는 부분이다. 필요한 만큼 넣어주면 된다.

phases. 이 부분이 가장 중요한 부분이다.
실제로 실행할 명령들을 집어넣을 수 있다.

install, pre_build들은 각 실행 그룹이고, 그 안에서 commands가 실제로 실행할 명령어 목록.
on-failure는 실패했을때 넘길지 중단시킬지를 결정한다.
그리고 finally는 빠져나가기 전에 어떤 동작을 할지를 정의한다.

그리고 아티팩트.

이 부분은 어디부터 어디까지를 배포용 파일로 올릴지를 정의한다.

나는 필요한게 많지는 않아서 이정도만 있어도 됐다.

이외에 더 필요한게 있다면 아래 문서를 참조하길 바란다.
https://ap-northeast-2.console.aws.amazon.com/codesuite/codebuild/project/new?region=ap-northeast-2

그리고 그냥 생성하면 된다.




Code Deploy

Code Deploy는 말 그대로 배포에 대한 것을 제어할 수 있게 해주는 서비스다.
이건 다행스럽게도 요금이 따로 없다. 무료다.

지원폭이 넓지는 않아서 람다 배포를 설정하거나 ECS 배포를 커스텀할때 빼고는 아마 쓸일이 많지는 않을 것이다.

Elastic Beanstalk에 배포할 때는 필요하지 않기 때문에 본 포스트에서는 상세하게 다루지는 않는다.

CodeDeploy에서 앱 생성으로 들어가면, 다음과 같이 이름을 짓고 플랫폼을 선택할 수 있다.

그럼 텅 빈 CodeDeploy 프로젝트가 생성되는데

여기다 "배포 그룹"으로 배포에 대한 설정을 만들어주고,

저걸로 배포를 돌리는 식이다.

이건 람다 배포를 다룰때 따로 상세히 살펴보겠다.




Code Pipeline (with Elastic Beanstalk)

코드 파이프라인은 위의 서비스들을 포함해서 전체적인 배포 프로세스를 통합 제어하게 해주는 서비스다.

요금 산정 방식은 활성화된 파이프라인 하나당 매달 1달러를 갈취해가는 형식이다.

1개까지는 무료로 제공된다.

이걸로 github에 새 소스가 push될때마다 beanstalk에 자동으로 배포가 되도록 설정해보자.

이름을 잘 지어주고

소스를 어디서 긁어올지를 선택한다.

나는 깃허브와 연동되도록 했다.

이러면

main 브랜치에 push될때마다 자동으로 파이프라인이 시작될 것이다.

그다음에는 빌드 설정이다.
CodeBuild 프로젝트를 미리 만들기보다는 여기서 프로젝트 생성으로 만들어서 추가하는게 나을 것이다.
내용은 동일하다.

그다음에는 배포 설정이다.

여기서는 그냥 Elastic Beanstalk로 선택해도 무방하다.


그럼 설정은 다 된 것이다.

파이프라인을 처음 만들면, 파이프라인 배포가 자동으로 트리거될 것이다.

그럼 아마 다음과 같은 오류가 발생하는 것을 볼 확률이 높다.

무슨무슨 권한이 없다는건데, 자동으로 생성된 역할 codestar에 대한 권한이 없어서 생기는 오류다.

IAM 페이지로 들어가서 역할 탭에서 저 역할을 찾고, 권한 수정으로 codestar에 대한 권한을 다 줘버리자.

그럼 이제 거의 될 것이다.




완성

다시 배포를 시도하려면 저기 릴리스 버튼을 누르거나, 소스를 수정하면 된다.

그렇게 해서, 이렇게 다 성공하면 잘 된 것이다.

따단.



참조
https://docs.aws.amazon.com/codebuild/latest/userguide/sample-elastic-beanstalk.html
https://docs.aws.amazon.com/ko_kr/codebuild/latest/userguide/build-spec-ref.html