본문 바로가기
공부/IaC

[AWS CloudFormation] #7 Auto Scaling Group 만들기 ( + Launch Configuration, ALB )

by haejang 2021. 1. 8.
728x90
728x90

 

>>진행한 실습 GitHub

 

이 실습은 아래 파일로 이미 생성된 vpc와 ec2를 가지고 진행된다

 

vpcforASG.yaml
0.00MB

 

이 파일의 Fn::Select 함수Fn::GetAZs 함수는 공식문서로 확인해보자

만들어진 EC2는 웹으로 접속하면

 

 

이런 화면이 뜬다 (위 버튼들로 부하를 주고 꺼서 오토스케일링을 확인할 예정 - 해당 php 파일도 깃헙에 있음)

이 EC2의 AMI를 따서 만들어놓은 후 ASG를 진행하도록 하겠다 (AMI를 뜨는것도 CloudFormation으로 해보려 했는데 찾지 못했다ㅜ)

 

진행할 실습 다이어그램

1. Parameter

Parameters:
  Key:
    Description: KeyPair
    Type: AWS::EC2::KeyPair::KeyName
  
  VPC:
    Description: VPC
    Type: AWS::EC2::VPC::Id

  WebSG:
    Description: SG for Web Server
    Type: AWS::EC2::SecurityGroup::Id
  
  PublicSubnet1:
    Description: public 1
    Type: AWS::EC2::Subnet::Id
  PublicSubnet2:
    Description: public 2
    Type: AWS::EC2::Subnet::Id
  PrivateSubnet1:
    Description: private 1
    Type: AWS::EC2::Subnet::Id
  PrivateSubnet2:
    Description: private 2
    Type: AWS::EC2::Subnet::Id

키, VPC, 보안그룹, 서브넷들 모두 AWS 관련 파라미터 유형이라 스택 생성 시 직접 선택하도록 만들었다

 

2. Launch Configuration

AWS::AutoScaling::LaunchConfiguration

Resources:
  LC:
    Type: AWS::AutoScaling::LaunchConfiguration
    Properties:
      ImageId: [내 EC2에서 뜬 AMI ID]
      InstanceType: t3.micro
      KeyName: !Ref Key
      LaunchConfigurationName: webserverLC
      SecurityGroups:
        - !Ref WebSG

ASG를 만들기 위해 필요한 Launch Configuration이다 (오토스케일링으로 만들어질 ec2들 설정)

Launch Template이나 Instance 등으로 대체 가능하지만, 내가 해본게 이거라서 이거로 진행한다

처음에 떠둔 AMI의 ID를 적어주고, 인스턴스 타입과 키, 이름, 보안그룹까지만 설정해주자

 

3. Application Load Balancer

AWS::ElasticLoadBalancingV2::LoadBalancer

AWS::ElasticLoadBalancingV2::TargetGroup

AWS::ElasticLoadBalancingV2::Listener

Resources:
  ALB:
    Type: AWS::ElasticLoadBalancingV2::LoadBalancer
    Properties:
      Name: webserverALB
      Type: application
      SecurityGroups:
        - !Ref WebSG
      Subnets:
        - !Ref PublicSubnet1
        - !Ref PublicSubnet2

  TargetGroup:
    Type: AWS::ElasticLoadBalancingV2::TargetGroup
    Properties:
      VpcId: !Ref VPC
      Name: webtest
      Port: 80
      Protocol: HTTP
      VpcId: !Ref VPC
      HealthCheckEnabled: true
      HealthCheckIntervalSeconds: 10
      HealthCheckPath: /
      HealthCheckProtocol: HTTP
      HealthCheckTimeoutSeconds: 5
      HealthyThresholdCount: 2
      UnhealthyThresholdCount: 2

  ALBListener:
    Type: AWS::ElasticLoadBalancingV2::Listener
    Properties:
      DefaultActions:
        - Type: forward
          TargetGroupArn: !Ref TargetGroup   
      LoadBalancerArn: !Ref ALB
      Port: 80
      Protocol: HTTP

콘솔에서 진행할 땐 로드밸런서 만들면서 타겟 그룹도 같이 만들었었지만, 여기선 따로 만든 후 리스너로 타겟 그룹을 연결해줘야 한다

로드밸런서 자체는 이름, 타입, 보안그룹, 퍼블릭 서브넷(가용영역 2개이상)만 설정해주면 된다

참고로 AWS::ElasticLoadBalancing::LoadBalancer라는 놈도 있는데, 얘는 classic 로드밸런서니까 조심하자

 

