AWS поставщик емкости ECS с использованием terraform - PullRequest
0 голосов
/ 04 февраля 2020

Я пытаюсь добавить в свою существующую инфраструктуру, управляемую поставщиком мощности terraform для кластера ECS. Terraform apply возвращает без ошибок, новый ресурс добавляется в файл состояния, но неожиданный сюрприз не появляется в AWS GUI (кластер ECS-> поставщик ресурсов -> результатов нет). Если я использую aws cli, чтобы вывести список выводов этого ресурса нормально, также перестройка всего не поможет. Кому-нибудь удалось добавить провайдера емкости для ECS с использованием terraform?

(я использую версию провайдера: «2.45.0») Спасибо!

Ответы [ 2 ]

1 голос
/ 05 февраля 2020

Для создания нового ресурса также необходимо добавить новый аргумент в модуль ecs_cluster: «Capacity_providers».

0 голосов
/ 07 марта 2020

Пожалуйста, остерегайтесь [ECS] Добавьте возможность удаления провайдера емкости ASG. # 632 . После создания он не может быть удален, только для обновления.

resource "aws_ecs_cluster" "this" {
  name = "${var.PROJECT}_${var.ENV}_${local.ecs_cluster_name}"

  # List of short names of one or more capacity providers
  capacity_providers = local.enable_ecs_cluster_auto_scaling == true ? aws_ecs_capacity_provider.asg[*].name : []
}

resource "aws_ecs_capacity_provider" "asg" {
  count = local.enable_ecs_cluster_auto_scaling ? 1 : 0

  name = "${var.PROJECT}-${var.ENV}-ecs-cluster-capacity-provider"

  auto_scaling_group_provider {
    auto_scaling_group_arn         = local.asg_ecs_cluster_arn

    #--------------------------------------------------------------------------------
    # When using managed termination protection, managed scaling must also be used otherwise managed termination protection will not work.
    # https://docs.aws.amazon.com/AmazonECS/latest/developerguide/cluster-capacity-providers.html#capacity-providers-considerations
    # Otherwise Error:
    # error creating capacity provider: ClientException: The managed termination protection setting for the capacity provider is invalid.
    # To enable managed termination protection for a capacity provider, the Auto Scaling group must have instance protection from scale in enabled.
    #--------------------------------------------------------------------------------
    managed_termination_protection = "ENABLED"

    managed_scaling {
      #--------------------------------------------------------------------------------
      # Whether auto scaling is managed by ECS. Valid values are ENABLED and DISABLED.
      # When creating a capacity provider, you can optionally enable managed scaling.
      # When managed scaling is enabled, ECS manages the scale-in/out of the ASG.
      #--------------------------------------------------------------------------------
      status                    = "ENABLED"
      minimum_scaling_step_size = local.ecs_cluster_autoscaling_min_step_size
      maximum_scaling_step_size = local.ecs_cluster_autoscaling_max_step_size
      target_capacity           = local.ecs_cluster_autoscaling_target_capacity
    }
  }
}

Это сработало и подтвердило, что автоматическое масштабирование уменьшило количество экземпляров EC2 из-за низкого использования ресурсов, и задачи обслуживания (контейнеры docker) были перемещены в запущенные экземпляры EC2.

AWS ошибка (или дизайн)

Однако после уничтожения террафом при попытке запустить терраформ применить снова:

ClientException: The specified capacity provider already exists.

Однажды упал в в таком случае, вероятно, необходимо отключить поставщика емкости в скриптах Terraform (может показаться, что он удаляет ресурс поставщика емкости, но на самом деле он все еще существует из-за ошибки AWS).

Следовательно, вероятно, для решения этой проблемы можно было бы добавить в кластер неизменный поставщик емкости с помощью интерфейса командной строки, предоставив группу автоматического масштабирования, на которую, как указывает поставщик емкости, все еще существует.

$ CAPACITY_PROVIDER=$(aws ecs describe-capacity-providers | jq -r '.capacityProviders[] | select(.status=="ACTIVE" and .name!="FARGATE" and .name!="FARGATE_SPOT") | .name')
$ aws ecs put-cluster-capacity-providers --cluster YOUR_ECS_CLUSTER --capacity-providers ${CAPACITY_PROVIDERS} --default-capacity-provider-strategy capacityProvider=${CAPACITY_PROVIDER},base=1,weight=1
{
    "cluster": {
        "clusterArn": "arn:aws:ecs:us-east-2:200506027189:cluster/YOUR_ECS_CLUSTER",
        "clusterName": "YOUR_ECS_CLUSTER",
        "status": "ACTIVE",
        "registeredContainerInstancesCount": 0,
        "runningTasksCount": 0,
        "pendingTasksCount": 0,
        "activeServicesCount": 0,
        "statistics": [],
        "tags": [],
        "settings": [
            {
                "name": "containerInsights",
                "value": "disabled"
            }
        ],
        "capacityProviders": [
            "YOUR_CAPACITY_PROVIDER"
        ],
        "defaultCapacityProviderStrategy": [
            {
                "capacityProvider": "YOUR_CAPACITY_PROVIDER",
                "weight": 1,
                "base": 1
            }
        ],
        "attachments": [
            {
                "id": "628ee192-4d0f-44be-85c0-049d796ed65c",
                "type": "asp",
                "status": "PRECREATED",
                "details": [
                    {
                        "name": "capacityProviderName",
                        "value": "YOUR_CAPACITY_PROVIDER"
                    },
                    {
                        "name": "scalingPlanName",
                        "value": "ECSManagedAutoScalingPlan-89682dcf-bb53-492f-8329-25d75458ea11"
                    }
                ]
            }
        ],
        "attachmentsStatus": "UPDATE_IN_PROGRESS"      <----- Takes time for the capacity provider to show up in ECS clsuter console
    }
}
...