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



我是Terraform的新手,我正在研究一个在AWS上使用Docker/AWS ECR/ECS基础架构的项目。我在这篇文章中看到了作者指定

之类的内容
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}")}"

我现在对同时使用数据和amp之间有什么区别感到困惑;相同类型的资源,而仅使用资源。生命周期有什么区别吗?

我现在正在尝试为我的Docker映像创建AWS ECR,并且我希望Terraform对其进行管理(创建/更新/破坏),如果我同时使用数据源&aws_ecr_repository类型的资源?

这很有意义。这个人正在使用数据源来获取最新的任务定义修订。这是因为他可能正在使用其他一些工具(Jenkins/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"
 }

他正在使用最新的修订更新服务。他使用的是返回最大值的最大函数。您可以在此处检查Terraform插值语法。

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

是的,它将相对于其状态文件中的任务定义创建它。如果您手动创建了任务定义,则它将增加修订号。

如果任务定义存在并且数据源块检索它,资源块是否会重新创建另一个修订的任务定义,或者它无能为力?

如果资源的任何配置都有更改,则它将创建新的任务定义,并且该任务定义将分配给ECS服务资源,但是如果资源没有更改,则它将无能为力。<<<<。/p>

我也不清楚此Terraform脚本是否仅打算仅运行一次(初始创建)还是更改?

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

最新更新