본문 바로가기

ACC/ACC CNU

[ASC 1기] 4주차 - Auto Scaling Group, Load Balancing

[이론]

 

  • auto scaling group: 해당 그룹 내에 존재하는 인스턴스의 양을 조절하여 필요한 양의 트래픽만 처리할 수 있도록 함. c최대, 최소, 현재 얼마나 띄울 것인지 설정 가능.
  • elastic load balancer: 여러 인스턴스에 대해 트래픽을 공평하게 나눠주는 장치. auto scaling group에 속한 인스턴스들이 처리하는 트래픽의 balance를 맞춰준다. 그렇기 때문에 auto scaling group과 같이 쓴다.
  • 탄력적 ip: 불변성을 띄는 ip. 기존 인스턴스가 갖는 ip주소는 재시작 시에 주소가 바뀌는 가변적인 ip주소이다. 가변적인 ip주소는 DNS에 ip주소를 할당한 경우 문제가 발생할 수 있기 때문에 탄력적 ip를 사용한다. 다만, 탄력적 ip를 받고 방치한다면 과금이 되니까 조심하자. (인스턴스와 연결을 하지 않거나 연결한 인스턴스를 띄우지 않은 경우)
  • 시작 템플릿: 붕어빵 틀과도 같다. 템플릿을 만들어 두면 해당 템플릿을 이용하여 인스턴스(붕어빵)를 찍어낼 수 있다. 해당 템플릿의 설정을 최대한 꽉꽉 채워서 100% 같은 붕어빵들을 만들 수도 있고, 느슨하게 설정하여 다양한 붕어빵을 만들 수도 있는 것이다. auto scaling group에서 시작 템플릿을 선택하면 해당 템플릿 설정으로 인스턴스를 확장할 수 있다.

[실습 목차]

 

  1. 시작 템플릿 생성하기
  2. auto scaling group으로 인스턴스 띄우기 (미리 인스턴스 안 띄워도 됨)
  3. 탄력적 ip 설정으로 인스턴스 접속 가능하게 하기
  4. elastic load balancer로 접속할 수 있게 하기
  5. security group으로 접속할 수 있게 하기
  6. auto scailing group으로 고급설정의 command를 이용해서 저번에 올린 ecr 이미지 다운받고 서버 띄우기 (고급설정 command 활용해서 docker까지는 오토로 깔아보자.)

[실습]

 

1. 시작 템플릿 생성

 

 

EC2 - 인스턴스 - 시작 템플릿 - 시작 템플릿 생성으로 시작 템플릿 만들기

 

 

 

이름 설정하고 auto scaling 지침을 체크. 저걸 체크해 줘야 auto scaling 설정이 되는 모양이다.

 

 

 

해당 템플릿으로 띄워줄 인스턴스의 OS 이미지를 골라줄 수 있다. 나는 Amazon Linux를 골라주었다. 뭘 해줘도 상관없지만 프리 티어 사용 가능(무료)은 잘 보고 고르자.

 

 

 

인스턴스 유형을 골라주면 된다. t2.micro만 프리 티어이므로 t2.micro를 선택하였다. 유형에 따라 사양 및 요금이 다르니 필요한 것을 잘 고르면 된다.

 

 

 

키 페어(public, private)를 설정해 준다. 없다면 '새 키 페어 생성'을 눌러서 만들어주면 된다. 이게 있어야 인스턴스에 접근할 수 있다.

public은 인스턴스에, private은 개인이 소유한다. 콘솔에서 접근하는 경우 pubilc key를, ssh로 접근하는 경우 private key를 사용한다고 보면 된다. 참고로 private key는 분실 시 찾을 방법이 없다고 하니 잘 보관하자.

 

 

 

이름, 유형, 파일 형식을 선택하면 된다.

이름은 아무거나 해주면 된다.

유형에 대한 차이는 모르겠지만 window환경에서 ED25519는 사용할 수 없다고 하니 RSA를 선택하였다.

