본문 바로가기
DevOps

AWS EC2에서 docker 실행과 Nginx와 AWS loadbalancer를 이용한 loadbalancing

by 규난 2022. 10. 10.
728x90

전 포스트에서 Spring boot project를 docker image로 만들어 docker hub에 push 하는 것을 해보았다.

이번 포스트에서는 AWS EC2에서 docker image를 pull 받아 컨테이너로 Spring boot project를 띄어보겠다.

 

터미널로 ec2에 접속 후 docker pull {docker hub 계정명/docker hub repository:tag} 를 사용하여 docker hub에 올린 Spring boot image를 가져온다. 

 

가져 온 후 docker images를 치면 docker image에 대한 목록을 볼 수 있다.

그 후 docker run -d(background 실행) --name {container name} -p {ec2 port : container port} {docker image}

를 사용하여 백그라운드로 컨테이너를 실행 시킨다.

docker ps를 쳐서 현재 실행중인 프로세스를 볼 수 있다.

 

Nginx를 이용하여 loadbalacing을 하기 위한 구조 

클라이언트에서 요청이 오면 nginx를 거쳐 boot1(6) : boot2(4)의 가중치로 요청을 분산해줄 예정이다. 이렇게 로드밸런싱을 해주면 

한 서버의 몰리는 트래픽을 분산해 서버가 죽거나 요청이 느려지는 일을 방지할 수 있다. EC2나 RDS의 셋팅법은 생략하고 바로 로드밸런싱 생성부터 시작하겠다.

로드밸런서 생성

VPC : 타겟이 될 인스턴스의 VPC를 선택

Mappings : 트래픽이 전달될 인스턴스의 가용 영역을 선택

로드밸런서가 Listening할 protocol과 port를 입력 nginx의 HTTP 80 port를 거쳐올거기 때문에 HTTP 80으로 선택

Default action으로 분산 타겟을 지정하는데 target이 없다면 create target group을 클릭해 target을 만들어준다.

이미 ec2 인스턴스가 존재하기에 instance를 선택하고 로드밸런서의 요청을 전달 받을 포트를 선택한다

저 같은 경우 boot1(8080:8080), boot2(8081:8080)이기 때문에 target group을 2개(8080,8081)를 생성해주었다.

target group을 만든 후 돌아와서 로드밸런서를 생성해주면 로드밸런서가 생성된 것을 볼 수 있다.

그 후 대상그룹으로 가서 Register targets을 눌러서 대상그룹을 타겟으로 지정해준다.

대상그룹 만큼 반복을해 타겟을 지정해주면 됨

그 후 EC2에 nginx를 받은 후 cd /etc/nginx/conf.d/ 경로로 이동해 스크립트를 작성 후 nginx를 재 실행 해주면 된다.

upstream load {
        server ec2 주소:8080;
        server ec2 주소:8081;
}

server {
        listen 80;

        location /api {
                proxy_pass       http://load;
                proxy_redirect   default;
                proxy_http_version 1.1;
                proxy_set_header Host $host;
                proxy_set_header X-Real-IP $remote_addr;
                proxy_set_header    X-Forwarded-For     $proxy_add_x_forwarded_for;
        }
}

이제 포스트맨으로 실제 요청을 보면 요청이 잘가고 응답이 잘 오는걸 볼 수 있는데 실제로 로드밸런싱 모니터링을 통해 로드밸런싱이 잘 되고있는지 보자.

모니터링 결과 로드밸런싱도 잘 되고있다.

 

이번에 devOps쪽을 공부해보면서 엄청 어렵다고 느껴졌다...개인적인 욕심으로는 이번 팀 프로젝트에 CI/CD까지 해보고 싶지만

능력이 부족하기도 하고 하면서 어떤 변수가 생길지 모르기 때문에 CI/CD는 나중에 시간나면 혼자 해보는거로 해야겠다. 그래도 하고 나니까 docker와 nginx, loadbalancer에 대해서도 더 개념이 잡혀서 좋은거 같다 ㅎㅎ

728x90

'DevOps' 카테고리의 다른 글

jenkins EC2 서버와 외부 EC2 서버 연결  (0) 2022.11.06
jenkins와 Github 연동  (1) 2022.11.06
AWS EC2 linux jenkins 설치  (0) 2022.11.06
Docker  (3) 2022.10.10
Container와 VM  (0) 2022.10.10