Экземпляр EC2, созданный с помощью terraform с группой автомасштабирования, не добавленной в кластер ECS

TL;DR: Нужно ли моему экземпляру EC2 добавить роль IAM в мой кластер ECS? Если да, то как мне это установить?


У меня есть экземпляр EC2, созданный с использованием группы автоматического масштабирования. (Определение ПГС здесь.) У меня также есть кластер ECS, который устанавливается на порожденных инстансах через user_data. Я подтвердил, что /etc/ecs/ecs.config на работающем экземпляре выглядит правильно:

ECS_CLUSTER=my_cluster

Однако экземпляр никогда не появляется в кластере, поэтому задача службы не запускается. На SO есть множество вопросов по этому поводу, и я прошел через них все. Экземпляры находятся в общедоступной подсети и имеют доступ к Интернету. Ошибка в ecs-agent.log:

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

Итак, я предполагаю, что проблема в том, что с ним связан экземпляр не имеет роли IAM. Но я признаюсь, что я немного запутался во всех задействованных «ролях» и «услугах». Это похоже на проблему?

Экземпляр EC2, созданный с помощью terraform с группой автомасштабирования, не добавленной в кластер ECS

Если это так, где я могу установить это? Я использую модули Cloud Posse. Документы говорят Мне не следует устанавливать service_role_arn для сервисной задачи, если я использую «awsvpc» в качестве сетевого режима, но я не уверен, следует ли мне использовать другой режим для этой настройки (несколько контейнеров, работающих как задачи на одном экземпляр 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 создаются группой автоматического масштабирования, см. здесь мой код. Кластер 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-автомасштабируемая группа будет что-то вроде instance_role, но его нет.

Спасибо за комментарий! Вы знаете, как это сделать? На самом деле я вижу очень похожую роль, созданную внутри модуля. Я создаю его, чтобы разрешить задачам EC2 доступ к SSM. (Я обновил вопрос.)

Nick K9 02.05.2022 13:55

Задача task_role_arn — не место для назначения роли экземпляра EC2. Это будет роль для задачи ECS (контейнер Docker). Весь код, который вы включили в свой вопрос, связан со службой ECS и задачей ECS, что будет иметь значение гораздо позже в процессе. Вам нужно показать, как создается кластер ECS и экземпляр EC2.

Mark B 02.05.2022 14:48

Спасибо @MarkB, я добавил больше кода.

Nick K9 02.05.2022 15:52
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вам необходимо установить профиль экземпляра EC2 (роль экземпляра IAM) с помощью параметра iam_instance_profile_name в файле module "autoscale_group".

Спасибо Спасибо! Мне нужно было создать роль, использующую управляемую политику AmazonEC2ContainerServiceforEC2Role, и использовать эту роль для создания профиля экземпляра. Затем я установил этот профиль, как описано в autoscale_group, и вуаля!

Nick K9 02.05.2022 17:37

Другие вопросы по теме