如何在不危及其内容的情况下在 Terraform 中声明和引用 ECR 存储库?

Col*_*ean 1 docker terraform aws-ecs aws-ecr terraform-provider-aws

我正在构建 Terraform 配置以将一些容器部署到 AWS ECS。显然,我必须将 Docker 镜像推送到 ECR。我在 ECR 中创建了一个存储库并推送了图像。

现在我正在自动化。如果我这样声明aws_ecr_repository

data "aws_ecr_repository" "service" {
  name = "myrepository"
}
Run Code Online (Sandbox Code Playgroud)

然后 Terraform 将管理它。我最终可以用类似的东西来引用它

image = "${aws_ecr_repository.myrepository.repository_url}"
Run Code Online (Sandbox Code Playgroud)

在构建 ECS 任务定义的过程中。

我的印象是,当我terraform destroy作为开发周期的一部分运行时,Terraform 会删除这个存储库——或者当它有图像时会失败。这会很糟糕,因为terraform destroy要么永远不会完成,要么我必须清除 ECR 存储库才能成功完成该命令。

如何最好地引用已经存在但我似乎不希望 Terraform 管理的 ECR 存储库,因为 Terraform 可能会破坏位于 Terraform 之外的数据,即发布 CI 作业上传的 Docker 图像?

Bra*_*ler 6

如果您不想让 Terraform 管理它,请使用数据源。这可以让你得到这样的数据:

data "aws_ecr_repository" "example" {
  name = "example"
}
Run Code Online (Sandbox Code Playgroud)

然后引用如下网址:

${data.aws_ecr_repository.example.repository_url}
Run Code Online (Sandbox Code Playgroud)

  • 如果您使用的是 `data` 源而不是 `resource`,则它不受管理。验证您没有在任何地方定义“资源“aws_ecr_repository”。您的第二个代码块表明您正在引用资源而不是数据源,即使您的第一个代码块说它是一个数据源。检查代码中的另一个。 (4认同)