[AWS] CodeDeploy

CodeDeploy? Amazon EC2 인스턴스, 온프레미스 인스턴스, 서버리스 Lambda 함수 또는 Amazon ECS 서비스에 대한 애플리케이션 배포를 자동화하는 배포 서비스

장점 자동화된 배포 및 동시 배포 가동중지 시간을 최소화 롤백 가능 중앙 집중식 제어

CodeDeploy 배포 유형 개요

내부배포

애플리케이션이 중지되고 최신 애플리케이션 Revision이 설치되며 애플리케이션의 새 Version이 시작되고 검증

블루/그린 배포

  • 배포 그룹(Origin)의 인스턴스는 다른 인스턴스 집합(New)으로 대체하며 배포하는 과정
  1. 대체 환경을 위해 인스턴스가 프로비저닝
  2. 최신 애플리케이션 Revision이 교체 인스턴스에 설치
  3. 응용 프로그램 테스트 및 시스템 확인과 같은 활동을 위해 선택적 대기 시간이 발생
  4. 대체 환경의 인스턴스는 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을 통해 다운받아 설치할 수 있다.

Leave a Comment