Terraform:在同一类型上同时使用数据源和资源有什么意义?
Terraform: What's the point using Both Data Source and Resource on the same type?
我是 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 来管理它 (create/update/destroy),我应该同时使用数据源和资源类型 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"
}
他正在使用最新版本更新服务。他正在使用返回最大值的 MAX 函数。您可以检查地形插值语法,here.
如果任务定义不存在,这个 terraform 脚本会创建它吗?
是的,它将根据状态文件中的任务定义创建它。如果您手动创建了任务定义,那么它将增加修订号。
如果任务定义存在并且数据源块检索到它,资源块会重新创建另一个修改后的任务定义,还是什么都不做?
如果资源的任何配置发生变化,那么它将创建新的任务定义,并且该任务定义将分配给 ecs 服务资源,但如果资源没有变化,那么它将什么都不做.
我也不清楚这个 terraform 脚本是打算 运行 仅一次(初始基础设施创建)还是在更改时?
这应该是 运行 在创建基础设施时或者如果您想对任务定义资源进行任何其他更新。
我是 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 来管理它 (create/update/destroy),我应该同时使用数据源和资源类型 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"
}
他正在使用最新版本更新服务。他正在使用返回最大值的 MAX 函数。您可以检查地形插值语法,here.
如果任务定义不存在,这个 terraform 脚本会创建它吗?
是的,它将根据状态文件中的任务定义创建它。如果您手动创建了任务定义,那么它将增加修订号。
如果任务定义存在并且数据源块检索到它,资源块会重新创建另一个修改后的任务定义,还是什么都不做?
如果资源的任何配置发生变化,那么它将创建新的任务定义,并且该任务定义将分配给 ecs 服务资源,但如果资源没有变化,那么它将什么都不做.
我也不清楚这个 terraform 脚本是打算 运行 仅一次(初始基础设施创建)还是在更改时?
这应该是 运行 在创建基础设施时或者如果您想对任务定义资源进行任何其他更新。