Terraform 地形ecs。已注册的容器实例正在显示0

Terraform 地形ecs。已注册的容器实例正在显示0,terraform,amazon-ecs,Terraform,Amazon Ecs,在运行terraformapply时,它正在创建集群、服务和ec2实例。但注册的容器实例数为0,正在运行的任务数为0 我尝试将ecs.amazonaws.com更改为ec2.amazonaws.com,但出现错误: aws_ecs_service.nginx:InvalidParameterException:无法担任角色并验证负载平衡器上配置的侦听器。请验证正在传递的ECS服务角色是否具有正确的权限 提供程序“aws”{ region=“us-east-1” } 资源“aws\U ecs\U

在运行
terraformapply
时,它正在创建集群、服务和ec2实例。但注册的容器实例数为0,正在运行的任务数为0

我尝试将
ecs.amazonaws.com
更改为
ec2.amazonaws.com
,但出现错误:

aws_ecs_service.nginx:InvalidParameterException:无法担任角色并验证负载平衡器上配置的侦听器。请验证正在传递的ECS服务角色是否具有正确的权限

提供程序“aws”{
region=“us-east-1”
}
资源“aws\U ecs\U群集”“演示”{
name=“演示”
}
资源“aws\U iam\U角色”“ecs\U elb”{
name=“ecs elb”

假设_role_policy=要解决ecs问题,您可以执行以下步骤

  • 单击服务名称
    nginx
    ,检查是否有任务处于
    pending
    状态。如果您看到,通常会有很多
    已停止的任务
  • 这意味着容器不健康

  • 单击服务名称、事件,检查是否存在任何错误事件以帮助您进行故障排除

  • 如果列表中有ECS实例,请点击
    ECS实例
    ,否则表示没有ec2实例成功注册到ECS集群

  • 如果您使用AWS ECS AMI,应该可以。但如果您使用自己的AMI,则需要在下面添加userdata脚本

    ecs-userdata.tpl

    #!/bin/bash
    echo "ECS_CLUSTER=${ecs_cluster_name}" >> /etc/ecs/ecs.config
    
    更新地形代码:

    data "template_file" "ecs_user_data" {
    
      template = "file("ecs-userdata.tpl") }"
    
      vars {
        ecs_cluster_name = "${var.ecs_cluster_name}"
      }
    }
    
    
    resource "aws_launch_configuration" "demo" {
      ...
      user_data = "${data.template_file.ecs_user_data.rendered}"
      ...
    }
    
  • 启用docker容器日志,最简单的方法是将日志发送到aws cloudwatch
  • 首先添加以下资源

    resource "aws_cloudwatch_log_group" "app_logs" {
      name              = "demo"
      retention_in_days = 14
    }
    
    然后将以下代码添加到任务定义中

    "logConfiguration": {
      "logDriver": "awslogs",
      "options": {
        "awslogs-group": "${aws_cloudwatch_log_group.app_logs.name}",
        "awslogs-region": "${var.region}"
      }
    },
    
    应用更改后,请转到
    cloudwatch
    ,查看是否有任何错误日志

  • 将iam角色更改为
    [“ecs.amazonaws.com”、“ec2.amazonaws.com”]
    
    “委托人”:{
    “服务”:[“ecs.amazonaws.com”、“ec2.amazonaws.com”]
    },
    
    希望这些步骤对您有所帮助
  • 未来阅读:


    以下是一些在AWS控制台中检查的建议:

    • 确保您正在使用

      基本上,在这些实例中,一旦您以
      root
      身份登录,就应该有
      启动ecs
      命令

      地形示例:

      data "aws_ami" "ecs_ami" {
        most_recent = true
        owners      = ["amazon"]
      
        filter {
          name   = "name"
          values = ["amzn-ami-*-amazon-ecs-optimized"]
        }
      }
      
      data "aws_iam_policy_document" "instance" {
        provider = "aws.auto-scale-group"
      
        statement {
          effect  = "Allow"
          actions = ["sts:AssumeRole"]
      
          principals {
            type        = "Service"
            identifiers = ["ec2.amazonaws.com"]
          }
        }
      }
      
    • 检查EC2是否已启动

    • 检查您的负载平衡目标组(例如,通过检查“目标”选项卡中的实例、说明选项卡中的属性和运行状况检查选项卡中的属性,可以了解它们未注册的原因)
    • 检查ECS代理是否在EC2实例上运行

    • 以root用户身份登录EC2实例
    • 运行
      docker ps
      并检查
      ecs代理
      容器是否正在运行
    • 否则,通过
      启动ecs
      重新启动ecs
      手动启动
    • 注意:如果您没有
      docker
      start
      restart
      命令,则您没有使用ECS优化的AMI

    • 当实例终止时

      • 验证ECS代理是否仍在运行(请检查上文)
      • 使用启动配置时,请检查您的用户数据脚本是否存在错误。此外,它将正确的群集添加到
        /etc/ecs/ecs.config
        ecs配置文件中。并启动ecs代理(
        start ecs
      • 通过导航到EC2 Running instances Dashboard,选择terminated instance,在instance Settings(菜单)中获取系统日志,然后向下滚动到底部查看任何明显的问题,检查已终止实例的系统日志。在实例终止后,日志会保留一段时间
      • 检查ECS日志(
        tail-f/var/log/ECS/*
      • 请参阅:
      • 检查:
    • 一旦实例运行了ECS代理,请确保您将它们分配到了正确的集群中

      root# cat /etc/ecs/ecs.config
      ECS_CLUSTER=demo
      
    • 请注意正在运行的EC2实例的IAM角色,然后确保策略已附加到该角色

    • 在该群集角色的信任关系选项卡中,确保授予该角色访问EC2提供程序的权限。角色信任策略示例:

      地形示例:

      data "aws_ami" "ecs_ami" {
        most_recent = true
        owners      = ["amazon"]
      
        filter {
          name   = "name"
          values = ["amzn-ami-*-amazon-ecs-optimized"]
        }
      }
      
      data "aws_iam_policy_document" "instance" {
        provider = "aws.auto-scale-group"
      
        statement {
          effect  = "Allow"
          actions = ["sts:AssumeRole"]
      
          principals {
            type        = "Service"
            identifiers = ["ec2.amazonaws.com"]
          }
        }
      }
      
      请参阅:

      您还需要
      aws\u iam\u实例\u配置文件
      aws\u iam\u角色
      ,例如

      resource "aws_iam_instance_profile" "instance" {
        provider = "aws.auto-scale-group"
        name     = "myproject-profile-instance"
        role     = "${aws_iam_role.instance.name}"
      
        lifecycle {
          create_before_destroy = true
        }
      }
      
      resource "aws_iam_role" "instance" {
        provider           = "aws.auto-scale-group"
        name               = "myproject-role"
        path               = "/"
        assume_role_policy = "${data.aws_iam_policy_document.instance.json}"
      
        lifecycle {
          create_before_destroy = true
        }
      }
      
    • 现在,您的集群应该准备就绪了


    相关的:


    没有任务处于挂起/停止状态。云监视中也没有生成日志。服务中的事件:服务nginx无法放置任务,因为没有容器实例满足其所有要求。原因:在您的群集中找不到容器实例。有关详细信息,确定,这意味着没有ecs群集中添加ec2实例。是否
    ami-4fffc834
    属于AWS ecs映像,如果您使用自己的ami映像,则需要自定义
    用户数据
    ,以便在启动时将其自身添加到ecs群集我添加了第3项,让我知道这是否可以解决您的问题。EC2实例已创建并成功运行bootcmd:-echo ecs_cluster=demo>/etc/ecs/ecs.config。但没有实例ecs控制台下的ces根据,aws_iam_角色
    应该是
    ec2.amazonaws.com
    ,而不是
    ecs.amazonaws.com
    …可能的重复