배포 자동화
1. 개념
- 한 번의 클릭 혹은 명령어 입력을 통해 전체 배포 과정을 자동으로 진행하는 것
- 수동적이고 반복적인 배포 과정을 자동화함으로써 시간 절약 가능
*복잡하고 취약한 수동 배포과정을 자동화하면, 복잡하고 취약한 자동 프로세스가 생성되므로 배포 자동화를 위한 아키텍처를 재설계하는 과정이 필요
- 새 버전 출시를 기다리지 않고도 오류를 즉시 수정 가능
- 휴먼 에러(Human Error)를 방지
휴먼 에러
: 특정 과정을 생략하거나 다르게 진행하여 오류가 발생하는 등 사람이 수동적으로 배포 과정을 진행하는 중에 생기는 실수를 의미
: 배포 자동화를 통해 전체 배포 과정을 매번 일관되게 진행하는 구조를 설계하여 휴먼 에러 발생 가능성을 낮출 수 있음
2. 배포 자동화 파이프라인
- 파이프라인(Pipeline) : 소스 코드의 관리부터 실제 서비스로의 배포 과정을 연결하는 구조
- 전체 배포 과정을 여러 단계(Stages)로 분리하며, 각 단계는 파이프라인 안에서 순차적으로 실행되고 단계마다 주어진 작업(Actions)을 수행
*파이프라인의 단계는 상황과 필요에 따라 더 세분화되거나 간소화될 수 있음
파이프라인의 세 가지 단계
- Source 단계
: 원격 저장소에 관리되고 있는 소스 코드에 변경 사항이 일어날 경우, 이를 감지하고 다음 단계로 전달하는 작업을 수행
- Build 단계
: Source 단계에서 전달받은 코드를 컴파일, 빌드, 테스트하여 가공
: Build 단계를 거쳐 생성된 결과물을 다음 단계로 전달하는 작업을 수행
- Deploy 단계
:Build 단계로부터 전달받은 결과물을 실제 서비스에 반영하는 작업을 수행
AWS 배포 자동화
1. AWS 서비스
1) CodeCommit
- Source 단계를 구성할 때 CodeCommit 서비스를 이용
- CodeCommit은 GitHub과 유사한 서비스를 제공하는 버전 관리 도구
- 보안과 관련된 기능에 강점을 갖지만, 과금 가능성을 고려해야 함
2) CodeBuild
- Build 단계에서는 CodeBuild 서비스를 이용
- CodeBuild 서비스를 통해 유닛 테스트, 컴파일, 빌드와 같은 빌드 단계에서 필수적으로 실행되어야 할 작업을 명령어를 통해 실행할 수 있음
- 자체 빌드 서버 없이 사용할 수 있고, 사용자를 지정하여 고유의 빌드 도구로 사용할 수 있음
- 아티팩트까지 생성해주는 완전 관리형 서비스
3) CodeDeploy
- CodeDeploy 서비스를 이용하면 실행되고 있는 서버 애플리케이션에 실시간으로 변경 사항을 전달할 수 있음
CodeDeploy-Agent
- 인스턴스를 CodeDeploy 배포에서 사용할 수 있게 해주는 소프트웨어 패키지
- 소스코드의 appspec.yml 파일을 참조하여 배포를 실행
/opt/codedeploy-agent/deployment-root
경로에 인스턴스의 관련 개정, 배포 기록 및 배포 스크립트가 저장됨
- EC2/온프레미스 컴퓨팅 플랫폼을 통해 배포하는 경우에만 필요
4) CodePipeline
- 각 단계를 연결하는 파이프라인을 구축할 때 CodePipeline 서비스를 이용
- AWS 프리티어 계정 사용 시 한 계정에 두 개 이상의 파이프라인을 생성하면 추가 요금이 부여될 수 있음
2. AWS CodePipeline
- 작업(Actions) : 단계 구성에서 정의한 대로 지정된 순서나 연속 또는 병렬로 발생하는, 해당 단계의 아티팩트에서 수행된 작업
- 단계(Stages) : 환경을 격리하고 해당 환경에서 동시 변경 작업의 수를 제한하는 데 사용할 수 있는 논리 단위
- 전환(Transitions) : 파이프라인의 다음 단계로 이동하는 지점으로 단계의 전환 비활성과 활성을 활용하여 각 단계를 진행
- 아티팩트(Artifacts) : 파이프라인 작업을 통해 만들어진 데이터 컬렉션으로, 일부 작업에서 생성되고 다른 작업에서 사용
각 Pipeline 단계 연결과 서비스
- Source Stage - AWS CodeCommit
: git 기반 리포지토리를 호스팅하는 소스 제어 서비스
- Source Stage - GitHub
: 분산 버전 관리 툴인 git 저장소 호스팅을 지원하는 웹 서비스
- Deploy Stage - AWS CodeDeploy
: 다양한 컴퓨팅 서비스에 대한 소프트웨어 배포를 자동화하는 배포 서비스
- Build Stage - AWS CodeBuild
: 소스 코드 컴파일, 테스트 실행, 배포 단계까지 마칠 수 있는 지속적 통합 서비스
3. AWS IAM
- Identity and Access Management의 약자로 AWS 리소스에 대한 액세스를 안전하게 제어할 수 있는 웹 서비스
- IAM을 사용하여 리소스를 사용하도록 인증(로그인) 및 권한 부여(권한 있음)된 대상을 제어
IAM 서비스 이용
- 루트 사용자 계정을 사용하지 않고, 일상 및 관리 작업에는 권한이 있는 IAM User 계정을 사용
- 실제 사용자 한 명을 위해 여러 user를 생성하기보다 하나의 user 계정을 정확하게 설정
- 자격 증명을 공유하지 않음
- 보안을 위해 MFA를 활성화
*MFA(Multi-Factor Authentication) : 사용자 이름 및 암호 위에 추가 보호 계층을 추가하는 서비스
1) IAM Role
- 각 엔터티(사용자, 서비스 등)에 AWS 서비스에 대한 권한 집합을 정의하는 IAM 자격 증명
- Role은 한 사람과만 연관되지 않고 해당 역할이 필요한 사람이라면 누구든지 맡을 수 있음
- 외부 자격 증명 공급자 서비스에 의해 인증된 외부 사용자가 사용할 수 있음
- IAM Role을 부여할 수 있는 신뢰할 수 있는 객체 : AWS 서비스, AWS 유저(account), Web identity
2) IAM Policy
- AWS 엔터티 또는 서비스에 연결될 때 해당 권한을 정의하는 AWS 객체
- IAM User, User Group, Role의 권한을 정의하는 JSON 문서
3) IAM User
- AWS와 상호 작용하기 위해 그 엔터티를 사용하는 사람 또는 애플리케이션
- 한 사람과 연관 되며, 암호 또는 액세스 키가 부여
- 여러 그룹에 속할 수 있으며, 그룹에 속하지 않아도 됨
- 자신에게 할당된 정책을 가질 수 있음
4. AWS Parameter Store
- 환경 변수를 보안적으로 전달하는 방법
- 환경 변수는 절대 노출되지 않아야 할 값이기 때문에 소스 코드에 포함하거나, 컴퓨팅 서비스에 직접 주입하는 것은 보안적으로 위험
References
1. IAM