如何确保aws_ecr_repository资源在已存在时使用现有的存储库

72次阅读
没有评论

问题描述

在使用Terraform设置ECR存储库、策略和生命周期策略的代码时,遇到了一个问题。代码可以正常运行,但是在后续运行时会出现错误,显示存储库已存在。用户希望在存储库已存在时,Terraform不会尝试重新创建存储库。用户已经尝试过使用数据块来检查存储库是否存在,并在资源上添加depends_on属性,但没有成功。

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Terraform的terraform {...}部分,你需要添加一个后端指令来存储你的状态文件。使用S3后端可能是最简单的方法,也是存储远程状态的最常用方法之一。以下是一个示例配置:

terraform {
  backend "s3" {
    bucket = "mybucket"
    key    = "path/to/my/key"
    region = "us-east-1"
  }
}

请注意,Terraform的init命令不会将现有资源导入状态文件中(可以使用terraform import命令导入)。因此,它会尝试创建新的资源,导致名称冲突。Terraform文档提供了一些关于如何在自动化中使用Terraform的指导,其中包括使用远程状态。

配置好远程后端后,你可以在流水线中使用terraform state命令来验证一切是否按预期工作。建议使用show子命令来查看你期望存在的资源,以验证状态文件中是否包含该资源:

terraform init -input=false
terraform state show module.name-of-your-module.aws_ecr_repository.frontend_ecr_repo_creation

方案2

使用数据块来检查存储库是否存在,并在资源上添加count属性可能会感觉像一个hack。
你可以使用数据块来检查存储库是否已存在,并在资源上添加count属性来控制是否创建资源。以下是一个示例:

data "aws_ecr_repository" "existing_repo" {
  name = "${var.app_image}"
}

resource "aws_ecr_repository" "frontend_ecr_repo_creation" {
  count    = "${data.aws_ecr_repository.existing_repo.id ? 0 : 1}"
  name     = "${var.app_image}"
  # 其他资源配置
}

在上面的示例中,我们使用data块来检查存储库是否已存在。如果存储库已存在,则data.aws_ecr_repository.existing_repo.id将返回一个非空值,否则返回空值。然后,我们使用count属性来控制是否创建资源。如果存储库已存在,count属性将为0,资源将不会被创建。

请注意,这种方法可能会感觉像一个hack,并且需要确保数据块中的查询条件正确匹配存储库的名称。

以上是两种解决方案,你可以根据自己的需求选择适合的方法来确保aws_ecr_repository资源在已存在时使用现有的存储库。

正文完