Tenho um cluster ECS (no Fargate 1.4.0
) com muitas tarefas e serviços que fazem login no Cloudwatch, e está tudo bem. Tenho algumas tarefas agendadas do ECS (via EventBridge), e sei que elas estão sendo executadas no horário agendado, conforme o esperado. Sei disso porque a) posso vê-las na guia EventBridge Rule monitoring, e b) uma das tarefas agendadas é enviar um e-mail, e eu recebo esse e-mail. Então, ele está sendo executado, mas não faz login no CloudWatch como as outras tarefas?
Antes de prosseguir com as etapas de solução de problemas, deixe-me dar mais informações:
Em cada definição de tarefa, tenho este bloco de log:
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"
}
}
Sei que tudo está correto lá porque minhas outras tarefas que não estão agendadas (executadas por meio de serviços 24 horas por dia, 7 dias por semana) estão sendo registradas com sucesso lá.
Cada tarefa tem estes dois parâmetros:
execution_role_arn = aws_iam_role.ecs_task_execution_role.arn
task_role_arn = aws_iam_role.ecs_task_execution_role.arn
Estes são:
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"
}
No AmazonECSTaskExecutionRolePolicy
, há políticas essenciais para o ECS, incluindo acesso ao CloudWatch.
Além disso, aqui está minha regra de ponte de eventos:
resource "aws_cloudwatch_event_rule" "prod_cron_engage_rule" {
name = "prod-engage-rule"
description = "Run Prod Engage task every 30 minutes."
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"
}
}
}
Aqui estão as funções e políticas do 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
}
]
})
}
O que eu fiz até agora?
No começo, pensei que talvez, de alguma forma, houvesse uma regra de restrição que negasse o acesso dessas tarefas agendadas ao CloudWatch (improvável, mas pensei que, já que agora elas estão agendadas com o EventBridge, talvez seja possível), então dou ao ECS e ao EventBridge acesso total ao CloudWatch. Não muda nada.
Tentei criar um novo grupo de logs com essas permissões amplas e ver se as tarefas podem criar esse novo grupo de logs ou não. O novo grupo de logs não estava lá, então os grupos de logs não puderam ser criados por meio de definições de tarefas.
A política do EventBridge não tem permissões suficientes.
Com base nessa documentação , alterei minha Política para esta e, com isso, tudo funciona como esperado!