파일 형식은 어떤 SSH를 사용하는지에 따라 다른 것 같다. Windows기준으로 PowerShell에서 OpenSSH를 지원하지만, 이참에 PuTTY도 사용해 볼 겸 ppk 파일로 선택했다.

키 페어를 생성하고 나면 지정한 파일 형식으로 private key 파일이 다운로드된다.

 

 

 

네트워크 설정이지만 사실 보안 그룹이 전부다.

  • auto scaling group 지침 제공을 체크하면 서브넷을 고를 수 없으므로 서브넷은 시작 템플릿에 포함하지 않는다.
  • 보안 그룹의 이름, 설명, VPC, 규칙을 설정할 수 있다. 이름, 설명은 대충 지어주고 VPC도 골라주었다. 보안 그룹 규칙(Inbound)은 EC2_INSTANCE_CONNECT를 사용하기 위해 설정해줬다. 유형이 다양해서 복잡한데, 유형은 사실 프로토콜과 포트 범위에 대한 빠른 설정이다. 유형을 '사용자 지정 TCP'로 설정하고 포트 범위만 22로 설정해주면 그게 ssh가 되는 것이다.
  • 소스 유형도 마찬가지로 '위치 무관', '사용자 지정', '내 IP'로 설정할 수 있는데 '위치 무관'은 보안상 좋을 것 같지 않고, EC2_INSTANCE_CONNECT를 이용하기 위해서는 내 IP가 아닌 서울 리전의 IP를 사용해야 하므로 13.209.1.56/29로 설정해줬다.
  • 하단 고급 네트워크 설정에 대한 설명은 해당 링크에서 찾을 수 있다. 나는 굳이 건들지 않았다.

 

스토리지 설정이다. AWS에서의 저장소가 EBS(Elastic Block Storage)이다.

  • 크기는 총 30GB까지 무료이다. 생성한 모든 스토리지 용량의 총합이 30GB를 넘기면 안됨에 주의하자. 
  • EBS 루트 볼륨의 경우 디바이스 이름 및 스냅샷은 고정인 듯 하다. 새 볼륨 추가를 통해 만든 볼륨들에 대해서는 이름을 지정할 수 있고, 스냅샷을 불러올 수도 있다.
  • 볼륨 유형은 SSD(gp2, gp3), HDD(sc1, st1), 마그네틱 등등이 있지만 프리 티어에서는 SSD와 마그네틱만 사용가능하다. 마그네틱은 매우 느리므로 서버를 띄울 거면 SSD를 선택하자.
  • IOPS(Input Output Per Second)는 초당 I/O 처리량으로, 성능이라고 생각하면 된다. 프리 티어에서는 최대 3000이므로 건드릴 필요가 없다.
  • 종료 시 삭제 옵션은 default가 '예'로 되어 있다. 인스턴스가 종료되면 EBS 볼륨도 삭제되니 주의하자. EBS 볼륨을 생성한 후에도 해당 옵션은 수정할 수 있으니 걱정하지 말자.
  • 암호화에 대한 자세한 설명은 해당 링크에서 찾을 수 있다. 나는 default를 따르기로 했다.
  • 처리량도 성능이라고 생각하면 된다. 프리 티어에서는 최대 125이므로 건드릴 필요가 없다.

 

고급 세부 정보에서 docker 설치 명령어를 작성해줬다. 이제 해당 템플릿으로 생성되는 인스턴스는 도커를 설치한 상태로 생성될 것이다.

 


2. Auto Scaling Group으로 인스턴스 띄우기

 

 

EC2- Auto Scaling - Auto Scaling 그룹 - Auto Scaling 그룹 생성

 

 

 

이름을 정해주고 방금 만든 시작 템플릿을 선택해주자. 아직은 버전이 1밖에 없지만 템플릿이 업데이트될 수도 있기 때문에 Latest 버전으로 선택했다. 이 설정은 생성 후에도 변경이 가능하다.

 

 

 

네트워크 설정이다. VPC를 선택하고 가용 영역을 선택한다. 여러 AZ를 선택하면 하나의 AZ에 문제가 생겼을 때 피해를 줄일 수 있으므로 여러 개를 골라주자.

 

 

 

