Terraform:在同一类型上同时使用数据源和资源有什么意义?

时间:2019-02-20 17:21:49

标签: terraform amazon-ecs terraform-provider-aws

我是Terraform的新手,我正在研究一个在AWS上使用Docker / AWS ECR / ECS基础架构的项目。我看到in this post的作者指定类似的内容

data "aws_ecs_task_definition" "test" {
 task_definition = "${aws_ecs_task_definition.test.family}"
 depends_on = ["aws_ecs_task_definition.test"]
}

resource "aws_ecs_task_definition" "test" {
 family = "test-family"
 # ...
}

他为什么在aws_ecs_task_definition上同时使用数据源和资源?经过数小时的研究,我无法找到解释或类似的例子。

稍后我会看到他设置服务时,他使用以下代码引用了两者:(再次,我不确定这里发生了什么事情

task_definition = "${aws_ecs_task_definition.test.family}:${max("${aws_ecs_task_definition.test.revision}", "${data.aws_ecs_task_definition.test.revision}")}"

我现在对使用相同类型的数据和资源与仅使用资源之间的区别感到困惑。生命周期方面有什么不同吗?

我现在正在尝试为我的docker映像创建一个AWS ECR,并且我还希望Terraform对其进行管理(创建/更新/销毁),我也应该同时将数据源和资源都用于类型aws_ecr_repository

1 个答案:

答案 0 :(得分:1)

这很有意义。那个家伙正在使用数据源来获取最新的任务定义修订版。这是因为他可能正在使用其他工具(詹金斯/ circleci)将更改推送到任务定义或修订。

因此,如果他再次运行该代码,则terraform应该选择最新版本并相应地更新ecs服务。

检查以下代码:

resource "aws_ecs_service" "test-ecs-service" {
 name = "test-vz-service"
 cluster = "${aws_ecs_cluster.test-ecs-cluster.id}"
 task_definition = "${aws_ecs_task_definition.test.family}:${max("${aws_ecs_task_definition.test.revision}", "${data.aws_ecs_task_definition.test.revision}")}"
 desired_count = 1
 iam_role = "${aws_iam_role.ecs-service-role.name}"

load_balancer {
 target_group_arn = "${aws_alb_target_group.test.id}"
 container_name = "nginx"
 container_port = "80"
 }

他正在使用最新版本更新服务。他正在使用返回最大值的MAX函数。您可以检查地形插值语法here

如果任务定义不存在,此terraform脚本会创建它吗?

是的,它将根据状态文件中包含的任务定义来创建它。如果您是手动创建的任务定义,则它将增加修订号。

如果任务定义存在并且数据源块已检索到它,资源块会重新创建另一个修订的任务定义,还是什么都不做?

如果资源的任何配置发生更改,则它将创建新的任务定义,并且该任务定义将分配给ecs服务资源,但是如果资源没有更改,则它将不执行任何操作。 / p>

我也不清楚这个terraform脚本是打算只运行一次(初始基础架构创建)还是更改后运行?

这应该在基础架构创建时运行,或者如果您想对任务定义资源进行任何其他更新。