簡體   English   中英

使用 terraform 創建的 EC2 實例未將自動縮放組添加到 ECS 集群

[英]EC2 instance created using terraform with autoscaling group not added to ECS cluster

TL;DR:我的 EC2 實例是否需要將 IAM 角色添加到我的 ECS 集群? 如果是這樣,我該如何設置?


我有一個使用自動縮放組創建的 EC2 實例。 此處為 ASG 定義。)我還有一個 ECS 集群,它是通過user_data在衍生實例上設置的。 我已經確認正在運行的實例上的/etc/ecs/ecs.config看起來是正確的:

ECS_CLUSTER=my_cluster

但是,該實例永遠不會出現在集群中,因此服務任務不會運行。 關於這個有很多問題,我都經歷過。 這些實例位於公共子網中,並且可以訪問 Internet。 ecs-agent.log中的錯誤是:

Error getting ECS instance credentials from default chain: NoCredentialProviders: no valid providers in chain.

所以我猜測問題在於該實例沒有與之關聯的 IAM 角色 但我承認我對所涉及的所有各種“角色”和“服務”有點困惑。 這看起來像一個問題嗎?

在此處輸入圖像描述

如果是這樣,我在哪里設置這個? 我正在使用 Cloud Posse 模塊。 文檔說如果我使用“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"]
    }
  }
}

更新:這里是任務執行角色聲明的rest:

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" autoscale_group" 中的iam_instance_profile_name設置來設置 EC2 實例配置文件(IAM 實例角色)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM