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
…可能的重复