我是 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 来管理它(创建/更新/销毁),我是否应该同时使用数据源和资源类型
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 函数。您可以检查 terraform 插值语法,here .
如果任务定义不存在,这个 terraform 脚本会创建它吗?
是的,它将根据它在状态文件中的任务定义创建它。如果您手动创建了任务定义,那么它将增加修订号。
如果任务定义存在并且数据源块检索到它,资源块会重新创建另一个修改后的任务定义,还是什么都不做?
如果资源的任何配置发生更改,则它将创建新的任务定义,并且该任务定义将分配给 ecs 服务资源,但如果资源没有更改,则它将什么也不做。
我也不清楚这个 terraform 脚本是打算只运行一次(初始基础设施创建)还是在更改时运行?
这应该在创建基础设施时运行,或者如果您想对任务定义资源进行任何其他更新。
关于Terraform:在同一类型上同时使用数据源和资源有什么意义?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54792048/