* 참조 사항
- 필자는 학습을 목적으로 main.tf에 전체 인프라 구축 코드를 작성하였으며, 이에 대해 각기 설명함
- .tf 파일을 resource 별로 분할할 시, 필자와 코드가 다를 수 있음
- Terraform 기초부터 순차적으로 보길 권장 (1번 게시물의 이해가 매우 중요)
1. Architecture Create : https://isc9511.tistory.com/163
2. Bucket 생성 및 파일 업로드 : https://isc9511.tistory.com/164
3. IAM Role 생성 및 정책 Attachment : https://isc9511.tistory.com/165
4. Network Setting : https://isc9511.tistory.com/166
5. RDS 생성 : https://isc9511.tistory.com/167
6. Instance(EC2) 생성 : https://isc9511.tistory.com/168
7. Auto Scaling 생성 : https://isc9511.tistory.com/169
* ELB (Elastic Load Balancer) : 하나 이상의 가용 영역(AZ)에 있는 여러 대상이 수신하는 트래픽을 자동으로 분산하도록 지정하는 로드 밸런서
- Application / Gateway / Network LB 3가지 유형으로 구분
* Code 내용
- 아래에서는 Application Load Balancer(ALB)를 생성하는 코드를 사용
- ALB 생성 -> ALB Target Group 생성 -> ALB Listener 생성 -> 원본 EC2(Auto Scaling 미포함)를 ALB Target Group으로 연결
1) ALB 생성
# ALB 생성
resource "aws_lb" "app-tier-internal-lb"{
name = "app-tier-internal-lb"
internal = true # true = 내부(internal) / false = 외부(Internet-facing)
load_balancer_type = "application" # Default - application, 다른 하나는 gateway
security_groups = [aws_security_group.internal-alb-sg.id]
subnets = [aws_subnet.private-subnet-az1.id, aws_subnet.private-subnet-az2.id]
depends_on = [aws_ami_from_instance.app-layer-AS-template-ami] # AppEC2 완전 생성 후 ALB 생성 시작
tags = {
Name = "app-tier-internal-lb"
}
}
2) ALB Target Group(TG) 생성 - ALB가 트래픽을 전송하기 위한 조건 Group의 설정
# ALB Target Groups
resource "aws_lb_target_group" "app-tier-alb-tg"{
name = "app-tier-alb-tg"
port = "4000"
protocol = "HTTP"
vpc_id = aws_vpc.three-tier-vpc.id
target_type = "instance"
health_check {
path = "/health" # 앞서 AppInstance 사전 구축 시, curl로 헬스 체크 테스트했던 경로
protocol = "HTTP"
healthy_threshold = 2 # 헬스 체크 문제 시, 정상 요청 반환이 될때까지의 최대 재요청 수(정상 간주)
unhealthy_threshold = 2 # 헬스 체크 문제 시, 최대 실패 횟수 Limit
# 결론은 헬스 체크 제대로 안될 때 최대 2번까지는 시도한다
interval = 30 # 헬스 체크 인터벌(초)
timeout = 5 # 해당 시간(초)내 응답이 없으면 실패 간주
}
tags = {
Name = "app-tier-alb-tg"
}
}
3) ALB Listener 생성 - 외부에서 ALB가 수신하는 트래픽
# ALB listener
resource "aws_lb_listener" "app-alb-listner"{
load_balancer_arn = aws_lb.app-tier-internal-lb.arn
port = "80"
protocol = "HTTP"
default_action {
type = "forward"
target_group_arn = aws_lb_target_group.app-tier-alb-tg.arn
}
}
4) 원본 EC2(Auto Scaling 비포함)를 ALB Target Group으로 연결
# 구성한 ALB에 attach할 대상 지정 (원본 인스턴스 Attach)
# aws_lb_target_group_attachment의 경우 기존 원본 EC2 또는, 컨테이너, 람다 대상으로만 지정 가능
# ASG에서 생성 된 인스턴스의 경우 aws_autoscaling_group에서 매개변수를 사용하여 타겟 그룹에 등록해야함
resource "aws_lb_target_group_attachment" "internal-alb-attach-resource"{
target_group_arn = aws_lb_target_group.app-tier-alb-tg.arn
target_id = aws_instance.applayer.id
port = 4000
depends_on = [aws_lb_listener.app-alb-listner]
}
# 만약 위 방식으로 ASG에서 생성된 인스턴스들의 Target_id를 별도로 지정 시, 에러 발생
* 주의 사항
- 코드가 길어질 수록 종속성 문제가 다수 발생하기 때문에 아키텍처의 생성 순서에 대한 이해가 필수적(depends_on)
- LB Target Group에 EC2들을 연결할 시, 원본 인스턴스인지, Auto Scaling으로 생성된 인스턴스인지에 따라서 구현 코드가 다르게 적용 (아래는 Auto Scaling으로 생성된 인스턴스를 Target Group에 적용되도록 하는 Code)
### 7번 게시물(Auto Scaling 생성 코드 중, target_group_arns 부분이 Auto Scaling에서 생성된 인스턴스를 Target Group에 적용하는 코드)
# Auto Scaling Group 생성
resource "aws_autoscaling_group" "applayer-autoscaling-group" {
name = "AppTierASG"
launch_configuration = aws_launch_configuration.applayer-launch-config.name
vpc_zone_identifier = [aws_subnet.private-subnet-az1.id, aws_subnet.private-subnet-az2.id]
desired_capacity = 2
max_size = 2
min_size = 2
health_check_grace_period = 300
health_check_type = "EC2"
target_group_arns = [aws_lb_target_group.app-tier-alb-tg.arn]
# ASG에서 생성된 인스턴스의 경우 위 방식으로 LoadBalancer TargetGroup에 등록 가능
depends_on = [aws_lb_target_group.app-tier-alb-tg]
# LB Target Group이 생성되어 ARN이 지정된 후 위 명령어가 사용될 수 있기 때문에 Depends_on 사용
}
'AWS Cloud' 카테고리의 다른 글
[AWS] VPC Flowlogs, Cloudtrail and CloudWatch, S3간 연동 (0) | 2023.04.13 |
---|---|
[AWS - Terraform] Auto Scaling (0) | 2023.03.29 |
[AWS - Terraform] Instance(EC2) 생성 (0) | 2023.03.29 |
[AWS - Terraform] RDS 구축 (Cluster 및 RDS Instance) (0) | 2023.03.29 |
[AWS - Terraform] Network Setting (VPC, Subnet, IGW, NGW, Routing table, Security Group) (2) | 2023.03.28 |