본문 바로가기

AWS

[CI/CD] Github Action + AWS Elastic Beanstalk + ECR + IAM + Docker + ARM + Java or Kotlin + Spring Boot + Gradle 배포 (3)

해당 자료는 총 5개 파트로 나누어서 자료를 정리할 예정이다.

part 1. IAM user 권한 설정

part 2. ECR repo 세팅

part 3. EB 설정 후 샘플 코드 서버 세팅

part 4. Spring Boot 프로젝트 내부 설정

part 5. github action 세팅


Part 3. EB 설정 후 샘플 코드 서버 세팅

part 1,2를 못 보셨다면 먼저 보시길 바란다.

https://dexlee.tistory.com/170

 

1. EB(Elastic Beanstalk) 특징

  • 배포 파일(jar)만 넘겨주면 자동적으로 배포를 해줘서 관리가 매우 편리하다.
  • eb 환경설정으로 배포 파일에 대한 환경을 구분할 수 있다.
  • 하나의 애플리케이션 하위에 환경을 나누는 구조이다.

2. EB(Elastic Beanstalk) 생성 및 세팅

새 환경 생성

 

추가 옵션 구성 클릭

사용자 지정 구성 클릭

소프트웨어 > 편집

  • nginx를 추가하고 싶다면 nginx를 선택
  • 추가 안해도 된다면 없음 선택하고 진행하면 된다.

- ec2 nginx 설정 경로

/var/proxy/staging/nginx/nginx.conf 

: 해당 경로에서 nginx.conf default 파일을 확인할 수 있다.

 

- nginx를 커스텀 설정하려면 .platform 디렉터리에서 nginx를 커스텀 설정 한 후 zip 파일로 EB에 배포

  • custom nginx.conf 경로 in application - .platform/nginx/nginx.conf
