Ошибка создания учетной записи Terraform при поддержке Azure

У меня внезапно и неожиданно возникла следующая ошибка при выполнении terraform plan.

Error: Error building account: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error retrieving running Azure CLI: Unable to encode the output with ANSI_X3.4-1968 encoding. U
nsupported characters are discarded.

  on main.tf line 4, in provider "azurerm":
   4: provider "azurerm" {

Ошибка журнала рядом выглядит так:

2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Testing if Service Principal / Client Certificate is applicable for Authentication..
2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Testing if Multi Tenant Service Principal / Client Secret is applicable for Authentication..
2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Testing if Service Principal / Client Secret is applicable for Authentication..
2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Testing if Managed Service Identity is applicable for Authentication..
2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Testing if Obtaining a token from the Azure CLI is applicable for Authentication..
2020-04-14T10:22:53.257Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: Using Obtaining a token from the Azure CLI for Authentication
2020-04-14T10:22:53.258Z [DEBUG] plugin.terraform-provider-azurerm_v2.5.0_x5: [DEBUG] Resource "https://management.core.windows.net/" isn't for the correct Tenant
2020/04/14 10:22:54 [ERROR] <root>: eval: *terraform.EvalConfigProvider, err: Error building account: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error retrieving running
 Azure CLI: Unable to encode the output with ANSI_X3.4-1968 encoding. Unsupported characters are discarded.
2020/04/14 10:22:54 [ERROR] <root>: eval: *terraform.EvalSequence, err: Error building account: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error retrieving running Azure
 CLI: Unable to encode the output with ANSI_X3.4-1968 encoding. Unsupported characters are discarded.
2020/04/14 10:22:54 [ERROR] <root>: eval: *terraform.EvalOpFilter, err: Error building account: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error retrieving running Azure
 CLI: Unable to encode the output with ANSI_X3.4-1968 encoding. Unsupported characters are discarded.
2020/04/14 10:22:54 [ERROR] <root>: eval: *terraform.EvalSequence, err: Error building account: Error getting authenticated object ID: Error parsing json result from the Azure CLI: Error retrieving running Azure
 CLI: Unable to encode the output with ANSI_X3.4-1968 encoding. Unsupported characters are discarded.
2020/04/14 10:22:54 [TRACE] [walkRefresh] Exiting eval tree: provider.azurerm
2020/04/14 10:22:54 [TRACE] vertex "provider.azurerm": visit complete
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_mongo_database.cupi" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_log_analytics_workspace.law-cupi" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_account.cosmodb_account" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_mongo_collection.customer" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_resource_group.rg-cupi" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_log_analytics_solution.las-cupi" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_kubernetes_cluster.aks-cupi" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_mongo_collection.deactivationRequest" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_mongo_collection.customerHash" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "azurerm_cosmosdb_mongo_collection.apiAuth" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "provider.azurerm (close)" errored, so skipping
2020/04/14 10:22:54 [TRACE] dag/walk: upstream of "root" errored, so skipping

и версии моего terraform

$ terraform version
2020/04/14 10:24:24 [INFO] Terraform version: 0.12.24
2020/04/14 10:24:24 [INFO] Go runtime version: go1.12.13
2020/04/14 10:24:24 [INFO] CLI args: []string{"/usr/bin/terraform", "version"}
2020/04/14 10:24:24 [DEBUG] Attempting to open CLI config file: /root/.terraformrc
2020/04/14 10:24:24 [DEBUG] File doesn't exist, but doesn't need to. Ignoring.
2020/04/14 10:24:24 [INFO] CLI command args: []string{"version"}
Terraform v0.12.24
2020/04/14 10:24:24 [DEBUG] checking for provider in "."
2020/04/14 10:24:24 [DEBUG] checking for provider in "/usr/bin"
2020/04/14 10:24:24 [DEBUG] checking for provider in ".terraform/plugins/linux_amd64"
2020/04/14 10:24:24 [DEBUG] found provider "terraform-provider-azuread_v0.8.0_x4"
2020/04/14 10:24:24 [DEBUG] found provider "terraform-provider-azurerm_v2.5.0_x5"
2020/04/14 10:24:24 [DEBUG] found provider "terraform-provider-random_v2.2.1_x4"
2020/04/14 10:24:24 [DEBUG] found valid plugin: "azurerm", "2.5.0", "/cupi/operations/terraform/.terraform/plugins/linux_amd64/terraform-provider-azurerm_v2.5.0_x5"
2020/04/14 10:24:24 [DEBUG] found valid plugin: "random", "2.2.1", "/cupi/operations/terraform/.terraform/plugins/linux_amd64/terraform-provider-random_v2.2.1_x4"
2020/04/14 10:24:24 [DEBUG] found valid plugin: "azuread", "0.8.0", "/cupi/operations/terraform/.terraform/plugins/linux_amd64/terraform-provider-azuread_v0.8.0_x4"
+ provider.azuread v0.8.0
+ provider.azurerm v2.5.0
+ provider.random v2.2.1

и наконец мой az cli

$ az --version
azure-cli                          2.3.1

command-modules-nspkg              2.0.3
core                               2.3.1
nspkg                              3.0.4
telemetry                          1.0.4

Python location '/opt/az/bin/python3'
Extensions directory '/root/.azure/cliextensions'

Python (Linux) 3.6.5 (default, Apr  1 2020, 07:19:45)
[GCC 7.5.0]

Legal docs and information: aka.ms/AzureCliLegal

Мой main.tf файл:

provider "azuread" {
  version = "~>0.8"
}
provider "azurerm" {
  version         = "~>2"
  subscription_id = "..."
  features {}
}
terraform {
  backend "azurerm" {}
}

Я также читал темы ниже. Ничего из этого не помогло и не решило мою проблему. Та же конфигурация, которая не работает сегодня, работала без изменений пару дней назад (единственное, что могло измениться на стороне клиента, - это версии плагинов - я пробовал повышать / понижать оценки, но безуспешно).


person svobol13    schedule 14.04.2020    source источник
comment
попробуйте этот синтаксис: provider "azurerm" { subscription_id = var.SUBSCRIPTION_ID client_id = var.SP_CLIENT_ID client_secret = var.SP_CLIENT_SECRET tenant_id = var.SP_TENANT_ID version = "=2.0.0" features {} }   -  person Amit Baranes    schedule 14.04.2020
comment
это действительно работает. Это другой вид входа в Azure (вход с помощью принципала-службы) вместо входа в систему с помощью Azure cli. Я правильно понимаю?   -  person svobol13    schedule 14.04.2020
comment
то есть вам лучше работать с субъектом службы, поскольку он более безопасен. могу я опубликовать это как ответ?   -  person Amit Baranes    schedule 14.04.2020
comment
Хорошо, опубликуйте его как ответ. Было бы здорово (если возможно), если бы вы также немного объяснили, почему вход в систему azure cli случайным образом работает и перестает работать, и почему SP более безопасен или лучше. Спасибо.   -  person svobol13    schedule 14.04.2020
comment
Дайте мне знать, если есть какие-либо открытые проблемы после прочтения ответа, который я опубликовал   -  person Amit Baranes    schedule 14.04.2020
comment
Azure выпустила новую версию Azure CLI, вы ее тестировали?   -  person Amit Baranes    schedule 27.04.2020


Ответы (3)


Как упоминалось в комментариях, проблема заключалась не в предоставлении субъекта-службы в поставщике. Правильный синтаксис:

# Configure the Azure Provider
# https://www.terraform.io/docs/providers/azurerm/index.html
provider "azurerm" {
  subscription_id = var.SUBSCRIPTION_ID
  client_id       = var.SP_CLIENT_ID
  client_secret   = var.SP_CLIENT_SECRET
  tenant_id       = var.SP_TENANT_ID
  version         = "=2.0.0" #Can be overide as you wish
  features {}
}

Что такое принципал службы?

Субъект-служба Azure - это удостоверение, созданное для использования с приложениями, размещенными службами и автоматизированными инструментами для доступа к ресурсам Azure. Этот доступ ограничен ролями, назначенными субъекту службы, что дает вам контроль над тем, к каким ресурсам можно получить доступ и на каком уровне. По соображениям безопасности всегда рекомендуется использовать участников-служб с автоматизированными инструментами, а не разрешать им входить в систему с идентификатором пользователя.

Дополнительная информация здесь.

С учетом вышесказанного: Почему мы должны использовать принципал службы с Terraform?

  1. При использовании субъекта-службы вы можете предоставить ограниченные разрешения для определенных ресурсов.
  2. Субъект-служба не привязан к какому-либо пользователю. Таким образом, несколько пользователей могут использовать этот субъект-службу.
  3. Вы можете назначить разрешения для удостоверения приложения, которое отличается от ваших собственных разрешений.

Поставщик Azure: аутентификация с использованием субъекта-службы с секретом клиента .

О проблеме со входом в интерфейс командной строки для AZ:

честно говоря, у меня нет ответа, которым я с уверенностью могу поделиться. Но я предполагаю, что существует проблема с _ 2_.

введите здесь описание изображения

Как вы можете видеть около двух недель назад, когда была выпущена новая версия, команда Azure устранила проблему, связанную с az login, поэтому я думаю, что именно поэтому сейчас все работает по-другому.

Если вы хотите это проверить, вы можете перейти на 2.3.0 и проверить, происходит ли это по-прежнему.

person Amit Baranes    schedule 14.04.2020

Как указано в официальной документации Terraform о как аутентифицироваться с помощью Azure CLI рекомендуется выполнять аутентификацию с использованием личных учетных данных (через az cli) при локальном запуске.

Мы рекомендуем использовать субъект-службу или управляемую идентификацию службы при неинтерактивном запуске Terraform (например, при запуске Terraform на сервере CI) и аутентификацию с помощью Azure CLI при локальном запуске Terraform.

Это становится немного проблематичным, если вы хотите работать локально в контейнере Docker, тем более что кажется, что выходные данные, сгенерированные z cli, изменили свой вывод (намеренно или нет), так что Terraform больше не может его использовать.

Как уже отмечал Амит в принятом ответе, похоже, это связано с изменением, но я бы сказал, что это произошло раньше, поскольку мне нужно полностью вернуться к 2.2.0 (2.2.0). 0-1 ~ bionic на ubuntu), чтобы он снова заработал.

person Ilon Sjögren    schedule 07.07.2020

У меня была такая же проблема с запуском terraform в контейнере докеров через ssh-клиент. Мне удалось исправить это с помощью:

export LC_ALL=en_US.UTF-8
person Lolorol    schedule 21.07.2020