[레포트] AWS의 지속적 인테그레이션/딜리버리 총정리! 모던 어플리케이션 구축을 위한 CI/CD 베스트 프렉티스! #AWSSummit

AWS Summit Online Japan의 세션 중 하나인 "AWS의 지속적 인테그레이션/딜리버리 총정리! 모던 어플리케이션 구축을 위한 CI/CD 베스트 프렉티스!"에 대한 레포트입니다! AWS의 CI/CD 서비스들과 IaC 서비스들에 대해 전체적으로 알아봅니다!
2020.09.20

안녕하세요. 클래스메소드의 이병현입니다! 이번 일본의 AWS Summit은 온라인으로 진행되었는데요. 세션을 보고 정리한 내용에 대한 레포트입니다. 제목과 같이 AWS의 CI/CD에 대한 서비스들과 또한 IaC 서비스 소개 또한 포함되어있습니다.

이번 AWS Summit Online Japan은 9월 30일 까지 온디맨드로 시청가능 합니다!

본 세션의 영상은 아래의 링크에서 확인하실 수 있습니다! 본 세션은 일본어로 제공되고 있습니다.

발표자

AWS Japan 시니어 솔루션 아키텍트 福井 厚 (후쿠이 아츠시) fatsushi@

좋아하는 서비스: 서버리스 전반, AWS Code 시리즈, AWS Amplify

본 세션의 목적

  • AWS를 이용한 모던 어플리케이션 개발을 대상으로, 지속적인 통합/배포(CI/CD)에 이용 가능한 AWS의 각 서비스에 대해 이해하고 활용할 수 있도록 함
  • CI/CD 및 Infrastructure as Code 관련 AWS 서비스에 대한 해설

본 세션에서 다루지 않는 내용

  • CI/CD란 무엇인가? 프로젝트에 CI/CD 를 사용하는 메리트나 이유 (Appendix 참조)

Agenda

  • CI/CD에 관한 AWS 서비스
  • 지속적인 통합
  • 지속적인 배포
  • Infrastructure as Code
  • 정리

모던 어플리케이션 개발 접근법

  • 환경 관리를 심플하게
  • 코드 변경으로 프로덕트에 영향을 주는 것을 줄임
  • 새로운 고품질 서비스 전달(delivery) 속도를 빠르게
    • 본 세션의 내용
  • 자동화된 오퍼레이션
  • 리소스와 어플리케이션에 대한 통찰력을 높임
  • 고객과 비지니스 보호

CI/CD 관련 AWS 서비스

AWS IDE toolkits: Eclipse, VS, InteliJ, VSC 등 IDE에서 AWS를 쉽게 이용할 수 있도록 도와줌

AWS X-Ray: AWS 서비스 내에 어플리케이션의 전체적인 흐름을 추적

Amazon CodeGuru: Java 코드를 풀리퀘스트 할 때 개선점, 퍼포먼스의 버틀넥(Bottleneck)이 어디에 있는 지 AI를 통해 알려주는 서비스

AWS SAM: AWS SAM의 풀네임은 AWS Serverless Application Model로 AWS 서버리스 어플리케이션 구축 시 사용할 수 있음

지속적인 통합

목표

  1. 코드 체크인시 자동적으로 릴리즈
  2. 일관성 있고 반복 가능한 환경에서 코드의 빌드와 테스트를 실시
  3. 배포 준비된 아티팩트를 항상 유지
  4. 빌드 실패시 피드백 루프를 돌릴 수 있음

AWS CodeBuild

풀 매니지드한 빌드 서비스로 소스코드의 컴파일, 테스트 실행, 소프트웨어 패키지를 실행

  • 지속적인 스케일, 동시 복수 빌드 프로세스
  • 서버 관리가 필요없음
  • 이용한 만큼만 지불함 (분 단위 과금)
  • Amazon CloudWatch를 통한 모니터링 가능
  • 일관되고 이뮤터블(Immutable)한 환경을 위해 개개의 빌드를 신규 도커 컨테이너를 실행
  • 모든 오피셜 AWS CodeBuild 이미지에 도커와 AWS CLI가 설치되어 있음
  • 필요에 따라 도커 이미지를 작성하여 커스텀 빌드 환경 구성이 가능

AWS CodeBuild: AWS Lambda buildspec

  • 의존 모듈 취득하고 전체 테스트 실시
  • CloudFormation Package 명령어 실행

AWS CodeBuild: Docker buildspec

  • Amazon ECR에 로그인
  • 도커 이미지 작성
  • 도커 이미지 태그 추가
  • 도커 이미지를 ECR에 푸쉬

지속적인 배포

목표

  1. 변경사항을 테스트용 스테이지 환경에 자동적으로 배포
  2. 고객에게 영향을 주지 않도록 안전하게 실제 환경에 배포
  3. 보다 신속하게 고객에게 전달(delievery)

AWS CodePipeline

빠르고 신뢰성 높은 어플리케이션 업데이트를 위해 지속적인 전달(delievery) 서비스를 제공

  • 소프트웨어 릴리즈 프로세스를 모델화함으로써 시각화
  • 코드가 변경됨에 따라 코드의 빌드, 테스트, 배포를 실시
  • 서드파티 툴 및 AWS서비스와의 통합

AWS CodePipeline: 서포트하고 있는 소스

자동적으로 최신 소스코드를 습득하고 릴리즈

브렌치에서 습득

  • AWS CodeCommit
  • Github

폴더의 객체에서 습득

  • Amazon S3

도커 래포지토리에서 습득

  • Amazon ECR

AWS CodePipeline: 서포트하고 있는 타겟

여러가지의 배포 형태를 지원

Amazon EC2

  • AWS CodeDeploy
  • AWS Elastic Beanstalk
  • AWS OpsWorks stacks

컨테이너

  • AWS CodeDeploy
  • Amazon ECS/Fargate
  • Amazon ECS/Fargate(blue/green)

서버리스

  • AWS CloudFromation(SAM)
  • AWS Lambda (AWS CodeDeploy)
  • Amazon Service Catalog
  • Alexa Skills Kit

AWS CodePipeline: 서포트하고 있는 트리거

자동적인 릴리즈를 실행

Amazon CloudWatch Events

  • 스케줄 (야간 릴리즈)
  • AWS 서비스의 이벤트

CloudWatch Events 콘솔, API, SDK, CLI, AWS CloudFormation에 이용가능

Webhooks

  • GitHub
  • Quay
  • Artifactory

AWS CodePipeline API、SDK、CLI、AWS CloudFormation에 이용가능

AWS CodeDeploy

서버의 인스턴스나 AWS Lambda에 대한 자동적인 배포

  • 어플리케이션의 복잡한 업데이트 실시
  • 어플리케이션 디플리이 중 다운타임을 줄임
  • 에러 감지 시 자동적으로 롤백을 실행함
  • Amazon EC2, AWS Lambda, 온 프레미스 서버, 컨테이너로 배포

본 세션에서 소개하는 배포 타겟의 서버리스 어플리케이션의 실행환경

AWS Lambda

서버리스 펑션

  • 이벤트 작동
  • 다수의 언어 런타임
  • 데이터 소스와의 통합
  • 서버관리 불필요

AWS Fargate

서버리스 콘테이너

  • 롱 러닝 가능
  • OS 추상화
  • 풀 매니지먼트 오케스트레이션
  • 풀 매니지먼트 클러스트 스케일링

CodeDeploy Lambda 배포

  • AWS Lambda의 함수 가중치 별칭을 이용한 트래픽 시프트
  • 카나리아 배포 (10분간 10% 트래픽 시프트, 이후 나머지 전부를 시프트)와 선형(linear) 배포 (매 10분 마다 10씩 시프트) 선택 가능
  • Validation Hook은 각 스테이지 배포 시 테스트를 활성화
  • Hook이 실패하는 경우나 Amazon CloudWatch 알람을 감지한 경우 몇 초 만에 신속하게 롤백
  • 콘솔, API, Amazon SNS의 알림, CloudWatch 이벤트를 통한 배포 상태 모니터링 가능

CodeDeploy Lambda 배포 (SAM)

서버리스 어플리케이션 템플릿

  • SAM에 의한 Lambda 함수 정의
  • 카나리아 배포 정의
  • CloudWatch 알람 정의
  • Hook용 Lambda 함수 지정

CodeDeploy ECS blue/green 배포

  • Green 작업을 프로비저닝하고 로드 밸런서 트래픽을 전환
  • 검증 Hook에 따라 각 스테이지의 배포에서 테스트를 활성화
  • Hook이 실패하는 경우나 Amazon CloudWatch 알람을 감지한 경우 몇 초 만에 Blue 작업으로 신속하게 롤백
  • 콘솔, API, Amazon SNS의 알림, CloudWatch 이벤트를 통한 배포 상태 모니터링 가능

CodeDeploy ECS appspec

  • 타겟 타입 지정
  • 작업 정의
  • 로드 밸런서 정의
  • Hook 함수 정의
    • ※ 실제로는 Lambdad의 ARN을 지정

중요: 배포를 위한 컨테이너 이미지 태그 부착

  • 도커 태그는 배포할 때 뿐만 아니라 각각의 컨테이너를 사용할 때도 이용
  • latest나 prod 같은 태그는 스케일 아웃 시 테스트 하지 않은 코드를 실제 환경에 배포하는 결과를 초래할 수 있음
  • 배포에는 유니크하고 이뮤터블한 태그를 이용해야 함
    • SHA256 혹은 Build ID 등을 이용

Infrastructure as code

목표

  • 인프라 스트럭처의 변경을 반복할 수 있고, 예측 가능하게 함
  • 인프라 스트럭처를 변경하는 릴리즈 시 코드의 변경과 같은 툴을 이용
  • 실제 환경을 스테이징 환경으로 복제하여 지속적인 테스트를 활성화