user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    33282;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  include       conf.d/*.conf;

  map $http_upgrade $connection_upgrade {
      default     "upgrade";
  }

  server {
      listen        80 default_server;
      root /var/app/current/public;

      location / {
      }

      location /api {
          proxy_pass          http://127.0.0.1:5000;
          proxy_http_version  1.1;

          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
      }

      access_log    /var/log/nginx/access.log main;

      client_header_timeout 60;
      client_body_timeout   60;
      keepalive_timeout     60;
      gzip                  off;
      gzip_comp_level       4;

      # Include the Elastic Beanstalk generated locations
      include conf.d/elasticbeanstalk/01_static.conf;
      include conf.d/elasticbeanstalk/healthd.conf;
  }
}
  • 이건 aws에 있는 default 파일. 해당 파일을 내가 원하는 경로나  설정에 맞게 커스텀 설정을 해줘야한다.

- nginx 수정 파일

user                    nginx;
error_log               /var/log/nginx/error.log warn;
pid                     /var/run/nginx.pid;
worker_processes        auto;
worker_rlimit_nofile    29278;

events {
    worker_connections  1024;
}

http {
  include       /etc/nginx/mime.types;
  default_type  application/octet-stream;

  log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
                    '$status $body_bytes_sent "$http_referer" '
                    '"$http_user_agent" "$http_x_forwarded_for"';

  include       conf.d/*.conf;

  map $http_upgrade $connection_upgrade {
      default     "upgrade";
  }

  server {
      listen        80;
      gzip on;
      gzip_comp_level 4;
      gzip_types text/html text/plain text/css application/json application/x-javascript text/xml application/xml application/xml+rss text/javascript;

      send_timeout            300s;
      client_header_timeout   300s;
      client_body_timeout     300s;
      keepalive_timeout       300s;

      location / {
      }

      location /api {
          proxy_pass          http://docker;
          proxy_http_version  1.1;

          proxy_set_header    Connection          $connection_upgrade;
          proxy_set_header    Upgrade             $http_upgrade;
          proxy_set_header    Host                $host;
          proxy_set_header    X-Real-IP           $remote_addr;
          proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
          proxy_connect_timeout   300s;
          proxy_send_timeout      300s;
          proxy_read_timeout      300s;
      }

      access_log    /var/log/nginx/access.log main;

      # Include the Elastic Beanstalk generated locations
      include conf.d/elasticbeanstalk/*.conf;
  }
}
  • root 삭제 이유는 front 정적 파일 경로가 필요 없기 때문이다.
  • proxy_pass의 http://docker url은 docker 컨테이너를 바라보겠다는 의미.
  • include conf.d/elasticbeanstalk/... 의미는 해당 경로의 파일을 사용하겠다는 의미이다.

application.yml 설정 파일에서 사용할 환경 변수 세팅

 

인스턴스 > 편집

 

EC2 > 보안 그룹 > 

보안 그룹을 미리 생성 후 설정하고 EB에 적용

용량 > 편집

 

1) 인스턴스

  • 인스턴스는 서비스 활용이 정말 거의 없다면 1개만 띄우고, 적당히 있다면 2개 띄우고 최대를 여러 개 확장 할 수 있도록 알아서 설정하면 된다.
  • 최대 인스턴스 설정을 조심해야하는데.. 만약에 검증되지 않은 코드가 있다고 판단된다면 최대 인스턴스를 최소와 맞춰놓는게 안정성이 높다.
  • 하지만.. 코드가 검증이 되었다면 최대 인스턴스 설정을 회사가 감내할 수 있는 수준까지 올려도 무방하다.

2) 플릿 구성

  • On-demend instances 를 선택
  • 이유는 실서버에 spot 인스턴스를 사용하는 것은 문제가 생길 수도 있다. 꼭 on demand로 모두 사용해야한다. 
  • 왜냐하면 ELB 스팟 인스턴스를 사용했다가 해당 인스턴스를 aws에서 뺏으면 ELB 해당 인스턴스를 인식하지 못하기 때문이다.
  • 즉, spot 인스턴스는 정말 필요한 상황에 사용할 수 없는 확률도 존재하기 때문이다.
  • 다른 옵션인 구매 옵션과 인스턴스 결합(spot instance)은 해당 인스턴스가 분석이라던지 크리티컬한 환경이 아닌 경우 사용하는 것이 좋다.

5) 용량재분배 활성화(capacity rebalancing) 이란

  • 새 인스턴스를 시작할 때 Amazon EC2 Auto Scaling은 새 인스턴스 상태 확인 통과 후 이전 인스턴스를 종료한다. 이 때, 이전 인스턴스를 종료하기 전에 새 인스턴스를 실행해서 지정된 최대 용량에 도달하거나 근접하면 재분배 활동을 지연시키거나 중지할 수 있다. 이 문제를 피하기 위해 재분배 활동 중에 지정된 최대 용량을 일시적으로 초과할 수 있다.

6) 프로세서

  • arm64
  • 이유는 같은 성능인데 더 저렴하다.

7) instance types

  • 성능은 서비스 상황에 맞춰서 결정해야 한다.

1) 조정 트리거

[1] 지표

  • ALB가 작동할 지표를 선택한다.
  • CPU 사용량으로 결정.

[2] 통계

  • 평균

[3] 단위

  • 퍼센티지

[4] 기간

  • 측정치 평가 간격 기간

[5] 위반 기간

  • 상위 임계값이나 하위 임계값의 범위를 넘어서고 있는 기간.
  • 측정치 평가 간격 기간이 3분이므로 위반 기간의 최소 시간은 3분이다.
  • 해당 기간이 넘어가면 인스턴스를 새로 생성 혹은 삭제한다.

[6] 상위 임계 값

  • 해당 값 위로 올라가면 인스턴스를 증가시킴
  • 60%로 안정적인 값을 넣어줌.

[7] 확장 중분

  • 몇 개의 인스턴스를 증가시킬 것인지

[8] 하위 임계 값

  • 해당 값 아래로 내려가면 인스턴스를 감소시킴

[9] 축소 증분

  • 몇 개의 인스턴스를 감소시킬 것인지

 

 

로드 밸런서 > 편집

application load balancer(default) 선택

롤링 업데이트와 배포 > 편집

1) 배포 방식

(1) 추가 배치를 사용한 롤링 선택(무중단 배포)

  • 롤링은 그냥 롤링과 추가 배치를 사용한 롤링으로 나뉜다. 둘 다 구 버전에서 새 버전으로 점진적으로 전환되는 것은 동일하지만, 추가 배치를 사용한 롤링의 경우는 새 버전의 인스턴스를 배포한 후 바로 시작하여 배포 프로세스 중에도 모든 용량이 유지되도록 함.
  • 예를 들어, 현재 2개 인스턴스가 있다면, 이 크기를 유지하면서 추가 인스턴스를 늘려서 배포 작업 진행. 롤링 배치 크기를 1로 지정했다면, 2개 구버전 인스턴스를 유지하고, 신버전 인스턴스를 한 개 추가한다.

(2) 롤링(무중단 배포)

  • 만약에 현재 인스턴스가 2개면 현재 크기를 유지하지 않고 배포를 진행한다. 롤링 배치 크기를 1로 지정했다면, 2개 중 구버전인 한 개 인스턴스에 신버전을 배포한다. 다 끝나면, 나머지 1개 구버전도 신버전으로 업그레이드 한다.

**서비스 상황에 따라 선택해서 진행

 

2) 배치 크기

  • 고정 선택
  • 인스턴스 수를 선택 가능

3) 롤링 업데이트 유형

  • 상태 기반 롤링 선택
  • 의미는 Elastic Beanstalk 배치의 인스턴스가 상태 확인을 통과할 따까지 대기했다가 다음 배치를 시작

나머지는 운영하는 인스턴스 수에 맞게 개수를 선택

4) 상태 확인 무시

  • false로 상태 확인을 해줘야 한다.

5) 명령 제한 시간

  • 디폴트가 600인데 2400으로 늘려서 혹시라도 응답이 길어질 상황을 대비

보안 > 편집

  • IAM 인스턴스 프로파일 확인.(나중에 ecr permission으로 정책 추가해줘야 하므로)
  • EB의 IAM 인스턴스는 aws-elasticbeanstalk-ec2-role 이다.
  • aws private service에 접근을 하려면 해당 iam의 권한을 설정해서 접근 처리를 해야 한다.

환경 생성 클릭

 

3. EB(Elastic Beanstalk) IAM : ecr 접근 권한 설정

EB IAM 역할에 ecr 접근 권한을 설정하지 않으면 EB가 ecr에 접근할 수 없다.

 

 

엑세스 관리 > 역할

권한 정책 > 권한 추가

AmazonEC2ContainerRegistryReadOnly

정책 연결 클릭

  • eb iam instance profile에 해당 정책을 추가해줘야 eb instance에게 권한이 생긴다.
  • iam user는 사용자에 대한 권한이고 eb iam은 eb 서비스에 대한 권한이다.***

 

EB 생성 및 설정이 끝났다.

 

4. EB 생성 후 https 설정

1) 선행 조건

  • EB 서버에서 사용할 도메인을 만들고 SSL 인증서를 만들어야 한다.
  • Route 53과 certificate manager에서 도메인과 ssl 인증서를 알아서 만들기 바란다.
  • ssl 인증서를 만들때 메인 도메인과 하위 도메인까지 모두 인증받을 수 있도록 만들어야한다.
  • ex) *.domain.com - ssl 인증서

 

2) route 53 세팅

 

 

route 53 > 호스팅 영역 > 사용할 도메인 이름 클릭 > 세부 정보 보기 클릭

 

레코드 생성 클릭

 

1) 레코드 이름

  • 루트 도메인의 하위 도메인 정의
  • ex) dev.root.com, qa.domain.com, stage.domain.com
  • 모두 같은 ssl 인증서를 사용할 수 있도록 이렇게 하나의 도메인에 환경을 나눈다.

 

2) 레코드 유형

  • Accept the default, A – IPv4 address.(공식 문서)

 

3) 트래픽 라우팅 대상

  • 별칭 클릭
  • EB 선택
  • 도메인을 연결할 환경 선택

3) EB 세팅

 

EB 환경 > 구성 > 로드 밸런서 > 편집

리스너 추가 클릭

 

  • SSL 정책은 2016년도 정책이 default 값이고 호환성을 위해 aws가 공식적으로 추천하는 방식이다.

 

ps. 다음 시간에는 application 프로젝트 내부 설정에 대해 다루어보겠다.

 

 

references

1) EB 란

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/Welcome.html

 

2) 프록시 서버 세팅

https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/java-tomcat-proxy.html?icmpid=docs_elasticbeanstalk_console 

 

3) 배포 전략(롤링)

https://dev.classmethod.jp/articles/ci-cd-deployment-strategies-kr/

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.rolling-version-deploy.html

 

4) EB IAM : ecr 접근 권한 설정

https://stackoverflow.com/questions/44850578/aws-elastic-beanstalk-with-amazon-ecr-docker-image

 

5) route 53 with eb

https://docs.aws.amazon.com/Route53/latest/DeveloperGuide/routing-to-beanstalk-environment.html

 

6) aws ssl 인증서 정책

https://docs.aws.amazon.com/ko_kr/elasticloadbalancing/latest/application/create-https-listener.html

 

7) auto scaling 설정

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.managing.as.html

https://docs.aws.amazon.com/ko_kr/elasticbeanstalk/latest/dg/using-features.managing.as.html#environments-cfg-autoscaling-spot

 

8) instance 성능 리스트

https://aws.amazon.com/ko/ec2/instance-types/

 

9) 용량 재분배 활성화

https://docs.aws.amazon.com/ko_kr/autoscaling/ec2/userguide/ec2-auto-scaling-capacity-rebalancing.html