타겟 그룹은 로드밸런서가 라우팅할 대상이다

Health 어쩌고 하는 속성들은 거의다 기본값이 있어서 안써도 됐지만 그냥 써봤다

포트와 프로토콜, 상태 검사 설정을 해주자

 

이제 타겟 그룹과 ALB를 연결하기 위해 Listener를 생성해줘야 한다

DefaultActions 속성 확인

난 그저 타겟그룹으로 전달만 할거니까 forward 타입을 써주고, 전달대상인 타겟그룹을 붙여준다

그러고 포트, 프로토콜, ALB만 설정해주면 끝난다

 

4. Auto Scaling Group

AWS::AutoScaling::AutoScalingGroup

AWS::AutoScaling::ScalingPolicy

Resources:
  ASG:
    Type: AWS::AutoScaling::AutoScalingGroup
    Properties:
      AutoScalingGroupName: webserverASG
      VPCZoneIdentifier:
        - !Ref PrivateSubnet1
        - !Ref PrivateSubnet2
      Cooldown: 10
      LaunchConfigurationName: !Ref LC
      MaxSize: 4
      MinSize: 2
      DesiredCapacity: 2
      TargetGroupARNs:
        - !Ref TargetGroup
      Tags:
        - Key: Name
          Value: web-asg
          PropagateAtLaunch: true

  ASGPolicy:
    Type: AWS::AutoScaling::ScalingPolicy
    Properties:
      AutoScalingGroupName: !Ref ASG
      PolicyType: TargetTrackingScaling
      TargetTrackingConfiguration:
        PredefinedMetricSpecification:
          PredefinedMetricType: ASGAverageCPUUtilization
        TargetValue: 5

정책도 콘솔로 만들 땐 ASG 만들면서 같이 만들었었는데,,참 귀찮게 한다

이름과 오토스켈링 그룹이 배포될 프라이빗 서브넷 2개, launch configuration, target group을 설정해주자

Cooldown은 상태 확인 유예 기간이다 (기본값이 300)

MaxSize와 MinSize는 그룹의 크기를 설정하는거다

DesiredCapacity로는 원하는 용량을 입력할 수 있다

내가 지정한 정책에 맞게 크기를 동적으로 조정한다 (부하 딱히 없을 땐 2개, 부하 많을 땐 4개로 자동 조절하도록 설정)

Tags의 PropagateAtLaunch는 생성된 ec2들이 이 태그를 복사하면서 사용할지의 여부이다

-> auto scaling group의 ec2들은 web-asg라는 네임태그가 달린 채로 생성된다

 

Policy는 CPU 사용률을 기준으로 잡아주겠다

PolicyType엔 3가지가 있는데, 이 중 대상 추적 조정 정책인 TargetTrackongScaling으로 설정해주자

대상 추적 조정 정책을 설정하는 TargetTrackingConfiguration에선 또 사용자 지정 지표나 사전 정의된 지표 중 하나로 선택해야 한다

사용자 지정 지표(메모리 등)을 쓸거면 CustomizedMetricSpecification를 쓰지만, CPU는 이미 정의된 지표이므로 PredefinedMetricSpecification을 써야 한다

거기서 그냥 원하는 타입만 지정해주고, 마지막으로 대상 값만 지정해주면 끝난다(CPU 사용률이 5를 넘어갈 때 Auto Scaling이 일어나도록 설정 - 테스트를 위해 낮게 잡았다)

 

5. 실행 및 확인

autoscaling.yaml
0.00MB

 

이제 스택을 생성해보자

 

web-asg ec2 2개가 생성된걸 확인할 수 있다

확인해보면 서로 다른 가용 영역에서 생성되어 있다

생성된 Load Balancer의 DNS를 복사해서 웹서버에서 열어보면

 

 

처음에 만든 EC2와 똑같은 페이지가 나타난다

Start Stress 버튼을 눌러 CPU 부하를 줘보도록 하겠다

 

부하 들어가는중,,,

 

테스트를 위해 설정값들을 낮게 잡았지만 그래도 좀 기다려야 한다

인내심을 갖고 기다려보면

 

 

2개가 더 생성되었다

 

이번엔 Stop Stress 버튼을 눌러보자

 

 

부하를 주던 stress 프로세스들을 꺼버렸다

이번에도 좀 더 기다리면(사실 완전 한참 기다림)

 

 

두놈이 사라지는걸 볼 수 있다

 

728x90
728x90

댓글