aws 배포 5단계: 무중단배포

wisdom·2022년 9월 17일
2

백엔드 개발자라면?

목록 보기
30/42

  • 엘라스틱빈스톡 + Gihub Action(자동 배포 도구) + NLB(고정IP설정)
    - EC2 서버 2개
    - 로드밸런서
    - 무중단배포
순서

1. Security group 생성
2. Security group inbound 설정 
3. RDS 생성(외부접속을 위해 public access yes 설정, 보안 그룹 설정, 타임존 설정을 위한 파라미터 그룹 생성)
4. 엘라스틱빈스톡 생성
5. Github actions 
6. ec2 -> load balancer -> nlb 

CI

  • 지속적 통합
  • 도구
    - travis, jenkins, github actions
  • Polling 기법 혹은 Webhooks 방법으로 동작한다.
    - Webhooks: 이벤트 전달
    - Polling: request 요청(10초에 한 번씩)

IAM

  • Identity Access Manager

사용자, 정책, 그룹, 역할 이해 필요함

  • 사용자: 직원
  • 정책: 권한의 모임
  • 그룹: 직원의 모임
  • 역할: aws ec2, s3버킷과 같은 서비스에 할당하는 임시 권한의 모임

aws security group 생성

security group Inbound rules

  • 포트: 80, 22, 3306(내 ip/같은 시큐리티그룹이면 다 들어올 수 있게 허용)

RDS 타임존 설정

  • 파라미터 그룹 생성
    - 디폴트 그룹은 파라미터 편집이 되지 않아 타임존 설정을 할 수 없기 때문에 새로운 파라미터를 생성함
  • time_zone value 를 'Asia/Seoul' 로 설정해준다.
  • RDS -> Database 재부팅 해줘야 적용됨

엘라스틱빈스톡 생성

추가 구성 설정

  • Custom configuration
  • modifiy software
    - RDS_HOSTNAME
    - RDS_PORT
    - RDS_DB_NAME
    - RDS_USERNAME
    - RDS_PASSWORD

환경변수

  • application 에 전달되는 값
  • modify capacity
    - 로드밸런싱 수행
    - 인스턴스 최소 2대, 최대 4대

  • modify load balancer
    - application load balancer
    - 리스너: 80포트
    - 프로토콜 HTTP 80으로 들어오면 ALB가 읽어들인다.
    - 프로세스
    - 어떠한 프로그램의 메모리에 뜬 걸 프로세스라고 한다. (실행 중! )
    - 상태검사 경로"/"

서비스 배포 전략

  • Rolling
  • Canary
  • BluegGreen

블루 그린

"두 버전을 모두 올리고, 유저의 요청을 라우터단에서 중계하여, 서서히 새 버전으로 요청을 이동시킨다"

  • 무중단 배포 기법의 하나
  • 구, 신버전이 동시에 떠 있는 시간을 매우 짧게 처리할 수 있다.
  • 롤백을 굉장히 빨리 할 수 있다. 테스트 환경에서는 문제점이 발견이 안됐는데 운영 서버에 배포를 하니 문제가 발생되면 재빨리 기존 것으로 롤백할 수 있다.
  • 실제 운영에 필요한 서버 리소스 대비 2배의 리소스를 확보해야한다는 단점

블루/그린 배포 방식은 어떻게 동작할까?


현재 blue group 안에 두 대의 서버로 요청을 나눠서 처리하고 있다고 가정한다. 즉, blue group v1.0.1 버전을 서비스 하다가 아래의 greep group v1.0.2 코드로 배포를 하려고 한다.


그래서 먼저 Blue Group에 존재하는 인스턴스 수와 동일하게 Green Group에 만드는 과정이 일어난다. 그리고 Green 그룹에 v1.0.2 버전을 배포한다. 이렇게 블루/그린 배포는 두 개의 그룹을 가지고 진행된다.


그리고 Blue/Green 모두 로드밸런서에 연결해서 잠시 동안 두개의 그룹 모두 트래픽을 처리하도록 연결해놓는다.


그리고 Blue Group에 존재하는 모든 인스턴스를 종료한 후에 로드밸런서에 Blue Group을 제외하고 Green Group에서 모든 요청을 처리하도록 한다.

Github Action

  • CI/CD 도구
  • 필요한 파일: Deploy.yaml
name: your-news  

# main branch 에 push 되면 해당 스크립트가 동작한다.  
on:  
  push:  
    branches: [ "main" ]  
  
permissions:  
  contents: read  
  
