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

时间:2018-11-06 13:43:50

标签: azure terraform infrastructure-as-a-code

我正在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 run az登录.的错误消息

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

谢谢!

1 个答案:

答案 0 :(得分:1)

不可能向上传递提供程序配置,因此尽管可以在模块中定义提供程序,但您不能再将该提供程序配置传递给父级(包括根目录)或兄弟模块。

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

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

请注意,有时您可能有充分的理由直接在资源中定义提供程序。我在自己的Postgresql RDS模块中定义了postgresql provider配置,该配置创建了AWS RDS Postgresql instance,然后使用PostgreSQL提供程序配置了用户和数据库,并连接到RDS实例在创建时公开的动态端点。