У меня две подписки в Azure. Назовем их sub-dev и sub-prod. Под sub-dev у меня есть ресурсы для разработки (в группе ресурсов rg-dev) и под sub-prod ресурсы для производства (в группе ресурсов rg-prod).
Теперь я хотел бы иметь только один файл состояния для dev и prod. Я могу это сделать, поскольку использую рабочие области Terraform (dev и prod). В sub-dev (rg-dev) есть учетная запись хранения с именем tfsate. У него есть контейнер и т. Д. Серверная часть Azure настроена следующим образом:
terraform {
backend "azurerm" {
resource_group_name = "rg-dev"
storage_account_name = "tfstate"
container_name = "tfcontainer"
key = "terraform.tfstate"
}
}
Если я хочу применить к среде разработки, мне нужно переключить Az Cli на sub-dev. Точно так же для производства мне пришлось бы использовать sub-prod. Я переключаю подписку по умолчанию с помощью az cli:
az account set -s sub-prod
Проблема в том, что государственная учетная запись хранения находится в подчиненном, а не в подчиненном продукте. Я получаю ошибки доступа при попытке terraform init
(или применения), когда подписка по умолчанию установлена на sub-prod.
Error: Failed to get existing workspaces: Error retrieving keys for Storage Account "tfstate": storage.AccountsClient#ListKeys: Failure responding to request: StatusCode=403 -- Original Error: autorest/azure: Service returned an error. Status=403 Code="AuthorizationFailed" Message="The client '[email protected]' with object id '<redacted>' does not have authorization to perform action 'Microsoft.Storage/storageAccounts/listKeys/action' over scope '/subscriptions/sub-prod/resourceGroups/rg-dev/providers/Microsoft.Storage/storageAccounts/tfstate' or the scope is invalid. If access was recently granted, please refresh your credentials."
Я пробовал несколько вещей:
- Я добавил
subscription_id = "sub-dev"
- Я создал токен SAS для учетной записи хранения tfstate и добавил значение конфигурации
sas_token
(удаленоresource_group_name
)
но зря и получаю ту же ошибку.
Я пытался az logout
, но terraform требует, чтобы я сначала авторизовался. Должен ли я каким-то образом настраивать разрешения в конце Azure (это сложно, поскольку среда Azure настраивается сторонней организацией) или Terraform вообще поддерживает такой тип размещения вашего файла состояния при другой настройке подписки?
terraform apply dev
иterraform apply production
или какой-либо эквивалент), вам абсолютно необходимы два разных файла состояния, иначе развертывание второго файла перезапишет первый, уничтожив все в первом. И вы также не хотите одновременно применять и разработку, и продакшн. - person ydaetskcoR   schedule 31.07.2019