我是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脚本是否仅打算仅运行一次(初始创建)还是更改?
这应该在基因创建时运行,或者如果您想对任务定义资源进行任何其他更新。