简体   繁体   中英

Attach Auto-Scaling Policy to ECS service from CLI

I have a service running on ECS deployed with Fargate. I am using ecs-cli compose to launch this service. Here is the command I currently use:

ecs-cli compose service up --cluster my_cluster —-launch-type FARGATE

I also have an ecs-params.yml to configure this service. Here is the content:

version: 1
task_definition:
  task_execution_role: ecsTaskExecutionRole
  task_role_arn: arn:aws:iam::XXXXXX:role/MyExecutionRole 
  ecs_network_mode: awsvpc
  task_size:
    mem_limit: 2GB
    cpu_limit: 1024
run_params:
  network_configuration:
    awsvpc_configuration:
      subnets:
        - "subnet-XXXXXXXXXXXXXXXXX"
        - "subnet-XXXXXXXXXXXXXXXXX"
      security_groups:
        - "sg-XXXXXXXXXXXXXX"
      assign_public_ip: ENABLED

Once the service is created, I have to log into the AWS console and attach an auto-scaling policy through the AWS GUI. Is there an easier way to attach an auto-scaling policy, either through the CLI or in my YAML configuration?

While you can use the AWS CLI itself (see application-autoscaling in the docs),

I think it is much better for the entire operation to be performed in one deployment, and for that, you have tools such as Terraform .

You can use the terraform-ecs module written by arminc from Github, or you can do by it yourself! Here's a quick (and really dirty) example for the entire cluster, but you can also just grab the autoscaling part and use that if you don't want to have the entire deployment in one place:

provider "aws" {
  region = "us-east-1" # insert your own region
  profile = "insert aw cli profile, should be located in ~/.aws/credentials file"
  # you can also use your aws credentials instead
  # access_key = "insert_access_key"
  # secret_key = "insert_secret_key"
}


resource "aws_ecs_cluster" "cluster" {
  name = "my-cluster"
}

resource "aws_ecs_service" "service" {
  name = "my-service"
  cluster = "${aws_ecs_cluster.cluster.id}"

  task_definition = "${aws_ecs_task_definition.task_definition.family}:${aws_ecs_task_definition.task_definition.revision}"

  network_configuration {
    # These can also be created with Terraform and applied dynamically instead of hard-coded
    # look it up in the Docs

    security_groups = ["SG_IDS"]
    subnets         = ["SUBNET_IDS"] # can also be created with Terraform
    assign_public_ip = true
  }
}

resource "aws_ecs_task_definition" "task_definition" {
  family = "my-service"
  execution_role_arn = "ecsTaskExecutionRole"
  task_role_arn = "INSERT_ARN"
  network_mode = "awsvpc"
  container_definitions = <<DEFINITION
[
  {
    "name": "my_service"
    "cpu": 1024,
    "environment": [{
      "name": "exaple_ENV_VAR",
      "value": "EXAMPLE_VALUE"
    }],
    "essential": true,
    "image": "INSERT IMAGE URL",
    "memory": 2048,
    "networkMode": "awsvpc"
  }
]
DEFINITION
}

#
# Application AutoScaling resources
#
resource "aws_appautoscaling_target" "main" {
  service_namespace  = "ecs"
  resource_id    = "service/${var.cluster_name}/${aws_ecs_service.service.name}"
  scalable_dimension = "ecs:service:DesiredCount"
  # Insert Min and Max capacity here
  min_capacity       = "1"
  max_capacity       = "4"

  depends_on = [
    "aws_ecs_service.main",
  ]
}

resource "aws_appautoscaling_policy" "up" {
  name               = "scaling_policy-${aws_ecs_service.service.name}-up"
  service_namespace  = "ecs"
  resource_id        = "service/${aws_ecs_cluster.cluster.name}/${aws_ecs_service.service.name}"
  scalable_dimension = "ecs:service:DesiredCount"

  step_scaling_policy_configuration {
    adjustment_type         = "ChangeInCapacity"
    cooldown                = "60" # In seconds
    metric_aggregation_type = "Average"

    step_adjustment {
      metric_interval_lower_bound = 0
      scaling_adjustment          = 1 # you can also use negative numbers for scaling down
    }
  }

  depends_on = [
    "aws_appautoscaling_target.main",
  ]
}

resource "aws_appautoscaling_policy" "down" {
  name               = "scaling_policy-${aws_ecs_service.service.name}-down"
  service_namespace  = "ecs"
  resource_id        = "service/${aws_ecs_cluster.cluster.name}/${aws_ecs_service.service.name}"
  scalable_dimension = "ecs:service:DesiredCount"

  step_scaling_policy_configuration {
    adjustment_type         = "ChangeInCapacity"
    cooldown                = "60" # In seconds
    metric_aggregation_type = "Average"

    step_adjustment {
      metric_interval_upper_bound = 0
      scaling_adjustment          = -1 # scale down example
    }
  }

  depends_on = [
    "aws_appautoscaling_target.main",
  ]
}

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM