在模块中使用 Azure 服务主体会导致提供程序错误

Using a Azure Service Principal in a module leads to provider error

我正在 Azure 上设置基础结构,我选择的代码工具是 Terraform。

为了拥有良好的可维护代码,我决定使用模块。我当前的结构如下所示:

├── development/
│   ├── main.tf
│   ├── vars.tf
│   ├── outputs.tf
│  
├── modules/
│   ├── provider
│   └── resource-group
│   └── eventhub

所以,我什至将提供者代码放到了一个模块中。我的代码看起来像这样:

terraform {
  backend "azurerm" {}
}

module "provider" {
  tenant_id       = "${var.tenant_id}"
  client_id       = "${var.client_id}"
  client_secret   = "${var.client_secret}"
  subscription_id = "${var.subscription_id}"
  source          = "../modules/provider"
}

module "resource-group" {
  source = "../modules/resource-group"
}

module "iothub" {
  name     = "${module.resource-group.name}"
  location = "${module.resource-group.location}"
  source   = "../modules/iothub"
}

但是当我 运行 terraform apply 我得到 * provider.azurerm: Error validating provider: No valid (unexpired) Azure CLI Auth Tokens found. Please runaz login.

的错误消息

我已经通过将代码从提供程序模块移动到我的开发环境的 main.tf 文件中来解决这个问题。但我很好奇为什么首先会发生这种情况。根模块中是否需要provider资源?

谢谢!

无法向上传递提供者配置,因此虽然可以在模块中定义提供者,但您不能随后将该提供者配置传递给父模块(包括根模块)或兄弟模块。

Terraform 自己的 module documentation 您应该在根级别定义所有提供程序。

我个人通过为每个配置定义一个提供程序文件然后将其符号链接到每个适当的位置来实现这一点,这意味着我可以更轻松地更改配置,但还有其他方法。

请注意,您有时可能有充分的理由直接在资源中定义提供程序。我个人定义 postgresql provider configuration in my Postgresql RDS module that creates an AWS RDS Postgresql instance,然后使用 PostgreSQL 提供程序配置用户和数据库,连接到创建时 RDS 实例公开的动态端点。