Логи запланированных задач AWS ECS не отображаются в CloudWatch

Вопрос или проблема

У меня есть кластер ECS (на Fargate 1.4.0) с множеством задач и сервисов, которые все логируются в Cloudwatch, и всё в порядке. У меня есть несколько запланированных задач ECS (через EventBridge), и я знаю, что они запускаются в запланированное время, как и ожидалось. Я знаю это потому, что а) я могу видеть это на вкладке мониторинга правил EventBridge и б) одна из запланированных задач заключается в том, чтобы отправлять электронную почту, и я получаю это письмо. Так что она выполняется, но не записывается в CloudWatch, как другие задачи?

Прежде чем я перейду к своим шагам по устранению неполадок, позвольте мне дать вам больше информации:

В каждом определении задачи у меня есть этот блок логирования:

logConfiguration = {
  logDriver = "awslogs"
  options = {
    awslogs-group         = aws_cloudwatch_log_group.ecs_log_group.name
    awslogs-region        = "us-east-1"
    awslogs-stream-prefix = "prod-cron-engage"
  }
}

Я знаю, что всё правильно, потому что мои другие задачи, которые не запланированы (работают через сервисы 24/7), успешно логируются там.

Каждая задача имеет эти два параметра:

execution_role_arn       = aws_iam_role.ecs_task_execution_role.arn
task_role_arn            = aws_iam_role.ecs_task_execution_role.arn

Это:

resource "aws_iam_role" "ecs_task_execution_role" {
  name = "ecsTaskExecutionRole"

  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Effect = "Allow"
        Principal = {
          Service = "ecs-tasks.amazonaws.com"
        }
      }
    ]
  })

  tags = {
    "Name" = "${var.name_prefix}-iam-ecs-role"
  }
}

resource "aws_iam_role_policy_attachment" "ecs_task_execution_role_policy" {
  role       = aws_iam_role.ecs_task_execution_role.name
  policy_arn = "arn:aws:iam::aws:policy/service-role/AmazonECSTaskExecutionRolePolicy"
}

В AmazonECSTaskExecutionRolePolicy есть необходимые политики для ECS, включая доступ к CloudWatch.

Также вот моё правило EventBridge:

resource "aws_cloudwatch_event_rule" "prod_cron_engage_rule" {
  name                = "prod-engage-rule"
  description         = "Запуск задачи Prod Engage каждые 30 минут."
  schedule_expression = "rate(30 minutes)"
}

resource "aws_cloudwatch_event_target" "prod_cron_engage_target" {
  target_id = "run-prod-engage-task-every-half-an-hour"
  rule      = aws_cloudwatch_event_rule.prod_cron_engage_rule.name
  arn       = aws_ecs_cluster.ecs_cluster.arn
  role_arn  = aws_iam_role.eventbridge_role.arn

  ecs_target {
    task_definition_arn = aws_ecs_task_definition.prod_cron_engage_task.arn
    task_count          = 1
    launch_type         = "FARGATE"
    network_configuration {
      subnets          = module.vpc.private_subnets
      security_groups  = [aws_security_group.ecs_sg.id]
      assign_public_ip = false
    }
    tags = {
      "Name" = "${var.name_prefix}-ecs-prod-cron-engage"
    }
  }
}

Вот роли и политики EventBridge:

resource "aws_iam_role" "eventbridge_role" {
  name = "eventbridge-ecs-role"
  assume_role_policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "sts:AssumeRole"
        Principal = {
          Service = "events.amazonaws.com"
        }
        Effect = "Allow"
        Sid    = ""
      }
    ]
  })
}

resource "aws_iam_role_policy" "eventbridge_policy" {
  name = "eventbridge-ecs-policy"
  role = aws_iam_role.eventbridge_role.id
  policy = jsonencode({
    Version = "2012-10-17"
    Statement = [
      {
        Action = "ecs:RunTask"
        Effect = "Allow"
        Resource = [
          aws_ecs_task_definition.prod_cron_engage_task.arn
        ]
      },
      {
        Action   = "iam:PassRole"
        Effect   = "Allow"
        Resource = aws_iam_role.eventbridge_role.arn
      }
    ]
  })
}

