问题描述
在使用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资源在已存在时使用现有的存储库。