인스턴스 유형 요구 사항. 아까 만든 템플릿을 이용하여 필요 시 해당 템플릿으로 인스턴스를 확장한다.

 

 

 

로드 밸런서 설정이다. ALB와 NLB를 선택할 수 있고 차이점은 해당 링크에서 참고하자. 이름도 설정해주고 로드 밸런서 체계도 선택해준다. Internal은 private ip주소를 갖고, Internet-facing은 public ip주소를 갖는다.

 

 

 

VPC는 Auto Scaling Group을 만들 때 지정해준 설정을 따른다. 가용영역 역시 마찬가지이고 필요하다면 추가할 수 있다. Auto Scaling Group을 만들 때 지정해준 가용 영역 및 서브넷을 선택해주었다.

로드 밸런서가 Application(7계층)이므로 프로토콜은 HTTP로 고정이다. 만약 NLB를 선택했다면 프로토콜은 TCP로 변경될 것이다. HTTP의 기본 포트는 80이므로 건드릴 필요가 없다. 대상 그룹 생성을 해주고 이름을 지어주자.

(※ 리스너는 사용자의 요청을 받아들이고 규칙에 따라 대상그룹(인스턴스들)에 요청을 전달하는 역할을 한다.)

 

 

 

상태 확인도 켜주었다. 인스턴스의 상태 확인에 실패하거나 비정상임을 확인하면 Auto Scaling Group에서 인스턴스의 교체가 이루어지고 로드 밸런서에서도 분리 및 연결 작업이 일어난다. 

 

 

 

추가 설정은 따로 건드리지 않았다. 대충 읽어봤지만 상관없을 것 같다.

 

 

 

그룹 크기를 지정해준다. 인스턴스의 개수를 최소, 최대, 현재에 대해 설정해 줄 수 있다. 1, 1, 1로 설정하면 ASG를 설정하는 이유가 없긴 하지만 만드는 것이 목표이기 때문에 이렇게 해주었다.

 

 

 

크기 조정 정책이다. 설정하면 CPU 사용률, 네트워크 입출력 등을 기준으로 scale out, scale in을 실행해준다. CPU 사용률은 일반적으로 50~60%로 유지한다고 하니 필요하다면 참고해서 설정해도 좋다.

 

 

 

인스턴스 축소 보호이다. 특정 인스턴스를 자동으로 scale in하지 않도록 해주는 설정이다. 나는 단일 인스턴스를 사용하니 사용하지 않았다. 어떤 상황에 보호할 수 있는지는 해당 링크를 참조하면 된다.

 

 

 

scale-out, scale-in 시에 sns를 발송해주는 기능이다. 마찬가지로 단일 인스턴스에서는 의미가 없기 때문에 넘어갔다.

 

 

 

태그도 추가해줄 수 있지만 큰 의미가 없어서 안 했다.

 

 

위의 과정을 끝내고 나면 검토까지 마치고 ASG를 생성할 수 있다.

또한 ASG로 설정한 원하는 인스턴스 1개가 무사히 띄워진 것을 확인할 수 있다.

 


3. 탄력적 IP 설정하기

 

 

EC2 - 네트워크 및 보안 - 탄력적 IP - 탄력적 IP주소 할당

 

 

 

네트워크 경계 그룹은 현재 리전(밖에 선택할 수 없다), Amazon에서 제공하는 IPv4 주소를 가져온다. 필요하다면 태그도 추가하자.

 

 

 

탄력적 IP 주소와 인스턴스를 연결해준다. ASG를 만들면서 만들어진 인스턴스와 연결해주면 된다. 프라이빗 IP 주소는 해당 인스턴스의 프라이빗 주소를 지정해주면 된다.

 


4. Elastic Load Balancer 설정하기

 

사실 ASG를 만들면서 ALB를 만들어줬기 때문에 설정만 확인하면 된다. 하지만 아마도 두 가지 문제가 발생할 듯 하여 따로 남긴다.

 

 

