Я пытаюсь создать частную конечную точку с помощью 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"
}
Я это запустил, думаю, отсюда и статус ожидания. отдам как-нибудь и проверю позже
Можете попробовать воспользоваться опцией skip_provider_registration = true
? Если установлено значение true, Terraform пропустит проверку регистрации провайдера и запустится без нее.
Регистрация провайдера
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
, удалите блок функций с этого ресурса.
Развертывание:
Ссылаться:
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" "пример" { │`
если я запускаю функцию az show --namespace Microsoft.Network --name PrivateEndpoints, статус не меняется с ожидания @Vinay B
откройте портал и отмените регистрацию Microsoft.Network один раз по подписке, и как только все будет готово, попробуйте еще раз тот же код и убедитесь, что вы используете depend_on для модулей, связанных с сетью, как я упоминал в конфигурации @NicholasNamacha
сверьтесь с упомянутым примечанием для четкого понимания изменений конфигурации. Надеюсь, это решение поможет вам @NicholasNamacha
Чтобы это работало, мне пришлось включить область частной ссылки 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
}
вы пытались использовать принудительную регистрацию функций @NicholasNamacha, так как регистрация занимает много времени, попробуйте использовать az Feature Register --namespace Microsoft.Network --name AllowPrivateEndpoints