首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >我如何避免创建一个地形资源?

我如何避免创建一个地形资源?
EN

Stack Overflow用户
提问于 2022-02-17 13:51:43
回答 2查看 456关注 0票数 0

我的terraform脚本是为生产中的一个web应用程序建立的。

作为其中的一部分,我启用了Azure DDoS保护。

然而,与其他基础设施相比,这确实是非常昂贵的。

因此,我不想为我的开发环境创建它。

我使用Azure管道运行terraform,因此我希望将管道配置为可选,而不是创建管道。例如,在管道中使用变量

是否有一个选项,我可以传递到terraform,以跳过这个资源?

假设有一个选项,并且我可以跳过ddos资源,如果不存在,那么在下面的代码段中创建vnet会失败吗?

代码语言:javascript
复制
#---------------------------------------
#    DDOS Protection Plan Definition
#---------------------------------------

resource "azurerm_network_ddos_protection_plan" "ddos" {
  name                = var.ddos_plan_name
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name
}

#---------------------------------------
#            vNet Definition
#---------------------------------------

resource "azurerm_virtual_network" "vnet" {

  name                = lower("${local.vNet_id}-${var.location_id}-${var.env_id}-1")
  resource_group_name = azurerm_resource_group.rg.name
  location            = var.location
  address_space       = var.address_space

  ddos_protection_plan {
    id     = azurerm_network_ddos_protection_plan.ddos.id
    enable = true
  }

  depends_on = [
    azurerm_resource_group.rg
  ]
}
EN

回答 2

Stack Overflow用户

发布于 2022-02-17 14:04:36

我的方法是使用count元参数1。例如,创建一个名为create_ddos_protection_plan的变量,将其设置为bool类型,默认情况下将其设置为false

代码语言:javascript
复制
variable "create_ddos_protection_plan" {
  description = "Whether to create DDoS resource or not."
  type = bool
  
  default = false
}

resource "azurerm_network_ddos_protection_plan" "ddos" {
  count               = var.create_ddos_protection_plan ? 1 : 0
  name                = var.ddos_plan_name
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name
}

稍后,如果您决定要创建变量,可以将变量的值设置为true或完全删除count元参数。

如果基于当前设置资源不存在,则vnet创建将失败。

1

票数 2
EN

Stack Overflow用户

发布于 2022-02-18 00:30:34

您可以使用the count meta-argument动态地选择要创建的特定资源的实例数量,包括可能选择创建零实例,从而有效地禁用资源:

代码语言:javascript
复制
variable "enable_ddos_protection" {
  type = bool

  default = true
}

resource "azurerm_network_ddos_protection_plan" "ddos" {
  count = var.enable_ddos_protection ? 1 : 0

  name                = var.ddos_plan_name
  location            = var.location
  resource_group_name = azurerm_resource_group.rg.name
}

由于此资源的实例数量现在是动态的,因此azurerm_network_ddos_protection_plan.ddos将显示为对象列表,而不是单个对象。因此,您还需要更改在虚拟网络配置中引用它的方式。

最直接的声明方法是使用dynamic block告诉Terraform在该资源的每个实例中生成一个ddos_protection_plan块,因此如果没有保护计划实例,就不会出现该类型的块:

代码语言:javascript
复制
resource "azurerm_virtual_network" "vnet" {
  name = lower("${local.vNet_id}-${var.location_id}-${var.env_id}-1")

  resource_group_name = azurerm_resource_group.rg.name
  location            = var.location
  address_space       = var.address_space

  dynamic "ddos_protection_plan" {
    for_each = azurerm_network_ddos_protection_plan.ddos
    content {
      id     = ddos_protection_plan.value.id
      enable = true
    }
  }
}

(我在这里删除了depends_on声明,因为它与resource_group_name参数中的引用是多余的,但是dynamic块是这个示例的主要内容。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/71159410

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档