在引用一个项目的输出和另一个项目中的公共资源时如何防止在 terraform 中创建资源

时间:2021-07-12 07:48:07

标签: terraform

在一个解决方案中有 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 
...
}

1 个答案:

答案 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) 的输出(虽然我从未真正尝试过,但它可以完成)。

相关问题