AWS Serverless Application Model (SAM)

  • AWS 상의 서버리스 어플리케이션 구축하기 위한 오픈소스 프레임워크
  • 함수, API, 데이터베이스, 이벤트 소스 매핑을 표현하는 간단한 문법을 사용
  • 배포 시에 SAM의 문법을 AWS CloudFormation의 문법으로 변환되어 사용되어짐
  • 모든 AWS CloudFormation의 리소스 타입을 지원

AWS Serverless Application Model - Amazon Web Services

SAM 템플릿

SAM은 적은 줄로도 많은 리소스를 작성할 수 있음

템플릿 내 작성한 리소스

  • AWS Lambda 함수
  • Amazon API Gateway
  • Amazon DynamoDB 테이블
  • AWS IAM 역할

SAM CLI로 SAM 템플릿을 패키지로 배포

AWS CodePipeline

  • SAM 어플리케이션은 AWS CloudFormation 디플로이먼트 액션을 이용하여 배포

Jenkins

  • SAM CLI 플러그인을 이용

AWS CloudDevelopment Kit (CDK)

  • 클라우드 인프라 스트럭처를 JavaScript, TypeScript, Python, Java, C# 으로 정의하기 위한 오픈소스 프레임워크
  • 디폴트로 AWS의 베스트 프렉티스를 넣은 하이 레벨 타입 (컨스트럭트 클래스) 제공 (npm 모듈로 패키지)
  • AWS CloudFormation으로 리소스 프로비저닝
  • 모든 AWS CloudFormation의 리소스 타입을 지원

https://awslabs.github.io/aws-cdk

AWS CDK 템플릿

AWS CloudFormation의 400줄 이상의 템플릿을 TypeScript로 작성한 AWS CDK 템플릿은 22줄로도 가능할 만큼 생산성이 좋음

CDK CLI를 이용한 CDK 템플릿의 synth와 deploy

AWS CodePipeline

  • CDK 어플리케이션의 synth 실행결과를 AWS CloudFormation 디플로이먼트 액션을 이용하여 배포

Jenkins

  • AWS CDK CLI 플러그인을 이용

AWS CDK 도식화

정리

  • 모던 어플리케이션 개발의 접근에는 CI/CD가 필수
  • AWS CodeBuild, AWS CodePipeline, AWS CodeDeploy를 잘 활용
  • AWS Code 시리즈를 활용하여 힘든 작업들을 AWS에 오프로드하고 비지니스 로직 개발에 집중

Appendix

조직이 CI/CD 원칙을 적용하는 주된 이유

  • 새로운 하이퀄리티의 서비스의 딜리버리를 신속하게 하기 위해
  • 코드 변경으로 의한 프로덕트의 영향을 줄이기 위해
  • 리소스와 어플리케이션에 대한 통찰을 얻기 위해
  • 고객과 비지니스를 지키기 위해

CI/CD를 통해 하이퀄리티한 기능을 신속하게 릴리즈

CI/CD를 실천하는 팀은 보다 신뢰성이 향상되고 보다 빠르게 코드를 릴리즈 함

  • 변경 실패율 저하 5x
  • 커밋부터 배포까지 속도 440x
  • 보다 잦은 배포 46x
  • 새로운 기능이나 코드에 소비하는 시간 44%

2017 State of DevOps Report (Puppet)

자동화의 가치

  • 매뉴얼 프로세스의 절감에 따른 소프트웨어 실행기반 개선
  • 보다 짧은 개발 사이클로 더 많은 기능과 더 적은 대기 시간
  • 팀의 유동화와 채용의 용이성

릴리즈 프로세스 스테이지

소스

  • 소스코드 체크인
  • 코드의 피어리뷰

빌드

  • 코드의 컴파일
  • 유닛 테스트
  • 스타일 체커
  • 컨테이너 이미지, 함수 배포 패키지 작성

테스트

  • 주변 시스템과의 통합 테스트
  • 부하 테스트
  • UI 테스트
  • 보안 테스트

프로덕션

  • 실제환경으로의 배포
  • 에러를 신속하게 감지하기 위한 실제환경의 모니터링

지속적인 인테그레이션 (통합)

소스 - 빌드

지속적인 딜리버리 (전달)

소스 - 빌드 - 테스트 (매뉴얼) - 프로덕션

지속적인 디플로이먼트 (배포)

소스 - 빌드 - 테스트 - 프로덕션

세션을 보고나서..

AWS의 기본적인 CI/CD에 대한 서비스들에 대해 잘 설명해주는 세션같습니다. 저같은 경우는 따로따로 찾아봤었는데 이렇게 모아놓으니까 보기 편하네요.

세션의 전체적인 내용이 AWS 내의 CI/CD 관련 서비스들의 총망라라 AWS를 사용하여 처음 CI/CD 파이프라인을 구축하는 분들에게 도움이 많이될 것 같습니다.

AWS CDK 같은 경우는 정말 편해보여서 사용해보고 팁같은 것들이 생기면 더 공유해보고 싶은 마음이 들었네요. ? 이상입니다. 읽어주셔서 감사합니다!