使用带有自动缩放组的 Terraform 创建的 EC2 实例未添加到 ECS 集群
EC2 instance created using terraform with autoscaling group not added to ECS cluster
TL;DR: 我的 EC2 实例是否需要 IAM 角色才能添加到我的 ECS 集群?如果可以,我该如何设置?
我有一个使用自动缩放组创建的 EC2 实例。 (.) 我还有一个 ECS 集群,它是通过 user_data
在生成的实例上设置的。我已经确认 运行ning 实例上的 /etc/ecs/ecs.config
看起来是正确的:
ECS_CLUSTER=my_cluster
但是,该实例从未出现在集群中,因此服务任务不会运行。 SO 上有很多关于此的问题,我已经解决了所有问题。这些实例位于 public 子网中并且可以访问互联网。 ecs-agent.log
中的错误是:
Error getting ECS instance credentials from default chain: NoCredentialProviders: no valid providers in chain.
所以我猜测问题是 与之相关。但我承认,我对所涉及的所有各种“角色”和“服务”感到有点困惑。这看起来像个问题吗?
如果是这样,我应该在哪里设置它?我正在使用 Cloud Posse 模块。 The docs say 如果我使用“awsvpc”作为网络模式,我不应该在服务任务上设置 service_role_arn
,但我不确定我是否应该为此设置使用不同的模式(多个容器 运行 在单个 EC2 实例上作为任务)。另外,我可以在这里配置其他几个角色? ECS 服务任务如下所示:
module "ecs_alb_service_task" {
source = "cloudposse/ecs-alb-service-task/aws"
# Cloud Posse recommends pinning every module to a specific version
version = "0.62.0"
container_definition_json = jsonencode([for k, def in module.flask_container_def : def.json_map_object])
name = "myapp-web"
security_group_ids = [module.sg.id]
ecs_cluster_arn = aws_ecs_cluster.default.arn
task_exec_role_arn = [aws_iam_role.ec2_task_execution_role.arn]
launch_type = "EC2"
alb_security_group = module.sg.name
vpc_id = module.vpc.vpc_id
subnet_ids = module.subnets.public_subnet_ids
network_mode = "awsvpc"
desired_count = 1
task_memory = (512 * 3)
task_cpu = 1024
deployment_controller_type = "ECS"
enable_all_egress_rule = false
health_check_grace_period_seconds = 10
deployment_minimum_healthy_percent = 50
deployment_maximum_percent = 200
ecs_load_balancers = [{
container_name = "web"
container_port = 80
elb_name = null
target_group_arn = module.alb.default_target_group_arn
}]
}
这是 ec2_task_execution_role
的政策:
data "aws_iam_policy_document" "ec2_task_execution_role" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ecs-tasks.amazonaws.com"]
}
}
}
更新:下面是任务执行角色声明的其余部分:
resource "aws_iam_role" "ec2_task_execution_role" {
name = "${var.project_name}_ec2_task_execution_role"
assume_role_policy = data.aws_iam_policy_document.ec2_task_execution_role.json
tags = {
Name = "${var.project_name}_ec2_task_execution_role"
Project = var.project_name
}
}
resource "aws_iam_role_policy_attachment" "ec2_task_execution_role" {
role = aws_iam_role.ec2_task_execution_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
# Create a policy for the EC2 role to use Session Manager
resource "aws_iam_role_policy" "ec2_role_policy" {
name = "${var.project_name}_ec2_role_policy"
role = aws_iam_role.ec2_task_execution_role.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"ssm:DescribeParameters",
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter"
],
"Resource" : "*"
}
]
})
}
更新 2: EC2 实例由 Auto-Scaling Group 创建。 ECS集群就是这样:
# Create the ECS cluster
resource "aws_ecs_cluster" "default" {
name = "${var.project_name}_cluster"
tags = {
Name = "${var.project_name}_cluster"
Project = var.project_name
}
}
我原以为 ec2-autoscaling-group 模块中会有类似 instance_role
的东西,但没有。
您需要通过 module "autoscale_group"
中的 iam_instance_profile_name
设置来设置 EC2 实例配置文件(IAM 实例角色)。
TL;DR: 我的 EC2 实例是否需要 IAM 角色才能添加到我的 ECS 集群?如果可以,我该如何设置?
我有一个使用自动缩放组创建的 EC2 实例。 (user_data
在生成的实例上设置的。我已经确认 运行ning 实例上的 /etc/ecs/ecs.config
看起来是正确的:
ECS_CLUSTER=my_cluster
但是,该实例从未出现在集群中,因此服务任务不会运行。 SO 上有很多关于此的问题,我已经解决了所有问题。这些实例位于 public 子网中并且可以访问互联网。 ecs-agent.log
中的错误是:
Error getting ECS instance credentials from default chain: NoCredentialProviders: no valid providers in chain.
所以我猜测问题是
如果是这样,我应该在哪里设置它?我正在使用 Cloud Posse 模块。 The docs say 如果我使用“awsvpc”作为网络模式,我不应该在服务任务上设置 service_role_arn
,但我不确定我是否应该为此设置使用不同的模式(多个容器 运行 在单个 EC2 实例上作为任务)。另外,我可以在这里配置其他几个角色? ECS 服务任务如下所示:
module "ecs_alb_service_task" {
source = "cloudposse/ecs-alb-service-task/aws"
# Cloud Posse recommends pinning every module to a specific version
version = "0.62.0"
container_definition_json = jsonencode([for k, def in module.flask_container_def : def.json_map_object])
name = "myapp-web"
security_group_ids = [module.sg.id]
ecs_cluster_arn = aws_ecs_cluster.default.arn
task_exec_role_arn = [aws_iam_role.ec2_task_execution_role.arn]
launch_type = "EC2"
alb_security_group = module.sg.name
vpc_id = module.vpc.vpc_id
subnet_ids = module.subnets.public_subnet_ids
network_mode = "awsvpc"
desired_count = 1
task_memory = (512 * 3)
task_cpu = 1024
deployment_controller_type = "ECS"
enable_all_egress_rule = false
health_check_grace_period_seconds = 10
deployment_minimum_healthy_percent = 50
deployment_maximum_percent = 200
ecs_load_balancers = [{
container_name = "web"
container_port = 80
elb_name = null
target_group_arn = module.alb.default_target_group_arn
}]
}
这是 ec2_task_execution_role
的政策:
data "aws_iam_policy_document" "ec2_task_execution_role" {
statement {
actions = ["sts:AssumeRole"]
principals {
type = "Service"
identifiers = ["ecs-tasks.amazonaws.com"]
}
}
}
更新:下面是任务执行角色声明的其余部分:
resource "aws_iam_role" "ec2_task_execution_role" {
name = "${var.project_name}_ec2_task_execution_role"
assume_role_policy = data.aws_iam_policy_document.ec2_task_execution_role.json
tags = {
Name = "${var.project_name}_ec2_task_execution_role"
Project = var.project_name
}
}
resource "aws_iam_role_policy_attachment" "ec2_task_execution_role" {
role = aws_iam_role.ec2_task_execution_role.name
policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}
# Create a policy for the EC2 role to use Session Manager
resource "aws_iam_role_policy" "ec2_role_policy" {
name = "${var.project_name}_ec2_role_policy"
role = aws_iam_role.ec2_task_execution_role.id
policy = jsonencode({
"Version" : "2012-10-17",
"Statement" : [
{
"Effect" : "Allow",
"Action" : [
"ssm:DescribeParameters",
"ssm:GetParametersByPath",
"ssm:GetParameters",
"ssm:GetParameter"
],
"Resource" : "*"
}
]
})
}
更新 2: EC2 实例由 Auto-Scaling Group
# Create the ECS cluster
resource "aws_ecs_cluster" "default" {
name = "${var.project_name}_cluster"
tags = {
Name = "${var.project_name}_cluster"
Project = var.project_name
}
}
我原以为 ec2-autoscaling-group 模块中会有类似 instance_role
的东西,但没有。
您需要通过 module "autoscale_group"
中的 iam_instance_profile_name
设置来设置 EC2 实例配置文件(IAM 实例角色)。