이 실습은 아래 파일로 이미 생성된 vpc와 ec2를 가지고 진행된다
이 파일의 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를 생성해줘야 한다
난 그저 타겟그룹으로 전달만 할거니까 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. 실행 및 확인
이제 스택을 생성해보자
web-asg ec2 2개가 생성된걸 확인할 수 있다
확인해보면 서로 다른 가용 영역에서 생성되어 있다
생성된 Load Balancer의 DNS를 복사해서 웹서버에서 열어보면
처음에 만든 EC2와 똑같은 페이지가 나타난다
Start Stress 버튼을 눌러 CPU 부하를 줘보도록 하겠다
테스트를 위해 설정값들을 낮게 잡았지만 그래도 좀 기다려야 한다
인내심을 갖고 기다려보면
2개가 더 생성되었다
이번엔 Stop Stress 버튼을 눌러보자
부하를 주던 stress 프로세스들을 꺼버렸다
이번에도 좀 더 기다리면(사실 완전 한참 기다림)
두놈이 사라지는걸 볼 수 있다
끝
'공부 > IaC' 카테고리의 다른 글
[Terraform on AWS] 테라폼 채움 참조, 변수(variable), output 사용 (0) | 2021.03.19 |
---|---|
[Terraform on AWS] 테라폼 입문 (in Window) (0) | 2021.03.15 |
[AWS CloudFormation] #6 IAM User, Policy 생성 (0) | 2021.01.06 |
[AWS CloudFormation] #5 RDS 생성하기 (for MySQL) (0) | 2021.01.06 |
[AWS CloudFormation] #4 mapping 사용하기 (EC2 AMI) (0) | 2021.01.06 |
댓글