[英]terraform to conditionally create ECR repository if not exists
我正在使用 terraform 来部署我的资源。 我有一个 terraform 代码可以在这里创建一个 ECR 存储库:
resource "aws_ecr_repository" "main" {
name = var.repo_name
image_tag_mutability = var.image_tag_mutability
image_scanning_configuration {
scan_on_push = true
}
}
上面的代码工作正常。 但是,如果 ECR 存储库已存在于 AWS 中,则会引发错误。
解决方案,我想使用terraform数据语句来查询仓库是否存在:
data "aws_ecr_repository" "repository" {
name = var.repo_name
}
resource "aws_ecr_repository" "main" {
name = data.aws_ecr_repository.repository.name
image_tag_mutability = var.image_tag_mutability
image_scanning_configuration {
scan_on_push = true
}
}
它抛出这样的错误:
Error: ECR Repository (digital-service) not found
任何建议表示赞赏。
为了将来的参考,您可以使用外部资源数据有条件地检查和创建资源,在我的例子中,我需要在一个存储库中为开发图像创建一个存储库,我使用 docker 提供程序来构建图像并将其推送到该 ecr
主程序
terraform {
required_version = ">= 1.3.0"
# Set the required provider
required_providers {
docker = {
source = "kreuzwerker/docker"
version = "2.15.0"
}
}
}
# Creating a repository in ECR
resource "aws_ecr_repository" "repository" {
count = data.external.check_repo.result.success == "true" ? 0 : 1
name = var.repository_name
force_delete = var.force_delete_repo
}
# Build and Push an image to ECR
resource "docker_registry_image" "image" {
name = length(aws_ecr_repository.repository) > 0 ? "${aws_ecr_repository.repository[0].repository_url}:v${var.image_tag}" : "${data.external.check_repo.result.repository_url}:v${var.image_tag}"
insecure_skip_verify = true
build {
context = var.docker_context_url
dockerfile = var.dockerfile_name
build_args = var.docker_build_args
auth_config {
host_name = var.registry_host_name
user_name = var.registry_user
password = var.registry_token
}
}
}
数据.tf
data "external" "check_repo" {
program = ["/usr/bin/bash", "${path.module}/script.sh", var.repository_name]
}
脚本.sh
#!/bin/bash
result=$(aws ecr describe-repositories --repository-names $1)
if [ $? -eq 0 ]; then
repository_url=$(echo $result | jq -r '.repositories[0].repositoryUri')
repositoryName= $(echo $result | jq -r '.repositories[0].repositoryName')
echo -n "{\"success\":\"true\", \"repository_url\":\"$repository_url\", \"name\":\"$repositoryName\"}"
else
echo -n "{\"success\":\"false\"}"
fi
所以我们在这里做的是检查 aws_ecr_repository 资源的计数是否为 1,这意味着存储库不存在,我们在这里创建它,所以我们使用该资源 output,如果存储库确实存在,那么计数将为 0,并且我们将使用我们在 data.tf 外部数据源中获得的响应中的 url
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.