用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组

Posted

技术标签:

【中文标题】用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组【英文标题】:Terraform AWS CloudWatch log group for ECS tasks/containers 【发布时间】:2020-04-28 07:03:18 【问题描述】:

我正在尝试使用 Terraform 创建 AWS ECS 任务,该任务会将日志放在 CloudWatch 上的特定日志组中。问题是容器定义在 JSON 文件中,我无法将 CloudWatch 组名称从 .tf 文件映射到该 .json 文件。

container_definition.json:

[
  
    "name": "supreme-task",
    "image": "xxxx50690yyyy.dkr.ecr.eu-central-1.amazonaws.com/supreme-task",
    "essential": true,
    "portMappings": [
      
        "containerPort": 5000,
        "hostPort": 5000
      
    ],
    "logConfiguration": 
      "logDriver": "awslogs",
      "options": 
        "awslogs-group": "supreme-task-group",  <- This needs to be taken from variable.tf file.
        "awslogs-region": "eu-central-1",
        "awslogs-stream-prefix": "streaming"
      
    
  
]

变量.tf:


variable "ecs_task_definition_name" 
  description = "Task definition name."
  type = string
  default = "supreme-task-def"


variable "task_role" 
  description = "Name of the task role."
  type = string
  default = "supreme-task-role"


variable "task_execution_role" 
  description = "Name of the task execution role."
  type = string
  default = "supreme-task-exec-role"


variable "cloudwatch_group" 
  description = "CloudWatch group name."
  type = string
  default = "supreme-task-group"


任务定义:

resource "aws_ecs_task_definition" "task_definition" 
  family = var.ecs_task_definition_name
  requires_compatibilities = ["FARGATE"]
  network_mode = "awsvpc"
  cpu = 1024
  memory = 4096
  container_definitions = file("modules/ecs-supreme-task/task-definition.json")
  execution_role_arn = aws_iam_role.task_execution_role.name
  task_role_arn = aws_iam_role.task_role.name

有没有办法做到这一点?或者也许这应该以不同的方式完成?

【问题讨论】:

您是否尝试过插值(通过将 JSON 内联在 HEREDOC 中)或使用 Terraform 的模板功能? 内联 JSON 插值工作,谢谢! :) 您要自己回答吗? 不用,你可以的。 【参考方案1】:

通过关注@ydaetskcorR 的评论解决。

将容器定义作为内联参数。

container_definitions = <<DEFINITION
    [
      
        "name": "$var.repository_name",
        "image": "$var.repository_uri",
        "essential": true,
        "portMappings": [
          
            "containerPort": 5000,
            "hostPort": 5000
          
        ],
        "logConfiguration": 
          "logDriver": "awslogs",
          "options": 
            "awslogs-group": "$var.cloudwatch_group",
            "awslogs-region": "eu-central-1",
            "awslogs-stream-prefix": "ecs"
          
        
      
    ]
    DEFINITION

【讨论】:

【参考方案2】:

如果您想将容器定义作为模板加载以避免内联 tf 文件中的内容,那么您可以:

1- 将容器定义创建为带有变量的模板文件,只需注意扩展名为 .tpl

container_definition.tpl

[
  
    "name": "supreme-task",
    "image": "xxxx50690yyyy.dkr.ecr.eu-central-1.amazonaws.com/supreme-task",
    "essential": true,
    "portMappings": [
      
        "containerPort": 5000,
        "hostPort": 5000
      
    ],
    "logConfiguration": 
      "logDriver": "awslogs",
      "options": 
        "awslogs-group": "$cloudwatch_group",
        "awslogs-region": "eu-central-1",
        "awslogs-stream-prefix": "streaming"
      
    
  
]

2- 然后将文件加载为模板并注入变量:

task_definition.tf

data template_file task_definition 
  template = file("$path.module/container_definition.tpl")

  vars = 
    cloudwatch_group = var.cloudwatch_group
  


resource "aws_ecs_task_definition" "task_definition" 
  family = var.ecs_task_definition_name
  requires_compatibilities = ["FARGATE"]
  network_mode = "awsvpc"
  cpu = 1024
  memory = 4096
  container_definitions = data.template_file.task_definition.rendered
  execution_role_arn = aws_iam_role.task_execution_role.name
  task_role_arn = aws_iam_role.task_role.name

【讨论】:

以上是关于用于 ECS 任务/容器的 Terraform AWS CloudWatch 日志组的主要内容,如果未能解决你的问题,请参考以下文章

入口点的 ECS 计划任务容器覆盖不起作用

Terraform 列出 ECS 集群容器实例

Terraform 定义的任务角色对于 ECS 计划任务无法正常工作

如何通过 terraform 在 ecs 任务定义中指定环境变量?

terraform - 在您的集群中未找到任何容器实例

EFS 卷绑定在 ECS 任务定义的每个“terraform apply”上自动分离/重新附加