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

Terraform 地形:什么';在同一类型上同时使用数据源和资源有什么意义?,terraform,amazon-ecs,terraform-provider-aws,Terraform,Amazon Ecs,Terraform Provider Aws,我是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_defin

我是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\u ecs\u task\u 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存储库类型的数据源和资源?,这是有意义的。这家伙正在使用数据源获取最新的任务定义修订版。这是因为他可能正在使用其他工具(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"
 }
他正在用最新版本更新服务。他正在使用返回最大值的MAX函数。您可以检查地形插值语法

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

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

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

如果资源的任何配置发生变化,则会创建新的任务定义,并将该任务定义分配给ecs服务资源,但如果资源没有变化,则不会执行任何操作

我也不清楚这个terraform脚本是只运行一次(初始infra创建)还是在更改后运行?


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

资源创建任务定义资源,数据源检索任务定义资源。在上面的示例中,没有理由同时使用
数据
资源
。我不得不假设你看的材料是出于教育原因。我这样做的一个原因是为了EBS快照,因此,如果有人在控制台中创建了比Terraform更新的快照,则在必要时会使用最新的快照。@victorm感谢您的解释,这个顺序是有意义的,我想这就是第一次执行
Terraform apply
时的结果。但是,当我第二次执行
terraformapply
时,在重新创建资源和数据源检索资源的位置会是相同的吗?我这样问是因为我正在考虑在做出更改后重建docker映像,并希望更新基础设施。@MattSchuchard感谢您提供的示例,我认为这澄清了问题。你能解释更多关于EBS快照的信息吗?是这样的:在我用Terraform创建基础设施之后,我使用AWS代码管道链接到我的github源代码repo。一旦我将新代码推送到github repo,就会触发AWS代码管道并更新任务定义。这会创建一个EBS快照吗?这就是为什么需要数据源和资源的原因吗?Terraform是幂等的,当您第二次运行它时,除非您对它进行更改,否则不会更新任何内容。阅读仍然会发生。请记住,有些资源如果进行更改,就会创建一个新资源。我记不起任务定义是否是其中之一。如果创建了一个新任务,您必须更新您的任务服务才能使用新任务。感谢您指出,这解决了我的许多困惑。我想我仍然不清楚的是,如果任务定义不存在,这个terraform脚本会创建它吗?如果任务定义存在并且数据源块检索到它,资源块会重新创建另一个修改过的任务定义,还是什么都不做?我也不清楚这个terraform脚本是只运行一次(初始infra创建)还是在更改后运行?我已经更新了答案,解决了所有问题。