Как я могу удалить демонстрационные продукты из APIM, созданного с помощью Terraform?

Я создаю свой экземпляр управления API и импортирую Swagger API с Terraform следующим образом:

#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")
  }
}

Однако, когда я открываю страницу разработчика, есть api под названием «Echo API» и продукты под названием «Starter» и «Unlimited».

Можно ли вообще предотвратить их создание Terraform?

Или можно что-то добавить в скрипт Terraform, чтобы удалить их после того, как они были созданы?

Мой следующий шаг после terraform - это некоторая настройка ресурсов с помощью ansible, поэтому я в порядке с решением, которое делает это там.

Однако я не хочу использовать Powershell или заменять terraform шаблоном ARM.


person opticyclic    schedule 16.08.2019    source источник


Ответы (2)


Похоже, что невозможно предотвратить их создание в terraform, поскольку они созданный базовым SDK, который использует terraform.

Невозможно напрямую использовать Azure CLI, поскольку он еще не поддерживает управление API < / а>.

Однако REST API поддерживает его.

В интерфейсе командной строки Azure есть модуль, который позволяет вызывать REST API межплатформенным способом.

e.g.

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} автоматически заменяется на вас правильным значением (при условии, что вы вошли в систему с правильной учетной записью), и вам не нужно искать значение самостоятельно.

Затем эти команды можно встроить в terraform с помощью local-exec с нулевой ресурс.

# 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"]
}
person opticyclic    schedule 22.08.2019
comment
Перед ссылками на subscriptionId отсутствует символ $. Кроме того, вы не можете удалить продукты, не удалив подписки, к которым они привязаны по умолчанию. Кроме этого, спасибо, мне это было нужно. - person asmodai; 14.10.2019

Используя 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
  ]
}

Примечание: измените в соответствии с вашими именами переменных.

person cuasijoe    schedule 10.10.2020