【问题标题】:How Can I Remove Demo Products From APIM Created With Terraform?如何从使用 Terraform 创建的 APIM 中删除演示产品?
【发布时间】:2019-08-16 20:11:51
【问题描述】:

我创建我的 API 管理实例并使用 Terraform 导入 Swagger API,如下所示:

#Create the API Management layer
resource "azurerm_api_management" "apim" {
  name                = "${var.prefix}-apim"
  resource_group_name = var.resource_group_name
  location            = var.resource_group_location

  sku {
    name     = "Developer"
    capacity = 1
  }
}

resource "azurerm_api_management_api" "swagger" {
  name                = "ensurex-transaction-api"
  resource_group_name = var.resource_group_name
  api_management_name = azurerm_api_management.apim.name
  revision            = "1"
  display_name        = "My API"
  path                = "api"
  protocols           = ["https"]

  import {
    content_format = "swagger-json"
    #TODO: Put this in a better place during build/tests
    content_value = file("../../web/out/test/swagger.json")
  }
}

但是,当我打开开发者页面时,有一个名为“Echo API”的 API 和名为“Starter”和“Unlimited”的产品。

是否有可能一开始就阻止 Terraform 创建这些?

或者是否可以在 Terraform 脚本中添加一些内容以在创建后删除它们?

在 terraform 之后,我的下一步是使用 ansible 对资源进行一些配置,因此我可以接受在那里执行此操作的解决方案。

但是,我不想使用 Powershell 或将 terraform 替换为 ARM 模板。

【问题讨论】:

    标签: terraform azure-api-management


    【解决方案1】:

    似乎无法阻止 terraform 首先创建这些,因为它们是 terraform 使用的 created by the underlying SDK

    不能像doesn't yet support API Management那样直接使用Azure CLI。

    但是,REST API 确实支持它。

    Azure CLI 中有一个模块可让您以跨平台方式call the REST API

    例如

    az rest -m delete -u "https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/my-resource-group-name/providers/Microsoft.ApiManagement/service/my-apim-name/apis/echo-api?api-version=2019-01-01"
    

    这比 curl 等解决方案具有优势,因为它会为您处理身份验证。

    另一个关键点是{subscriptionId} 会自动替换为正确的值(假设您使用正确的帐户登录)并且您不必自己查找该值。

    然后可以使用 local-execnull-resource 将这些命令嵌入到 terraform 中。

    # Create a resource group
    resource "azurerm_resource_group" "resource-group" {
      name     = "${var.prefix}_rg"
      location = var.resource_group_location
    
      tags = var.tags
    }
    resource "azurerm_api_management" "apim" {
      name                = "${var.prefix}-apim"
      resource_group_name = azurerm_resource_group.resource-group.name
      location            = var.resource_group_location
    
      sku {
        name     = "Developer"
        capacity = 1
      }
    }
    
    resource "null_resource" "clean-apim-api" {
      provisioner "local-exec" {
        command = "az rest -m delete -u \"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/${azurerm_resource_group.resource-group.name}/providers/Microsoft.ApiManagement/service/${azurerm_api_management.apim.name}/apis/echo-api?api-version=2019-01-01\""
      }
      depends_on = ["azurerm_api_management.apim"]
    }
    
    resource "null_resource" "clean-apim-product-starter" {
      provisioner "local-exec" {
        command = "az rest -m delete -u \"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/${azurerm_resource_group.resource-group.name}/providers/Microsoft.ApiManagement/service/${azurerm_api_management.apim.name}/products/Starter?api-version=2019-01-01\""
      }
      depends_on = ["azurerm_api_management.apim"]
    }
    
    resource "null_resource" "clean-apim-product-unlimited" {
      provisioner "local-exec" {
        command = "az rest -m delete -u \"https://management.azure.com/subscriptions/{subscriptionId}/resourceGroups/${azurerm_resource_group.resource-group.name}/providers/Microsoft.ApiManagement/service/${azurerm_api_management.apim.name}/products/Unlimited?api-version=2019-01-01\""
      }
      depends_on = ["azurerm_api_management.apim"]
    }
    

    【讨论】:

    • subscriptionId 引用前面缺少 $。此外,如果不删除它们默认绑定的订阅,则无法删除产品。除此之外,谢谢,我需要这个。
    【解决方案2】:

    使用 az v2.12 添加以下内容:

    resource "null_resource" "clean_api_echo" {
      provisioner "local-exec" {
        command     = "az apim api delete --api-id echo-api --subscription ${var.subscription_id} -g ${azurerm_resource_group.rg.name} -n ${local.apim_name} -y"
        interpreter = ["PowerShell", "-Command"]
      }
      
      depends_on = [
        module.api_manager_api
      ]
    }
    
    resource "null_resource" "clean_product_starter" {
      provisioner "local-exec" {
        command     = "az apim product delete --product-id starter --subscription ${var.subscription_id} -g ${azurerm_resource_group.rg.name} -n ${local.apim_name} --delete-subscriptions true -y"
        interpreter = ["PowerShell", "-Command"]
      }
    
      depends_on = [
        module.api_manager_api
      ]
    }
    
    resource "null_resource" "clean_product_unlimited" {
      provisioner "local-exec" {
        command     = "az apim product delete --product-id unlimited --subscription ${var.subscription_id} -g ${azurerm_resource_group.rg.name} -n ${local.apim_name} --delete-subscriptions true -y"
        interpreter = ["PowerShell", "-Command"]
      }
    
      depends_on = [
        module.api_manager_api
      ]
    }
    

    注意:根据你的变量名修改。

    【讨论】:

      猜你喜欢
      • 2015-03-31
      • 2016-01-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-11-19
      相关资源
      最近更新 更多