terraform - cloudwatch 와 auto scaling

문한성·2023년 6월 1일
0

부트캠프

목록 보기
101/123
post-thumbnail

이전에 했던 CloudWatch와 autoscaling을 이용한 scale-out시에 알람이 울리고 sns를 이용해서 람다에 트리거를 부여해서 Discord Message를 남기는 실습이다.

main.tf

# Terraform AWS provider 설정
provider "aws" {
  region = "ap-northeast-2"  # 사용할 AWS 리전 설정
}

# 오토스케일링 그룹 정의
resource "aws_launch_configuration" "example" {
  name          = "example-launch-configuration"
  image_id      = "ami-0970cc54a3aa77466"  # 사용할 AMI ID 입력
  security_groups = [aws_security_group.instance.id]
  instance_type = "t2.micro"  # 인스턴스 유형
  user_data = <<-EOF
         #!/bin/bash
         echo "Hello, World" > index.html
         nohup busybox httpd -f -p 80 &
         EOF
  key_name = "sprintkey"  # 사용할 키 페어 이름
}

# 오토스케일링 그룹 정의
resource "aws_autoscaling_group" "example" {
  vpc_zone_identifier = [
        aws_subnet.public_subnet_1a.id,
        aws_subnet.public_subnet_2b.id
  ]
  name                 = "example-asg"
  max_size             = 10  # 최대 인스턴스 수
  min_size             = 1   # 최소 인스턴스 수
  desired_capacity     = 2   # 초기 인스턴스 수
  health_check_type    = "EC2"  # 인스턴스 상태 확인 유형
  launch_configuration = aws_launch_configuration.example.name  # Launch Configuration 연결

  lifecycle {
    create_before_destroy = true
  }
}

# 오토스케일링 정책 정의
resource "aws_autoscaling_policy" "example" {
  name                   = "example-policy"
  autoscaling_group_name = aws_autoscaling_group.example.name

  policy_type = "TargetTrackingScaling"

  target_tracking_configuration {
    predefined_metric_specification {
      predefined_metric_type = "ASGAverageCPUUtilization"
    }
    target_value = 70.0
  }
}

# CloudWatch Metric Alarm 정의
resource "aws_cloudwatch_metric_alarm" "example" {
  alarm_name          = "example-alarm"
  comparison_operator = "GreaterThanThreshold"
  evaluation_periods  = 1
  metric_name         = "CPUUtilization"
  namespace           = "AWS/EC2"
  period              = 60
  statistic           = "Average"
  threshold           = 70
  alarm_description   = "CPU utilization is greater than 70%"
  alarm_actions       = [aws_sns_topic.example.arn]
  dimensions = {
    AutoScalingGroupName = aws_autoscaling_group.example.name
  }
}

# SNS Topic 정의
resource "aws_sns_topic" "example" {
  name = "example-topic"
}

# SNS 구독 정의 (이메일 알림)
resource "aws_sns_topic_subscription" "example" {
  topic_arn = aws_sns_topic.example.arn
  protocol  = "email"
  endpoint  = "hansungmoon1002@gmail.com"  # 이메일 주소 입력
}
  • 이외에 사용할 VPC나 서브넷 라우트 테이블 보안그룹을 따로 작성해줘야한다.

마주쳤던 문제점

오토스케일링 정책 정의에서
resource "aws_autoscaling_policy" "example"으로 해야 했으나

resource "aws_appautoscaling_policy" "example"으로 공식문서를 찾아보고 코드들을 가져와서 사용했으나, 애초에 resource가 다르니 리소스안의 설정코드들이 계속해서 에러를 발생시켰다.

Error: creating Application Auto Scaling Policy (example-policy): ValidationException: 2 validation errors detected: Value 'autoscaling' at 'serviceNamespace' failed to satisfy constraint: Member must satisfy enum value set: [comprehend, rds, sagemaker, appstream, elasticmapreduce, dynamodb, lambda, ecs, cassandra, ec2, neptune, kafka, custom-resource, elasticache]; Value 'autoscaling:autoScalingGroup:DesiredCapacity' at 'scalableDimension' failed to satisfy constraint: Member must satisfy enum value set: [cassandra:table:ReadCapacityUnits, cassandra:table:WriteCapacityUnits, dynamodb:index:ReadCapacityUnits, dynamodb:index:WriteCapacityUnits, appstream:fleet:DesiredCapacity, comprehend:document-classifier-endpoint:DesiredInferenceUnits, ec2:spot-fleet-request:TargetCapacity, rds:cluster:ReadReplicaCount, elasticache:replication-group:Replicas, sagemaker:variant:DesiredProvisionedConcurrency, dynamodb:table:WriteCapacityUnits, kafka:broker-storage:VolumeSize, ecs:service:DesiredCount, sagemaker:variant:DesiredInstanceCount, comprehend:entity-recognizer-endpoint:DesiredInferenceUnits, dynamodb:table:ReadCapacityUnits, lambda:function:ProvisionedConcurrency, custom-resource:ResourceType:Property, neptune:cluster:ReadReplicaCount, elasticache:replication-group:NodeGroups, elasticmapreduce:instancegroup:InstanceCount]
│
│   with aws_appautoscaling_policy.example,
│   on main.tf line 55, in resource "aws_appautoscaling_policy" "example":55: resource "aws_appautoscaling_policy" "example" {

aws scalable_dimension관련 자료
scalable_dimension을 설정해주는 코드에서 계속해서 같은오류가 발생했었으나 이후에 리소스를 바꿔서 코드를 수정해주니 에러가 더이상 발생하지 않았다.

profile
기록하고 공유하려고 노력하는 DevOps 엔지니어

0개의 댓글

관련 채용 정보

Powered by GraphCDN, the GraphQL CDN