jobs:  
  build:  
  # 우분투 설치
    runs-on: ubuntu-latest  
  
    steps:  # actions -> 라이브러리 형태로 스크립트를 제공해줌
      - uses: actions/checkout@v3  # checkout: 코드 다운로드
      - name: Set up JDK 17  # name 은 생략 가능
        uses: actions/setup-java@v3  # JDK 설치
        with:  
          java-version: '17'  
          distribution: 'temurin'  
  
      - name: Grant execute permission for gradlew  
        run: chmod +x ./gradlew  # gradle에 실행 권한을 준다. bash로 실행함
        shell: bash  
  
      - name: Build with Gradle  
        run: ./gradlew clean build -x test  # test 제외 build 를 하는데 bash로 실행함
        shell: bash  


# UTC가 기준이기 때문에 한국시간으로 맞추려면 +9시간 해야 한다.
      - name: Get current time  
        uses: 1466587594/get-current-time@v2  
        id: current-time  
        with:  
          format: YYYY-MM-DDTHH-mm-ss  
          utcOffset: "+09:00"  
      - name: Show Current Time  
        run: echo "CurrentTime=${{steps.current-time.outputs.formattedTime}}"  
        shell: bash  

# EB에 CD 하기 위해 추가 작성
      - name: Generate deployment package  
        run: |  
          mkdir -p deploy          
          cp build/libs/*.jar deploy/application.jar          
          cp Procfile deploy/Procfile          
          cp -r .ebextensions deploy/.ebextensions          
          cd deploy && zip -r deploy.zip .     
      
	  - name: Deploy to EB  
        uses: einaregilsson/beanstalk-deploy@v20  
        with:  
          aws_access_key: ${{ secrets.AWS_ACCESS_KEY }}  # your-news/service-repo 에 등록한 시크릿값을 이용함 (administratorAccess-AWSElasticBeanstalk 정책 권한을 가지는 IAM 유저)
          aws_secret_key: ${{ secrets.AWS_SECRET_KEY }}  
          application_name: your-news-beanstalk  # 엘라스틱빈스톡 이름
          environment_name: Yournewsbeanstalk-env  # 엘라스틱빈스톡 환경 이름
          version_label: your-news-${{steps.current-time.outputs.formattedTime}}  
          region: ap-northeast-2  
          deployment_package: deploy/deploy.zip # s3 deploy 폴더에 있는 deploy.zip 파일을 elastic beanstalk 에 전달함

Load Balancer

  • 하나의 인터넷 서비스가 발생하는 트래픽이 많을 때 여러 대의 서버가 분산 처리하여 서버의 로드율 증가, 부하량, 속도 저하 등을 고려하여 적절히 분산 처리하여 해결해주는 서비스

    위의 그림처럼 사용자가 많아져 트래픽이 하나의 서버로 몰리지 않도록 적절하게 분배시켜주는 역할

NLB

  • L4 계층, 네트워크 계층에서 동작하는 로드밸런서
  • TCP/IP 프로토콜의 헤더를 보고 적절한 패킷으로 전송한다.
  • IP+포트번호를 보고 스위칭한다.
  • NLB는 할당한 elstic ip를 static ip로 사용이 가능하여 dna name과 ip주소 모두 사용이 가능하다.

ALB

  • L7 계층, 즉 애플리케이션에서 동작하는 로드밸런서
  • path-based 라우팅 지원
  • HTTP/HTTPS 프로코톨의 헤더를 보고 적절한 패킷으로 전송한다.
  • IP주소 + 포트번호 + 패킷내용을 보고 스위칭한다.
  • IP 주소가 변동되기 때문에 클라이언트에서 접근할 ELB의 Dns Name을 이용해야 한다.

NLB와 ALB의 속도차이

  • nlb의 장점 중 하나는 클라이언트의 요청에 대해서 낮은 대기 시간으로 높은 처리가 가능하다는 것
  • nlb는 네트워크 계층까지만 확인하기 때문에 7계층인 alb보다 빠르다.
  • 또한 기존 elb 사용 시, 짧은 시간 내 스파크 성 트래픽 발생에 대한 대응이 어려웠으나 nlb 를 사용함으로 elb의 단점을 해소할 수 있다.
  • 마지막으로 단순 라우팅이 필요하고, 트래픽이 극도로 많은 경우에는 alb보다 nlb를 사용하는 것이 적합하다고 할 수 있다.

EC2 -> 로드밸런서 -> Network Load Balancer 생성

  • Elastic IP 설정
  • Listeners and routing에서 타겟그룹 alb 생성 후 alb를 지정해준다.
profile
문제를 정의하고, 문제를 해결하는

0개의 댓글