Присоединение политики автоматического масштабирования к службе ECS из CLI - PullRequest
0 голосов
/ 07 ноября 2018

У меня есть служба, работающая на ECS, развернутая с Fargate. Я использую ecs-cli compose для запуска этого сервиса. Вот команда, которую я сейчас использую:

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

У меня также есть ecs-params.yml для настройки этой службы. Вот содержание:

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

После создания службы я должен войти в консоль AWS и подключить политику автоматического масштабирования через графический интерфейс AWS. Есть ли более простой способ присоединения политики автоматического масштабирования, либо через CLI, либо в моей конфигурации YAML?

1 Ответ

0 голосов
/ 15 декабря 2018

Хотя вы можете использовать сам интерфейс командной строки AWS (см. автоматическое масштабирование приложения в документации),

Я думаю, что гораздо лучше, чтобы вся операция выполнялась в одном развертывании, и для этого у вас есть такие инструменты, как Terraform .

Вы можете использовать модуль terraform-ecs , написанный arminc из Github, или вы можете сделать это самостоятельно! Вот быстрый (и очень грязный) пример для всего кластера, но вы также можете просто взять часть автомасштабирования и использовать ее, если не хотите, чтобы все развертывание было в одном месте:

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",
  ]
}
...