이번 글에서는 AWS에서 제공하는 Auto scaling 기능을 직접 구현해보는 시간을 갖도록 하겠다.
실습용 EC2를 생성해서 진행할 것인데 AWS에 대해서 어느 정도 이해하고 있어야 이 글을 이해할 수 있으므로 VPC, 서브넷, 보안그룹, 로드밸런서, EC2등등이 궁금하다면, 이 글이 속한 시리즈의 이전 글들을 확인해보면 좋을 것 같다.
그럼 바로 시작해보자!
EC2를 생성하는 것 자체는 매우 간단해서 빠르게 진행해보겠다.
VPC와 서브넷과 보안그룹과 같은 내용은 이 글에서 깊게 다룰 내용은 아니므로, 따로 언급하진 않겠다.
원하는대로 EC2의 이름을 작성하고, 나머지 설정들은 자유롭게 해주면 된다.
이 EC2는 AMI를 생성하기 위한 EC2이므로 아래에서 AMI를 생성한 후에는 EC2를 '중지' 또는 '제거'해줘도 된다.
위에서 생성한 EC2 서버에 내가 구동할 서비스에 맞게 여러 패키지들을 설치하고, 소스코드를 다운받았다고 생각해보겠다.
이제, 이 서버에 대한 이미지를 만들어줄 것이다.
EC2 콘솔로 이동하면 위와 같이 방금 생성한 EC2가 구동되는 것을 확인할 수 있는데, 이 서버의 이미지를 생성해보자.
AMI의 이름은 원하는대로 지어주고, '재부팅 안 함'을 활성화해주자.
'생성'버튼을 누른 후, AMI 콘솔로 이동해보면 서버의 이미지가 잘 생성된 것을 확인할 수 있다.
런치 템플릿은 Auto scaling에 필요한 설정들을 하는 곳이라고 생각하면 된다.
'템플릿 생성' 버튼을 눌러서, 바로 런치 템플릿을 생성해보도록 하자.
런치 템플릿의 이름은 자유롭게 설정하면 된다.
'Auto Scaling 지침'은 활성화해도 되고 안해도 되는데, 나는 비활성화하고 진행해보겠다.
AMI는 아까 생성한 AMI를 지정해주자.
인스턴스의 유형은 각자의 상황에 맞는 것을 하면 되지만, 실습용으로 t2.micro
를 선택하겠다.
키페어는 기존에 있는 것을 사용하고 싶다면, 사용해도 되고 새롭게 생성해도 무방하다.
네트워크 설정에서는 보안 그룹만 EC2에 적용한 보안그룹을 선택해주면 된다.
네트워크 설정
예를 들어서, EC2가 Private 서브넷에 위치해있고 8080포트에서 웹서버가 구동되고 있다면 아마도 인바운드 룰에 '내 VPC'의 IP에서 8080포트에 접근할 수 있게 설정이 되어 있을 것인데, 그 보안그룹을 선택해주면 동일하게 선택해주면 된다.
런치 템플릿은 이 정도만 설정해주고 생성하자.
이제 런치 템플릿 콘솔로 이동해보면, 위에서 설정한대로 잘 생성된 것을 확인할 수 있다.
런치 템플릿이 뭐하는 녀석인지 궁금할 수 있는데, 방금 생성한 런치 템플릿의 상세 정보 페이지에서 '작업(Actions)'버튼을 눌러보면 그에 대한 답을 알 수 있다.
이 런치 템플릿으로 서버 인스턴스를 생성할 수도 있고, Auto scaling 그룹으로도 생성할 수 있는 것을 확인할 수 있다.
Auto scaling을 하는 원리는 동일한 로드밸런서를 진입점으로 설정하고, 사용량에 따라서 서버의 인스턴스만 유동적으로 조절하는 것이다.
그래서 최종적으로는 ALB 하나를 만들어줄 것인데, 이 ALB에 연결할 타겟그룹 먼저 생성해주도록 하겠다.
Target 유형은 'Instances'를 선택해주고, 이름은 자유롭게 지어주면 된다.
포트는 EC2서버에서 구동중인 웹서버의 포트를 입력해주면 된다. 나는 예시로 8080
으로 설정해보았다.
VPC 또한 EC2가 올라가 있는 VPC를 선택해주면 된다.
그리고 '생성' 버튼을 눌러주면, 이 타겟그룹에 포함시킬 EC2인스턴스를 선택하는 화면이 나오는데, 아무것도 선택하지 않고 타겟그룹을 생성해주도록 하겠다.
이제 Application Load Balancer를 생성해주도록 하겠다.
로드 밸런서 콘솔로 이동해서, Application Load Balancer 유형으로 로드밸런서 생성화면으로 이동하자.
ALB의 이름은 자유롭게 지어주자.
VPC는 1번에서 생성한 EC2가 올라가 있는 VPC를 선택해주고, 서브넷은 외부에서 접근이 가능한 Public한 서브넷들을 선택해주면 된다.
보안그룹은 위와 같이 80포트의 접근을 허용해주도록 생성하고, ALB에 할당해주도록 하겠다.
만약 SSL을 ALB에 적용하겠다면, 80포트가 아닌 443포트에서 외부 접근이 가능하도록 보안그룹을 설정해주면 된다.
Listeners and routing
에서는 아까 생성한 타겟 그룹을 할당해주고, 80포트(http)를 통해서 서버에 접근할 수 있게 할 것이므로 포트에는 80을 입력해준다.
EC2 > Auto scaling 그룹 콘솔로 이동해서, '생성' 버튼을 눌러주자.
ASG의 이름은 자유롭게 지어주고, 런치 템플릿은 위에서 미리 생성했던 런치 템플릿을 선택해주면 된다.
다음으로 넘어가서, VPC는 위에서 생성한 녀석들이 위치한 VPC를 선택해주면 된다.
서브넷을 선택하는 부분은 지금 생성중인 ASG를 통해서 구동될 서버 인스턴스들이 올라갈 서브넷을 선택해주면 된다.
서버들을 Private 서브넷에서 구동시키고 싶다는 가정을 하고, Private 서브넷들을 선택해주었다.
로드 밸런서는 위에서 생성했던 것을 선택해주자.
- 원하는 용량 (Desired capacity): ASG가 생성될 때, 활성화시킬 인스턴스의 개수
- 최소 용량: 사용량이 없을 때, 최소한으로 활성화시킬 인스턴스의 개수
- 최대 용량: 사용량이 많을 때, 최대한으로 활성화시킬 인스턴스의 개수
이제 가장 중요한 부분인데, 각 값의 설명을 참고해서 설정해주면 된다.
이제 Auto scaling의 기준이 될 정책을 만들어주자. 이는 각자의 상황에 맞게 설정해주면 되는데, 나는 CPU 사용량에 따라서 Auto scaling이 되도록 설정해보겠다.
ASG의 설정은 여기까지만 진행하도록 하겠다. 이제 ASG를 생성해주도록 하자.
위에서 생성한대로 CPU의 사용량을 기준으로 해서 Scaling-out과 Scaling-in이 일어날 것인데, Scaling-in이 될 때 어떤 EC2인스턴스를 종료할지도 설정해줄 수 있다.
생성한 ASG의 상세페이지에 들어가서 '고급 옵션'을 눌러보면 이렇게 다양한 종료 정책이 있는 것을 확인할 수 있다.
너무도 당연하겠지만, ASG콘솔에서 내가 생성한 ASG가 잘 생성된 것을 확인할 수 있다.
ASG의 원하는 용량을 2로 설정했으므로, EC2 콘솔에서도 2개의 인스턴스가 생성되어 있는 것을 확인할 수 있다.
ASG에 연결된 타겟 그룹에도 2개의 EC2인스턴스가 잘 연결되어 있다.
이번 글에서는 AWS 콘솔에서 ASG를 생성하는 방법들을 알아보았다.
실제로 Scale-in, Scale-out이 되는 것을 확인해보면 더 좋았겠지만, 이번 글에서는 기본적으로 ASG를 생성하는 것에 초점을 맞춰보았다.
다음 글에서는 ASG에 서비스를 배포하고 운영하는 것에 대해서 기회가 된다면, 다뤄보도록 하겠다.
⭐ 실습용으로 생성한 인프라들은 과금폭탄을 방지하기 위해 꼭꼭꼭 삭제해주자!!!