使用 terraform 的 AWS ECS 任务

问题描述 投票:0回答:1

我正在通过 terraform 在 AWS 中使用 ECS 部署应用程序。 我被困住了 我想创建 1 个在完成后应停止的任务和 1 个将继续运行的服务。

当我通过 AWS 控制台手动执行所有操作时,我可以选择创建任务(任务完成后将停止)和服务。

但是当我尝试使用 terraform 执行相同操作时,我遇到了障碍。我找不到任何可以创建任务而不是服务的资源。如果我错过添加服务中的任何生命周期块或任何其他块,请也让我知道。

我希望 dbmigrator 任务在完成后停止,并且我希望 apihost 服务继续运行

请指导我!

# CREATING ECS CLUSTER
resource "aws_ecs_cluster" "ecs_cluster" {
  name = "${var.project_name}-cluster"
}


# CREATING ECS SERVICE FOR DB MIGRATOR
resource "aws_ecs_service" "dbmigrator_service" {
  name            = "DBMigratorService"
  cluster         = aws_ecs_cluster.ecs_cluster.id
  task_definition = aws_ecs_task_definition.td_dbmigrator.arn
  desired_count   = 1 # Desired tasks
  depends_on      = [aws_db_instance.rds_cluster]
}


# CREATING SERVICE FOR APIHOST
resource "aws_ecs_service" "apihost_service" {
  name            = "ApiHostService"
  cluster         = aws_ecs_cluster.ecs_cluster.id
  task_definition = aws_ecs_task_definition.td_apihost.arn
  desired_count   = 1 # Desired tasks: 1

  load_balancer {
    target_group_arn = aws_lb_target_group.tg_apihost.arn
    container_name   = "apihost"
    container_port   = 80
  }

  # Ensuring that the web_service depends on the db_migrator_service
  depends_on = [aws_ecs_service.dbmigrator_service]
}

很多人建议我使用 local-exec 配置器(如下所示) 但我认为这行不通,因为我的 terraform 代码将从 terraform cloud 执行,而 local-exec 在那里不起作用。 还有其他办法吗?? 如果有人提供解决方案,请根据我的用例给出,我将通过 TERRAFORM CLOUD 执行此 terraform 脚本,并且我在任务定义中使用了桥接网络模式,而不是 awsvpc。 请帮忙!

resource aws_ecs_task_definition "task_definition" {
  
  // your task definition code.
  
  
}

resource "null_resource" "migration_task_run" {
  depends_on = [aws_ecs_task_definition.task_definition    // to make 
  sure that you run task only after creating the task definition
]

  provisioner "local-exec" {
   command = <<EOF
   aws ecs run-task \
   --cluster <<cluster_name>> \
   --task-definition <<task_definition_name>> \
   --count 1 --launch-type FARGATE \
   --network-configuration '{     // This is required if you have chosen 
   awsvpc in network config for your task definition. Else, this can be 
   ignored
   "awsvpcConfiguration": {
   "assignPublicIp":"DISABLED",
   "securityGroups": ["<<security_group>>"],
   "subnets": ["<<your subnets>>"]
   }
   }'
EOF
}
amazon-web-services terraform amazon-ecs terraform-provider-aws
1个回答
0
投票

您正在寻找的解决方案无法通过 Terraform 解决。 Terraform 将管理永久性的基础设施,并且每次执行都应该是幂等的。在您的情况下,迁移任务不是。

为什么?因为您正在尝试使用基础设施即代码工具来部署新容器。该责任是 CI/CD 管道的一部分,需要等待每个步骤正确执行,并且需要确保从当前部署顺利过渡到下一个部署。

Terraform 执行的 API 存在限制。当与 ECS 一起使用时,AWS 隐藏了部分复杂性,而

aws_ecs_service
资源也延续了这一点。如果 Terraform 执行完全幂等,则任务定义的版本号应始终相同。

另一方面,可以使用 Terraform 描述 AWS CodeBuild 管道或 Github 工作流程。因此可以构建 CI/CD 管道,但不能使用 Terraform 来执行它。

© www.soinside.com 2019 - 2024. All rights reserved.