CD/CI란
CI: Continuous Integration, 지속적인 코드 통합
CD: Continuous Delevery/Deploy, 지속적이고 자동화된 배포
CD/CI의 과정
CI는 개발 과정에 관여하는 것이고, CD는 배포 과정에 관여하는 것이다.
그 모습을 간단하게 설명하면 다음과 같다.
CI의 모습은 이렇다. 개발자가 코드의 변경사항을 PUSH하면, 바뀐 버전의 코드를 빌드해보고 문제가 있는지 테스트가 수행된다. 발견된 문제를 개발자가 고치고 나면, 다시 빌드와 테스트를 한다.
CD는 말 그대로 배포를 자동화하는 것이다. 개발자가 코드를 PUSH하면, CD/CI 툴 프로그램이 지정된 저장소에 코드 파일을, 지정된 배포 주체에게는 배포 요청을 보낸다. 이때 배포 주체가 저장소에 접근할 수 있도록 권한이 부여되어있어야 한다! 배포 주체는 지정된 머신 상에서 주어진 코드를 실행시켜 배포를 완료한다.
이를 세션에서 제공해준 이미지로 살펴보면 다음과 같다.
CD/CI 툴로는 Github, Actions를, 저장소로는 AWS S3를, 배포 담당으로는 AWS CodeDeploy를, 배포가 되는 머신으로는 AWS EC2를 사용한 모습이다.
이미지 출처 Github Actions CI + CodeDeploy로 CI/CD 구현하기 (velog.io)
CD/CI의 장점
코드에 변경사항이 있을 때마다 테스트를 거치게 되므로 코드의 품질을 높은 상태로 유지할 수 있으며, 최종 결과물 또한 CD/CI를 사용하지 않았을 때보다 높을 가능성이 크다.
배포 시마다 직접 작업할 필요가 없으므로 배포에 걸리는 시간이 단축되고 효율이 높아진다.
IAM이란
S3, CodeDeploy, EC2 등 AWS의 서비스를 사용해 CD/CI를 구현하려면 IAM을 꼭 사용해야 한다.
IAM은 AWS 리소스에 접근하기 위한 인증 기능을 제공하고, 권한이 부여된 대상을 제어해주는 웹 서비스이다.
즉 IAM 사용은, 어떤 주체가 어느 리소스에 접근해야 하는지와, 많은 권한 중 어떤 종류의 권한을 부여받아야 하는지 지정해주는 과정이다.
IAM 역할을 일단 만들어두고(권한 종류를 지정),
만들어둔 역할을 접근 주체에 추가해주는 순서로 진행된다.
예를 들면 다음과 같다.
머신인 EC2가 저장소인 S3에 접근하여 S3에 있는 파일을 사용해야 하는 상황이다.
먼저 IAM 역할을 하나 만들어야 한다. IAM 콘솔로 들어가, 아래와 같은 과정을 따라 역할을 하나 만든다.
IAM 콘솔에 들어갔다면 좌측의 메뉴 중 엑세스 관리>역할에 들어가 역할 만들기를 선택한다.
EC2가 접근할 것이고, EC2는 AWS 서비스이기 때문에, 위와 같이 선택을 해준다.
선택했다면 다음을 누른다.
그럼 위 사진과 같이 굉장히 많은 종류의 권한 리스트가 표시된다.
이 중, 우리가 EC2에게 부여할 권한만 골라서 선택하면 된다.
S3에 접근할 권한이 필요하므로, S3를 검색해보자.
S3와 관련된 권한들만 필터링되었다.
S3에 대한 full access를 부여하기 위해, AmazonS3FullAccess를 선택한다.
선택했다면 다음을 누르고, 역할의 이름과 설명 등을 자유롭게 작성한 뒤 완료하면 된다.
이제 이 역할을 부여할 EC2 인스턴스의 상세페이지로 가서, 요약 페이지 우측 상단의 '작업' 버튼을 누른 뒤, 보안>IAM 역할 수정을 선택해 역할을 부여해준다.
IAM 역할 선택창에서 드롭다운을 열어 방금 만들어준 IAM 역할을 선택한 뒤 IAM 역할 업데이트 버튼을 눌러주면 된다.
다시 인스턴스 상세 페이지로 돌아왔을 때, IAM 역할 란에 방금 지정한 역할이 표시되면 역할 부여가 잘 된 것이다.
CodeDeploy란
CodeDeploy 또한 AWS에서 제공하는 서비스이다.
프로그램을 EC2에 전송하고, EC2에 원래 실행중이었던 프로그램을 종료한 뒤, 이번에 새로 보낸 프로그램을 실행하는 과정을 자동으로 해주는 역할을 한다. EC2 외 다른 것을 사용할 수도 있다.
CodeDeploy의 설정은 조금 복잡하다. 배포 요청이 들어왔을 때 정확히 어떠한 행위를 할지 우리가 코드로 적어 제공해야 하기 때문이다. 배포에 사용할 리소스의 위치와 같이 배포에 필요한 변수도 지정해주어야 한다.
예를 들어 새 프로젝트를 시작하는 코드를 작성할 때에는 EC2 머신에서의 루트 디렉토리, 실행할 jar파일의 위치, 실행 중 사용할 log 파일의 위치 등을 지정해주어야 한다.
또한 CD/CI 툴 (예: Github Actions)와 CodeDeploy가 연동될 수 있도록 IAM 사용자도 추가해주어야 한다.
Github Actions란
CD/CI 툴에는 여러 가지가 있다. 그 중 세션에서는 Github Actions를 사용하여 실습을 진행하였다.
Github Actions는 Github에서 제공하는 도구이다. 각 깃허브 리포지토리에서 Github Actions를 관리할 수 있다. 이를 이용하면 지금까지 해왔듯 깃허브 리포지토리에 코드를 계속 업데이트하면서 CD/CI를 사용할 수 있다.
Github Actions에서 사용하는 용어를 간략하게 설명하면 다음과 같다.
Github Actions의 사용자는 workflow를 작성해야 한다. Workflow란, Github Actions가 자동으로 해내야 하는 행동 즉 프로세스 자체를 가리킨다.
이 workflow는 event에 의해 실행된다.
Github Actions Runner Appication이 설치된 서버는 runner라고 부른다.
명령어를 실행시키는 하나하나의 태스크는 step이라고 부르며, 이 step들이 모인 한 덩어리의 처리 단위는 job이라 한다.