在一个解决方案中有 2 个项目。 common-infra 项目用于创建 ecs 集群和通用 ecs 服务,如所有其他服务使用的 nginx。 ecs-service1 项目包含用于创建 ecs 服务的资源定义。我在我的 ecs-service1 项目中引用了在 common-infra 项目中创建的资源 ARN。
我首先去common-infra并进行terraforma计划和创建。现在集群和 nginx 服务已启动并运行。接下来,我转到 ecs-service1,然后转到 terraform plan。此时,它识别出我已链接到一个模块 common-infra 的事实,并表明它将再次像 nginx 一样创建集群和通用服务。
有没有办法以这样的方式安排/引用项目,当我运行 terrafrom plan ecs-service1 时,它知道 common-infra 已经构建并且它知道状态并且它只在 ecs 中创建资源- services1 并且只提取在 common-infra 中创建的 ARN 引用?
.
├── ecs-service1
│ ├── main.tf
│ ├── task-def
│ │ ├── adt-api-staging2-task-definition.json
│ │ └── adt-frontend-staging2-task-definition.json
│ ├── terraform.tfstate
│ ├── terraform.tfstate.backup
│ └── variables.tf
├── common-infra
│ ├── main.tf
│ ├── task-def
│ │ └── my-nginx-staging2-task-definition.json
│ ├── terraform.tfstate
│ ├── user-data.sh
│ └── variables.tf
└── script
└── get-taskdefinitions.sh
common-infra main.tf
output "splat_lb_listener_http_80_arn"{
value = aws_lb_listener.http_80.arn
}
output "splat_lb_listener_http_8080_arn"{
value = aws_lb_listener.http_8080.arn
}
output "splat_ecs_cluster_arn" {
value = aws_ecs_cluster.ecs_cluster.arn
}
ecs-service1 main.tf
module "splat_common" {
source = "../common-infa"
}
resource "aws_ecs_service" "frontend_webapp_service" {
name = var.frontend_services["service_name"]
cluster = module.splat_common.splat_ecs_cluster_arn
...
}
答案 0 :(得分:0)
有几个解决方案,但首先我想说您的 ecs-service
应该只将 common-infra
作为一个模块调用 - 这样所有的资源创建都会被一次性处理(并且不像你描述的那样分裂)。
另一种解决方案是使用 terraform import
将当前状态放入您现有的 terraform 中。这不太理想,因为现在您拥有由 2 个状态文件管理的相同基础架构。
如果您包含 common-infra
是因为它提供了一些输出,您应该考虑使用 data
查找 (https://www.terraform.io/docs/language/data-sources/index.html)。您甚至可以参考其他 terraform 状态 (https://www.terraform.io/docs/language/state/remote-state-data.html) 的输出(虽然我从未真正尝试过,但它可以完成)。