【问题标题】:ecs instances not created with terraform未使用 terraform 创建的 ecs 实例
【发布时间】:2018-07-12 01:00:36
【问题描述】:

所以我试图通过 terraform 将一个公共托管的 docker 容器启动到我的 ECS 中。计划完成没有任何错误,并启动服务但ECS实例为空,服务只抱怨没有分配给集群的ECS实例。

作为我定义的基础架构的一部分:

  • VPC
  • 安全组
  • 我的角色
  • ecs 集群
  • 带有 ALB 的 ecs 服务

鉴于其他一切都启动并且我可以 ssh 到 ecs(甚至手动拉取并运行 docker 映像),我很确定所有网络都正常,这让我认为这可能是 ECS 服务之间的连接和ALB?

ECS 服务:

locals {
  application_name = "${var.environment}-kafka"
}

resource "aws_ecs_service" "kafka" {
  name                                = "${local.application_name}"
  iam_role                            = "${var.iam-role_arn}"
  cluster                             = "${var.ecs-cluster_id}"
  task_definition                     = "${aws_ecs_task_definition.kafka_definition.arn}"
  desired_count                       = "${var.count_kafka}"
  deployment_minimum_healthy_percent  = "${var.deployment_min_healthy_percent}"
  deployment_maximum_percent          = "${var.deployment_max_percent}"
  depends_on  = ["aws_alb_listener.kafka-alb-listener"]

  load_balancer {
    target_group_arn  = "${aws_alb_target_group.kafka-alb-target-group.arn}"
    container_port    = 80
    container_name    = "kafka"
  }

  lifecycle {
    create_before_destroy = true
  }
}

resource "aws_ecs_task_definition" "kafka_definition" {
  family                = "${var.environment}_kafka"
  container_definitions = "${data.template_file.kafka_task.rendered}"

  lifecycle {
    create_before_destroy = true
  }
}

data "template_file" "kafka_task" {
  template= "${file("${path.module}/kafka_task_definition.tpl")}"

  vars {
    kafka_docker_image = "${var.kafka-docker-image_name}:${var.kafka-docker-image_tag}"
  }
}

ALB:

resource "aws_alb" "kakfa-alb" {
  name                = "${local.application_name}-alb"
  security_groups     = ["${var.security_groups_ids}"]
  subnets             = ["${var.public_subnet_ids}"]

  tags {
    Name        = "${local.application_name}-alb"
    Environment = "${var.environment}"
  }
}

resource "aws_alb_target_group" "kafka-alb-target-group" {
  name                = "${aws_alb.kakfa-alb.name}-target-group"
  port                = "5000"
  protocol            = "HTTP"
  vpc_id              = "${var.vpc_id}"
  depends_on          = ["aws_alb.kakfa-alb"]

  health_check {
    healthy_threshold   = "5"
    unhealthy_threshold = "2"
    interval            = "30"
    matcher             = "200"
    path                = "/"
    port                = "traffic-port"
    protocol            = "HTTP"
    timeout             = "5"
  }

  tags {
    Name        = "${aws_alb.kakfa-alb.name}-target-group"
    Environment = "${var.environment}"
  }
}

resource "aws_alb_listener" "kafka-alb-listener" {
  load_balancer_arn = "${aws_alb.kakfa-alb.arn}"
  port              = "80"
  protocol          = "HTTP"

  default_action {
    target_group_arn = "${aws_alb_target_group.kafka-alb-target-group.arn}"
    type             = "forward"
  }
}

【问题讨论】:

    标签: terraform amazon-ecs terraform-provider-aws


    【解决方案1】:

    您可能尚未将实例添加到集群中。

    user_data.sh:

    #!/bin/bash
    
    echo ECS_CLUSTER='${ecs_cluster_name}' > /etc/ecs/ecs.config
    

    在您的 terraform 配置中:

    data "template_file" "user_data" {
      template = "${file("user_data.sh")}"
    
      vars {
        ecs_cluster_name = "${var.ecs_cluster_name}"
      }
    }
    
    
    resource "aws_launch_configuration" "current" {
    
      ...
    
      user_data = "${data.template_file.user_data.rendered}"
    
      ...
    
    }
    

    【讨论】:

    • ive 实际上花了最后 2 天的时间来解决这个问题。令人讨厌的是,我已经拥有了所有这些,但是因为我已经硬编码了 user_data,所以我在 ecs.config 中的 ecs_cluster_name 和我在资源上的实际 ecs-cluster.name 是不同的。非常感谢,不会发现那个错字。
    • 谢谢你的回答,这也是我的解决方案:)
    • 请注意,对于 TF 0.12.0,它是 user_data = templatefile("user_data.sh", {ecs_cluster_name = var.ecs_cluster_name})
    猜你喜欢
    • 2021-06-17
    • 2020-12-15
    • 2019-12-22
    • 2021-05-04
    • 1970-01-01
    • 2021-08-20
    • 2017-02-14
    • 2020-06-28
    • 2018-09-26
    相关资源
    最近更新 更多