【发布时间】:2019-07-14 11:30:53
【问题描述】:
我是 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 类型的数据源和资源?
【问题讨论】:
-
资源创建它,数据源检索它。
-
在上面的示例中,没有理由同时使用
data和resource。我不得不假设您查看的材料是出于教育原因这样做的。我这样做的一个原因是为了 EBS 快照,所以如果有人在控制台中制作了比 Terraform 制作的更新的快照,则在必要时使用最新的快照。 -
@victorm 感谢您的解释,这个顺序是有道理的,我猜这就是
terraform apply第一次执行时的作用。但是当我第二次执行terraform apply时,重新创建资源和数据源检索它的位置是否相同?我之所以这样问,是因为我正在考虑在进行更改后重建 docker 映像,并且想要更新基础架构。 -
@MattSchuchard 感谢您提供示例,我认为这可以说明问题。您能详细解释一下 EBS 快照吗?是这样的吗:使用 Terraform 创建基础设施后,我使用 AWS CodePipeline 链接到我的 github 源代码存储库。一旦我将新代码推送到 github 存储库,就会触发 AWS CodePipeline 并更新任务定义。这会创建 EBS 快照吗?这是否是同时需要数据源和资源的原因?
-
Terraform 是幂等的,当您再次运行它时,除非您对其进行更改,否则不会更新任何内容。读取仍然会发生。请记住,如果您对某些资源进行更改,则会创建一个新资源。我不记得 task_definition 是否是其中之一。如果创建了一个新的,您必须更新您的任务服务以使用新的。
标签: terraform amazon-ecs terraform-provider-aws