첫 번째로는 ALB의 타겟이 unhealthy임을 확인할 수 있다. 해당 문제는 오른쪽 아래에 나와 있듯이 Request timed out이라고 돼있는 것을 확인할 수 있다. 해당 문제는 인스턴스 내부의 서버에서 포트 개방을 하면 해결이 된다. 아직 인스턴스를 띄우기만 하고 들어가지 않았으므로 이렇게 뜨는 것이 정상이다.

 

 

 

두 번째로는 Listeners에서 Listener의 Protocol 부분에서 Not reachable이라고 뜬 것을 확인할 수 있다. 이것은 인스턴스의 Security Group 설정에서 인바운드 규칙에 리스너 포트를 추가하지 않았기 때문이다. 나는 Internet-facing으로 생성했으니 HTTP에 대한 모든 주소를 허용하면 된다. 자세한 내용은 해당 링크를 참조하면 된다.

 


5. Security Group 설정하기

 

 

위에서 말했듯 인스턴스에 인바운드 HTTP 포트(80)에 대한 규칙을 추가해줬다.

 


6. 인스턴스 접속해서 도커 이미지 깔고 실행해보기

 

 

인스턴스 - 인스턴스 ID - 연결

 

 

 

인스턴스 연결해주기. 보안 그룹 인바운드에서 EC2 Instance Connect에 대한 연결을 허용해줬기 때문에 바로 접속이 가능하다.

 

 

 

반가운 화면

아까 분명 docker 설치를 해줬는데 안된 모양이다. 명령어를 다시 입력해줘서 도커를 설치해줬다.

docker image를 pull 하는 과정은 해당 링크를 참조해서 반대로 하면 된다.

 

 

 

이런저런 과정을 거쳐서 image를 pull했다.

docker run -d -p 8080:80 6d12a131c928(IMAGE ID)를 입력해서 컨테이너를 8080 포트로 열어주면 끝이다. (dockerfile을 8080포트로 설정함)

 

 

 

로드 밸런서의 DNS로 잘 접속된 것을 볼 수 있다. 당연히 탄력적 ip를 통해서도 접속이 가능하다. 원래 Whitelabel Error가 뜨는 서버였다. 잘 되는 것이 맞다.

 


Reference

 

탄력적 ip: https://soobarkbar.tistory.com/224

https://inpa.tistory.com/entry/AWS-%F0%9F%93%9A-%ED%83%84%EB%A0%A5%EC%A0%81-IP-Elastic-IP-EIP-%EB%9E%80-%EB%AC%B4%EC%97%87%EC%9D%B8%EA%B0%80

 

ec2에 도커 설치: https://velog.io/@hmyanghm/AWS-EC2%EC%97%90-Docker-%EC%84%A4%EC%B9%98

 

도커 옵션: https://www.daleseo.com/docker-run/

 

인바운드 규칙 변경: https://support.skdt.co.kr/ko/support/solutions/articles/42000093546--ec2-aws-%EA%B4%80%EB%A6%AC-%EC%BD%98%EC%86%94-%EC%9B%B9%EB%B8%8C%EB%9D%BC%EC%9A%B0%EC%A0%80-%EC%97%90%EC%84%9C-ec2%EC%97%90-%EC%97%B0%EA%B2%B0%ED%95%A0-%EC%88%98-%EC%97%86%EC%8A%B5%EB%8B%88%EB%8B%A4-

 

키 페어: https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/ec2-key-pairs.html

https://docs.aws.amazon.com/ko_kr/AWSEC2/latest/UserGuide/get-set-up-for-amazon-ec2.html

 

원격 접속: https://ongamedev.tistory.com/421

 

ec2_instance_connect: https://kdevkr.github.io/allow-ec2-instance-connect/

 

IOPS: https://sunacom.tistory.com/128

 

리스너: https://aws-hyoh.tistory.com/entry/AWS-Application-Load-Balancer-%EC%89%BD%EA%B2%8C-%EC%9D%B4%ED%95%B4%ED%95%98%EA%B8%B0-2

 

크기 조정 정책: https://sweetysnail1011.tistory.com/59