CodeDeploy? Amazon EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 Amazon ECS 서비스에 대한 애플리케이션 배포를 자동화하는 배포 서비스
장점 자동화된 배포 및 동시 배포 가동중지 시간을 최소화 롤백 가능 중앙 집중식 제어
CodeDeploy 배포 유형 개요
내부배포
애플리케이션이 중지되고 최신 애플리케이션 Revision이 설치되며 애플리케이션의 새 Version이 시작되고 검증
블루/그린 배포

- 배포 그룹(Origin)의 인스턴스는 다른 인스턴스 집합(New)으로 대체하며 배포하는 과정
- 대체 환경을 위해 인스턴스가 프로비저닝
- 최신 애플리케이션 Revision이 교체 인스턴스에 설치
- 응용 프로그램 테스트 및 시스템 확인과 같은 활동을 위해 선택적 대기 시간이 발생
- 대체 환경의 인스턴스는 ELB에 등록되어 트래픽이 해당 인스턴스로 다시 라우팅됩니다. 원래 환경의 인스턴스는 등록이 취소되고 종료되거나 다른 용도로 계속 실행
CodeDeploy 기본 구성 요소
Appication
- 고유 식별 Deploy 이름
Computing Platform
- EC2/On-premise
- AWS Lambda
- AWS ECS
Deploy 구성
- Canary
- Linear (선형)
- All-at-once (한꺼번에)
IAM Instance Profile
- 배포를 진행하려는 위치 즉, 리소스 위치의 접근을 하기 위해 필요한 권한을 부여 해야한다.
Revision
- Application 의 Version
CodeDeploy 배포 명세서 파일 AppSpec.yml
CodeDeploy 서비스는 AppSpec.yml
파일 내용에 따라 배포가 이루어 지며 세부 명령을 진행이 가능
version: 0.0 #2023년 기준 절대 변경 금지
os: operating-system-name
# File Block은 EC2/온프레미스 배포할 때 사용
files:
- source: [source-file-location] # 해당 인스턴스 위치로 파일을 복사할때 사용
destination: [destination-file-location] #Linux (/) , windows (\) 사용
# Resources Block
# Lambda 배포할 때 사용
resources:
- name-of-function-to-deploy:
type: "AWS::Lambda::Function"
properties:
name: name-of-lambda-function-to-deploy #Lambda 함수 이름
alias: alias-of-lambda-function-to-deploy #Lambda 함수 별칭
currentversion: #Lambda 함수 트래픽 버전
targetversion: #Lambda 함수 트래픽이 이동되는 버전
# ECS 배포할 때 사용
Resources:
- TargetService:
Type: AWS::ECS::Service
Properties:
TaskDefinition: "task-definition-ARN" #ARN으로 작업 정의
LoadBalancerInfo:
ContainerName: "ECS-container-name-for-your-ECS-application" #컨테이너 이름
ContainerPort: port-used-by-your-ECS-application #컨테이너 포트 설정
# Optional properties
PlatformVersion: "ecs-service-platform-version"
NetworkConfiguration:
AwsvpcConfiguration:
Subnets: ["ecs-subnet-1","ecs-subnet-n"]
SecurityGroups: ["ecs-security-group-1","ecs-security-group-n"]
AssignPublicIp: "ENABLED-or-DISABLED"
CapacityProviderStrategy:
- Base: Integer
CapacityProvider: "capacityProviderA"
Weight: Integer
- Base: Integer
CapacityProvider: "capacityProviderB"
Weight: Integer
# EC2/온프레미스 배포할때 사용하며 Unix/Linux 계열에서 사용
# 파일 및 디렉터리가 인스턴스에 복사된 후 적용되는 특수권한을 부여해야하는 경우 사용
permissions:
- object: /tmp/my-app #파일 및 디렉터리 지정
pattern: "*-3.txt" #정규표현식으로 파일 패턴 지정
except: [tmp/my-app/my-folder-2/my-folder-3] # 제외할 파일 및 디렉터리
owner: adm # 파일 소유자 지정
group: wheel # 파일 그룹소유자 지정
mode: 464 # mask 값 지정
acls:
- u:mary:rw # 하나 이상의 권한 부여를 할때 사용
- u:sam:rw
- m::rw
context: # (선택)SELinux(Security-Enhanced Linux)
user: unconfined_u # 지원 인스턴스의 경우 복사된 객체에 적용할
type: httpd_sys_content_t # 보안 관련 컨텍스트 레이블 목록
range: s0
type:
- file
hooks:
# ECS
- BeforeInstall: "BeforeInstallHookFunctionName"
- AfterInstall: "AfterInstallHookFunctionName"
- AfterAllowTestTraffic: "AfterAllowTestTrafficHookFunctionName"
- BeforeAllowTraffic: "BeforeAllowTrafficHookFunctionName"
- AfterAllowTraffic: "AfterAllowTrafficHookFunctionName"
# Lambda
- BeforeAllowTraffic: BeforeAllowTrafficHookFunctionName
- AfterAllowTraffic: AfterAllowTrafficHookFunctionName
# EC2/On-premiss
deployment-lifecycle-event-name: # Event 이름 지정
- location: script-location # 저장소 내의 script 위치
timeout: timeout-in-seconds # Script timeout 지정
runas: user-name # 해당 script를 실행할 EC2,On-premiss 계정
Lambda hooks process

EC2/On-premiss hooks process

ECS Hooks Process

CodeDeploy Agent 작업
인스턴스에 설치 및 구성될 때 해당 인스턴스를 CodeDeploy 배포에서 사용할 수 있게 해주는 소프트웨어 패키지 CodeDeploy 에이전트는 포트 443을 통해 HTTPS를 사용하여 아웃바운드 통신 SSM(System Manager Agent) 를 이용해서 설치하거나 AWS에서 제공하는 버킷에서 wget을 통해 다운받아 설치할 수 있다.