繁体   English   中英

terraform 如果不存在则有条件地创建 ECR 存储库

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM