해당 자료는 총 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) 프록시 서버 세팅
3) 배포 전략(롤링)
https://dev.classmethod.jp/articles/ci-cd-deployment-strategies-kr/
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
8) instance 성능 리스트
https://aws.amazon.com/ko/ec2/instance-types/
9) 용량 재분배 활성화