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

Sha*_*eng 6 amazon-ecs terraform 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_definition" "test" {
 family = "test-family"
 # ...
}

Run Code Online (Sandbox Code Playgroud)

为什么他同时使用数据源和资源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

Eth*_*hit 5

这说得通。这个人正在使用数据源来获取最新的任务定义修订版。这是因为他可能正在使用其他一些工具(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"
 }
Run Code Online (Sandbox Code Playgroud)

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

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

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

如果任务定义存在并且数据源块检索到它,资源块是否会重新创建另一个修改后的任务定义,或者什么也不做?

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

我还不清楚这个 terraform 脚本是否只打算运行一次(初始基础设施创建)还是在更改时运行?

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