Не удалось создать azurerm_private_endpoint, получая непредвиденный статус ошибки 400 (400 неверный запрос) с ошибкой: SubscriptionNotRegisteredForFeature:

Я пытаюсь создать частную конечную точку с помощью terraform и получаю сообщение об ошибке. Что мне может не хватать? Что мне кажется интересным, так это то, что в той же подписке есть ресурсы частных конечных точек.

Ошибка: создание частной конечной точки (подписка: «***» выполнение CreateOrUpdate: неожиданный статус 400 (400 неверный запрос) с ошибкой: SubscriptionNotRegisteredForFeature: подписка /subscriptions//resourceGroups//providers/Microsoft.Network/subscriptions/ не зарегистрирована для функции Microsoft.Network/AllowPrivateEndpoints, необходимой для выполнения запрошенной операции. │ │ с помощью модуля.azurerm_private_endpoint.azurerm_private_endpoint.main, │ в строке 1 ../../factory/private-endpoint/main.tf в ресурсе «azurerm_private_endpoint» «main»: │ 1: ресурс «azurerm_private_endpoint» «main» {

main.tf

locals {
  team_name  = "devops"
  stack_name = "devops"

  location_abbreviations = { # map of location abbreviations according to naming conventions
    "southafricanorth" = "san"
    "westeurope"       = "euw"

  }
  resource_group_name = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-rg-001"


  tags = { # list of tags
    env        = var.environment
    managed_by = "terraform"
    team       = local.team_name
  }
}


data "azurerm_client_config" "current" {}

data "terraform_remote_state" "platform" {
  backend = "azurerm"

  config = {
    subscription_id      = "********"
    resource_group_name  = "******"
    storage_account_name = "******"
    container_name       = "platform"
    key                  = "${var.environment}.tfstate"
  }
}


module "azurerm_resource_group" {
  source                  = "../../factory/resource-group"
  resource_group_name     = local.resource_group_name
  resource_group_location = var.location

}

module "azurerm_application_insights" {

  source                       = "../../factory/application-insights"
  app_insights_name            = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-ai-001"
  location                     = var.location
  resource_group_name          = local.resource_group_name
  application_type             = "web"
  log_analytics_workspace_name = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-logwkspace-001"
  tags                         = local.tags
  # Disable IP masking (captures the actual client IP address)
  disable_ip_masking = true
}

module "azurerm_private_endpoint" {
  source                                                    = "../../factory/private-endpoint"
  name                                                      = "${local.location_abbreviations[var.location]}-${var.environment}-lulapay-appInsight-endpoint-001"
  location                                                  = var.location
  resource_group_name                                       = local.resource_group_name
  subnet_id                                                 = data.terraform_remote_state.platform.outputs.private_endpoints_subnet_id
  private_service_connection_name                           = "app-insights-privatelink-dns-zones"
  private_service_connection_is_manual_connection           = false
  private_service_connection_private_connection_resource_id = module.azurerm_application_insights.id
  tags                                                      = local.tags
  private_dns_zone_group_name                               = "application-insights-private-dns-zones"
  private_dns_zone_group_name_private_dns_zone_ids          = [data.terraform_remote_state.platform.outputs.app_insights_privatelink_dns_zone_id]


}

# DNS A Record for Application Insights
resource "azurerm_private_dns_a_record" "example" {
  name                = "lulapay-app-insight-privatelink"
  zone_name           = split("/", trim(data.terraform_remote_state.platform.outputs.app_insights_privatelink_dns_zone_id, "/"))[7]
  resource_group_name = local.resource_group_name
  records             = [module.azurerm_private_endpoint.private_ip]
  ttl                 = 10
}
   

Модуль

resource "azurerm_private_endpoint" "main" {


  # define endpoint name based on app service name
  name                = var.name
  resource_group_name = var.resource_group_name
  location            = var.location
  subnet_id           = var.subnet_id
  tags                = var.tags
  
   private_dns_zone_group {
    name = var.private_dns_zone_group_name
    private_dns_zone_ids = var.private_dns_zone_group_name_private_dns_zone_ids
  }
  private_service_connection {
    name                           = var.private_service_connection_name
    private_connection_resource_id = var.private_service_connection_private_connection_resource_id
    is_manual_connection           = var.private_service_connection_is_manual_connection
    

  }
}

Когда проверка, функция все еще находится в ожидании

$ az Feature show --namespace Microsoft.Network --name AllowPrivateEndpoints

{
  "id": "/subscriptions/*********/providers/Microsoft.Features/providers/Microsoft.Network/features/AllowPrivateEndpoints",
  "name": "Microsoft.Network/AllowPrivateEndpoints",
  "properties": {
    "state": ***"Pending"***
  },
  "type": "Microsoft.Features/providers/features"
}

вы пытались использовать принудительную регистрацию функций @NicholasNamacha, так как регистрация занимает много времени, попробуйте использовать az Feature Register --namespace Microsoft.Network --name AllowPrivateEndpoints

Vinay B 26.08.2024 14:26

Я это запустил, думаю, отсюда и статус ожидания. отдам как-нибудь и проверю позже

Nicholas Namacha 26.08.2024 14:38

Можете попробовать воспользоваться опцией skip_provider_registration = true? Если установлено значение true, Terraform пропустит проверку регистрации провайдера и запустится без нее.

Venkat V 26.08.2024 14:42
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
3
50
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Регистрация провайдера Microsoft.Network в подписке с помощью terraform.

Блокировщик упомянул неожиданный статус 400 (400 Bad Request) с ошибкой: всплывающие окна SubscriptionNotRegisteredForFeature, когда регистрация поставщика определенной услуги не перерегистрируется под этой подпиской.

Поскольку упомянутая команда

$ az feature show --namespace Microsoft.Network --name AllowPrivateEndpoints

Результаты в ожидании регистрации, она не работает должным образом.

Когда я использую skip_provider_registration = true, он все равно показывает ошибку с упоминанием об отсутствии регистрации.

Согласно последней документации terraform, мы можем зарегистрировать необходимых поставщиков, у которых нет разрешения. Это приведет к перерегистрации провайдера без потери каких-либо соответствующих разрешений.

Я попытался создать демонстрационную частную конечную точку с включенной функцией Microsoft.Network, связанной с частной конечной точкой, с этой конфигурацией, которая обеспечит регистрационную часть провайдера и создаст частную конечную точку без каких-либо проблем.

Конфигурация:


provider "azurerm" {
  features {}
 skip_provider_registration = true
}

resource "azurerm_resource_provider_registration" "example" {
  name = "Microsoft.Network"

   feature {
    name       = "AllowPrivateEndpoints"
    registered = true
  }
}

resource "azurerm_resource_group" "example" {
  name     = "vinays-rg"
  location = "West Europe"
}

resource "azurerm_virtual_network" "example" {
  name                = "vinay-network"
  address_space       = ["10.0.0.0/16"]
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  depends_on = [ azurerm_resource_provider_registration.example ]
}

resource "azurerm_subnet" "service" {
  name                 = "service"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.1.0/24"]
  private_link_service_network_policies_enabled = false
  
}

resource "azurerm_subnet" "endpoint" {
  name                 = "vinay-endpoint"
  resource_group_name  = azurerm_resource_group.example.name
  virtual_network_name = azurerm_virtual_network.example.name
  address_prefixes     = ["10.0.2.0/24"]

}

resource "azurerm_public_ip" "example" {
  name                = "vinay-pip"
  sku                 = "Standard"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  allocation_method   = "Static"

  depends_on = [ azurerm_resource_provider_registration.example ]
}

resource "azurerm_lb" "example" {
  name                = "vinay-lb"
  sku                 = "Standard"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  frontend_ip_configuration {
    name                 = azurerm_public_ip.example.name
    public_ip_address_id = azurerm_public_ip.example.id
  }
}

resource "azurerm_private_link_service" "example" {
  name                = "cvvprivatelink"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name

  nat_ip_configuration {
    name      = azurerm_public_ip.example.name
    primary   = true
    subnet_id = azurerm_subnet.service.id
  }

  load_balancer_frontend_ip_configuration_ids = [
    azurerm_lb.example.frontend_ip_configuration[0].id,
  ]
}

resource "azurerm_private_endpoint" "example" {
  name                = "provk-endpoint"
  location            = azurerm_resource_group.example.location
  resource_group_name = azurerm_resource_group.example.name
  subnet_id           = azurerm_subnet.endpoint.id

  private_service_connection {
    name                           = "vinay-privateserviceconnection"
    private_connection_resource_id = azurerm_private_link_service.example.id
    is_manual_connection           = false
  }
}

Примечание:

Если требуется включить функцию, используйте ее, которой я поделился. Если вы хотите перерегистрировать Microsoft.Network, удалите блок функций с этого ресурса.

Развертывание:

Ссылаться:

https://registry.terraform.io/providers/hashicorp/azurerm/latest/docs/resources/resource_provider_registration

azurerm_private_endpoint | Ресурсы | хашикорп/азурерм | Терраформировать | Реестр Терраформ

Получаю сообщение `Ошибка: применение функций для поставщика подписки (подписка: "a80c9dae-92b6-4da6-8e27-3c2c414767df" │ имя поставщика: "Microsoft.Network"): Функция (подписка: "******" │ имя поставщика) : «Microsoft.Network» │ Имя функции: «AllowPrivateEndpoints»), требующей одобрения вручную, не должно управляться terraform │ │ с помощью azurerm_resource_provider_registration.example, │ в строке main.tf 36, в ресурсе «azurerm_resource_provider_registration» «example»: │ 36 : ресурс "azurerm_resource_provider_registration" "пример" { │`

Nicholas Namacha 27.08.2024 13:04

если я запускаю функцию az show --namespace Microsoft.Network --name PrivateEndpoints, статус не меняется с ожидания @Vinay B

Nicholas Namacha 27.08.2024 13:05

откройте портал и отмените регистрацию Microsoft.Network один раз по подписке, и как только все будет готово, попробуйте еще раз тот же код и убедитесь, что вы используете depend_on для модулей, связанных с сетью, как я упоминал в конфигурации @NicholasNamacha

Vinay B 27.08.2024 13:06

сверьтесь с упомянутым примечанием для четкого понимания изменений конфигурации. Надеюсь, это решение поможет вам @NicholasNamacha

Vinay B 27.08.2024 18:58
Ответ принят как подходящий

Чтобы это работало, мне пришлось включить область частной ссылки Azure Monitor. Затем свяжите с ним частную конечную точку, и все заработает.

module "azurerm_application_insights" {

  source                       = "../../factory/application-insights"
  app_insights_name            = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-ai-001"
  location                     = var.location
  resource_group_name          = local.resource_group_name
  application_type             = "web"
  log_analytics_workspace_name = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-logwkspace-001"
  tags                         = local.tags
  # Disable IP masking (captures the actual client IP address)
  disable_ip_masking = true
}

resource "azurerm_monitor_private_link_scope" "lulapay-ampls" {
  name                = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-ampls-endpoint-001"
  resource_group_name = local.resource_group_name
}

resource "azurerm_monitor_private_link_scoped_service" "lulapay-ampls-scoped" {
  name                = "${local.location_abbreviations[var.location]}-${var.environment}-${local.team_name}-amplsservice-001"
  resource_group_name = local.resource_group_name
  scope_name          = azurerm_monitor_private_link_scope.lulapay-ampls.name
  linked_resource_id  = module.azurerm_application_insights.id
}


module "azurerm_private_endpoint" {
  source                                                    = "../../factory/private-endpoint"
  name                                                      = "${local.location_abbreviations[var.location]}-${var.environment}-lulapay-appInsight-endpoint-001"
  location                                                  = var.location
  resource_group_name                                       = local.resource_group_name
  subnet_id                                                 = data.terraform_remote_state.platform.outputs.private_endpoints_subnet_id
  private_service_connection_name                           = "app-insights-privatelink-dns-zones"
  private_service_connection_is_manual_connection           = false
  private_service_connection_private_connection_resource_id = azurerm_monitor_private_link_scope.lulapay-ampls.id
  private_service_connection_subresource_names              = ["azuremonitor"]
  tags                                                      = local.tags
  private_dns_zone_group_name                               = "application-insights-private-dns-zones"
  private_dns_zone_group_name_private_dns_zone_ids          = [data.terraform_remote_state.platform.outputs.app_insights_privatelink_dns_zone_id]

}


resource "azurerm_private_dns_zone" "example" {
  name                = "privatelink.applicationinsights.azure.com"
  resource_group_name = "san-dev-lulapay-rg-001"
}

# DNS A Record for Application Insights
resource "azurerm_private_dns_a_record" "example" {
  name                = "lulapay-app-insight-privatelink"
  zone_name           = split("/", trim(azurerm_private_dns_zone.example.id, "/"))[7]
  resource_group_name = local.resource_group_name
  records             = [module.azurerm_private_endpoint.private_ip]
  ttl                 = 10
}

Другие вопросы по теме