Что я сделал до сих пор?

  1. Сначала я подумал, что, возможно, где-то есть правило ограничения, которое запрещает запланированным задачам доступ к CloudWatch (маловероятно, но я подумал, что так как они теперь запланированы с EventBridge, возможно это возможно), поэтому я дал и ECS, и EventBridge полный доступ к CloudWatch. Ничего не изменилось.

  2. Я попытался создать новую группу логов с такими широкими разрешениями и посмотреть, смогут ли задачи создать эту новую группу логов или нет. Новая группа логов не появилась, так что группы логов не могли быть созданы через определения задач.

Ответ или решение

Логи заданий ECS в CloudWatch: Возможные причины отсутствия записей и их решение

Ваша проблема с отсутствием логов заданий, запланированных через EventBridge для Amazon ECS (Elastic Container Service), действительно может вызывать сложности. Вы упомянули, что задания успешно выполняются и вы получаете уведомления по электронной почте, что говорит о корректной работе задач. Тем не менее, отсутствие логов в CloudWatch может быть вызвано несколькими различными факторами.

1. Вероятные причины

Существует несколько возможных причин, по которым логи заданий ECS могут не отображаться в CloudWatch:

  • Проблемы с разрешениями: Возможно, IAM-роль для выполнения заданий ECS не имеет необходимых разрешений для записи логов в CloudWatch. Хотя вы уже предоставили полные права, необходимо проверить, что именно роль задание использует.

  • Ошибка конфигурации логирования: Проверьте секцию logConfiguration в определении задачи. Убедитесь, что указаны все необходимые параметры, и они корректны (что в вашем случае, кажется, верно).

  • Создание нового логгруппы: Если задача не может создать новую группу для логирования, это может также указывать на проблемы с правами доступа или неверно указанное имя группы.

  • Лимиты на объем логов: Если у вас установлены лимиты, которые ограничивают записываемый объем логов в CloudWatch, это может приводить к тому, что логи просто не записываются.

  • Необходимость перезапуска: В некоторых случаях, если логирование было настроено неправильно, может потребоваться перезапуск самих задач или даже кластера, чтобы изменения вступили в силу.

2. Способы устранения неполадок

Чтобы диагностировать и устранить проблему, вы можете выполнить следующие действия:

  1. Проверка IAM-ролей: Пересмотрите настройки IAM для ролей, которые использует ваша задача. Убедитесь, что IAM-политика содержит необходимые разрешения для доступа к CloudWatch (например, logs:CreateLogGroup, logs:CreateLogStream, и logs:PutLogEvents).

  2. Тестирование переменных окружения: В добавление к логам проверьте, правильно ли настроены переменные окружения для задания. Это можно сделать с помощью временного задания, которое выводит значения этих переменных в логи.

  3. Ручное определение задач: Попробуйте запустить тот же конкретный клиентский контейнер через Run Task в консоли ECS, используя ту же конфигурацию логирования, чтобы увидеть, генерируются ли логи в CloudWatch. Это поможет выявить, является ли проблема специфической для EventBridge.

  4. Изменение лог-группы: Попробуйте изменить группу логов, чтобы проверить, может ли задание записать логи в другой лог-группе. Это может указывать на проблемы с конфигурацией.

  5. Использование AWS CLI: Выполните команду AWS CLI для запуска задачи и проверьте, возникают ли те же проблемы с логированием.

  6. Тестирование с минимальной настройкой: Создайте минимальную задачу с минимально необходимыми параметрами и проверьте, появляются ли логи в CloudWatch при ее выполнении.

Заключение

Если после выполнения всех вышеупомянутых шагов проблема не решилась, рекомендуется обратиться в службу поддержки AWS для более детального анализа. Определение точной причины отсутствия логов при использовании Amazon ECS и EventBridge требует тщательной диагностики, поэтому берите во внимание все аспекты конфигурации и разрешений. Это не только повысит стабильность вашего приложения, но и улучшит возможности анализа и мониторинга.

Оцените материал
Добавить комментарий

Капча загружается...