我正在通过 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
}
您正在寻找的解决方案无法通过 Terraform 解决。 Terraform 将管理永久性的基础设施,并且每次执行都应该是幂等的。在您的情况下,迁移任务不是。
为什么?因为您正在尝试使用基础设施即代码工具来部署新容器。该责任是 CI/CD 管道的一部分,需要等待每个步骤正确执行,并且需要确保从当前部署顺利过渡到下一个部署。
Terraform 执行的 API 存在限制。当与 ECS 一起使用时,AWS 隐藏了部分复杂性,而
aws_ecs_service
资源也延续了这一点。如果 Terraform 执行完全幂等,则任务定义的版本号应始终相同。
另一方面,可以使用 Terraform 描述 AWS CodeBuild 管道或 Github 工作流程。因此可以构建 CI/CD 管道,但不能使用 Terraform 来执行它。