[AWS CI/CD] 클라우드 환경에서 CI/CD 파이프라인 구성해보기
개발 스택
- GitHub
git
을 기반으로 개발자들의 협업을 위해 분산 버전 관리를 지원해주는 서비스
- AWS CodePipeline
- 소프트웨어를 빌드하고, 테스트하고, 배포하는 일련의 과정을 하나로 통합하고 소스 코드의 변경점을 감지하여 자동으로 배포하는 서비스
- AWS CodeBuild
- 소스 코드를 컴파일, 빌드하고 테스트를 실행하여 CI 서비스
- 비슷한 도구로 Jenkins, Bamboo, Travis CI 등이 있다.
- 소스 코드를 컴파일, 빌드하고 테스트를 실행하여 CI 서비스
- AWS Elastic Container Registry(ECR)
- 컨테이너 이미지를 저장하는 원격 레지스트리
- AWS Elastic Container Service(ECS)
- 컨테이너화된 애플리케이션을 손쉽게 배포, 관리할 수 있도록 지원하는 완전 관리형 컨테이너 오케스트레이션 도구
Github
https://github.com/KimGyeongLock/ktb-practice
- 빈 Repository를 생성
AWS Codepipeline
URL: AWS Codepipeline
- Pipeline 생성
Execution mode
- Superseded: 이전 실행이 최근 실행으로 대체됨
- Queued: 한 번에 하나씩 실행되며, 대기열에 등록됨
- Parallel: 대기없이 동시에 모든 파이프라인을 실행함
Service Role
-
생성하는 Codepipeline이 갖게되는 권한에 대해 정의된 IAM Role
-
어떤 곳에서 코드를 가져올 것인지 Github에 App 설치
- Repository와 Branch를 설정
Trigger Type
- No Filter: 별도의 필터 없이 HEAD의 변경점을 기준으로 시작
- Specify Filter: 다양한 조건으로 파이프라인이 시작될 수 있도록 지정 가능
- Do not detect changes: 자동으로 파이프라인 시작을 하지 않음
Event Type
- Push 혹은 PR을 기준으로 파이프라인 시작 가능
Filter Type
- 필터를 적용할 타입을 Branch와 Tag 중에서 고를 수 있음
Branches
- 파이프라인이 시작되는 Branch의 조건을 지정할 수 있음
- Build에 사용할 도구를 선택
- CodeBuild와 Jenkins를 제공
AWS CodeBuild
-
Create Project
로 신규CodeBuild
생성Provisiong Model
- On Demand: 새로운 요청이 있을 때 마다 필요한 리소스를 구성하여 빌드
- Reserved capcity: 빌드에 사용할 리소스를 사전에 정의하여 운영
Environment Image
- 빌드 환경의 이미지를 지정할 수 있다.
Compute
- 컴퓨팅 리소스를 어디에서 사용할 것인지 선택할 수 있다.
CodeBuild
에서 사용된IAM Role
생성Buildspec
설정
AWS Codepipeline
- Deploy는 초기 구성에는 설정하지 않고 Skip
에러가 나는게 정상
깃허브에서 코드가 최신화되는 것을 감지되는 것까지 끝
레포에 아무것도 없기 때문에 에러가 나는 것
실행 파일을 넣으면 자동으로 변함
진행중 이 안 바뀔수도 있는데 신경쓰지 않아도 됨 → 끝
배포하기 위해 컨테이너 만들기
컨테이너 이미지 생성 docker build . –tag test-image
컨테이너 생성 docker run -d -p 3000:3000 test-image
Amazon Elastic Container Registry
AWS CodeBuild
- buildspec.yml 수정
REGION = ap-northeast-2 변경 (서울)
노란 부분 + /repo
github push → 자동으로 빌드
- CodeBuild Project의 IAM 수정
빌드 명령 삽입 → buildspec 파일 사용
ECR 권한 설정
빌드 프로젝트 -> 코드빌드 -> 서비스 열할 이동 -> 권한 정책(권한 추가[정책 연결]) -> 검색(AmazonEC2ContainerRegistryPowerUser) 후 추가
설정 다 하였으면 변경사항 릴리스
파이프라인 목차 -> 파이프라인 -> 변경사항 릴리즈(Release change) 하면 된다고 하십니다
막고 있는 이 친구는 실행 중지 해주기
빌드 성공 확인
ECR 가서 image 잘 생성 되었는지 확인
깃허브에서 수정이되면 CI가 됨
AWS Elastic Container Service(ECS)
ECS 구성해서 자동으로 배포되도록 함
Infrastructure
- 컨테이너를 구성할 인프라 풀을 지정한다.
- AWS Fargate
- Amazon EC2 instances
서비스 생성
Compute options
- 인프라 풀을 구성할 전략을 지정한다.
- Capacity Provider Strategy
- Launch Type
테스크 정의
현재는 init 페이지 밖에 없어서 최소 사이즈로 진행
본인 프로젝트시 사양에 맞춰서 진행
Container
Container Detail
- Name: buildspec.yml에서 post_build에서 입력한 name과 같게 설정(레포 이름으로 설정되어 있음)
- Image URI: ECR URI를 입력
Port Mapping
- 현재 애플리케이션이 3000으로 실행되므로 3000으로 설정
다시 돌아와서
Application Type
- 컨테이너를 띄울 애플리케이션 종류를 지정
- Service: 웹 애플리케이션과 같이 오랜 시간 컴퓨팅을 쓰는 종류의
애플리케이션
- Task: 일회성으로 실행되는 애플리케이션
Task Definition
- 서비스 내에서 실행될 컨테이너 스펙을 정의함
- 첫 생성 시에는 정의된 Task Definition이 없으므로, go to Task Definition을 통해 생성
Load balancing 설정
- 서비스를 외부에 노출시키기 위해 로드밸런서 생성
- 기본 Security Group으로는 외부에서의 접근이 허용되지 않기 때문에, 추가가 필요하다.
- 현재 만든 웹서비스의 경우 별도 인증서는 없으므로 HTTP(80)만 오픈
인바운드 규칙 편집
누락 부분
AWS Codepipeline
- Codepipeline 생성 단계에서 Skip했던 Depoly Stage 추가
pipeline → 편집 → 맨밑 스테이지 추가 → Deploy 추가
Deploy 에러
- 첫번째 문제
post_build 에서 “name”: “repo”
로 설정한다.
repo
는 ECR에서 만든 repository의 이름과 동일
- 두번째 문제
테스크 정의 → 새 개정 생성
이름 ktb-container
가 아니라 repo
ECR repository랑 동일시
클러스터에서 새 서비스 생성
ktb-definition의 개정을 최신 것으로 넣어준다.
다시 pipeline → deploy 수정 → 편집 → deploy 스테이지 편집 → 서비스를 새 것으로 변경해준다.
다시 변경 사항 릴리스를 하고 새로 생긴 서비스 → 구성 및 네트워킹 → DNS 이름을 확인
http://ktb-alb2-1224584052.ap-northeast-2.elb.amazonaws.com/
Deploy까지 잘 수행되면 CI/CD 파이프라인 구성 완료