我使用了 Terraform 的 azapi 进行了尝试
我想做的事情 (Wǒ zuò de
我正在使用Azure使用Terraform,了解到了一个名为AzAPI的东西,所以我将所查内容整理在这里,也作为备忘录。
AzAPI 是什么?
从公式文件中
(From the official document)
AzAPI提供者是建立在Azure ARM REST API之上的一个薄层。使用AzAPI提供者,您可以使用任意API版本来管理任意Azure资源类型。该提供者通过启用新的Azure资源和属性(包括私有预览)的管理来补充AzureRM提供者。
首先,Terraform 是一种专用的描述语言,称为 HCL(HashiCorp Configuration Language),用来定义要创建的资源。
HCL 使用 Azure、GCP、AWS 等提供的提供者,其实体只是调用每个云的 API(至少我是这样认为),
所以在预览阶段的服务通常无法从 Terraform 使用其 API。AzAPI 则是允许从 Terraform 创建此类预览阶段服务的工具,这是我个人的理解。它类似于 Azure 的资源提供程序(AzureRM),更加接近 API 的一个封装。
在公式文档中提到了以下优点。
AzAPI提供者具有以下优点。
支持所有Azure服务。
私有预览服务和功能。
公共预览服务和功能。
所有API的版本。完整的Terraform状态文件的忠实性。
属性和值都保存在状态中。
无Swagger依赖。
通用且一致的Azure认证。
在预览阶段,建议使用 AzAPI 提供程序,一旦正式发布,就使用 AzureRM 提供程序。
关于AzAPI的使用方法
基本上,一般的的 Terraform 使用方式并没有太大差异,但在预先准备方面,需要进行 AzAPI 的注册。
具体而言,在 terraform 区块内的提供者定义中添加以下 azapi。然后只需要运行 terraform init ,就可以执行 terraform plan 或 terraform apply。
terraform {
required_providers {
azapi = {
source = "azure/azapi"
version = "=0.1.0"
}
azurerm = {
source = "hashicorp/azurerm"
version = "=3.0.2"
}
}
}
但是,实际的资源定义与一般的 Terraform 书写方式有些不同。
例如,如下。
# Provision a Lab Service Account and a Lab that are in public preview
resource "azapi_resource" "qs101-account" {
type = "Microsoft.LabServices/labaccounts@2018-10-15"
name = "qs101LabAccount"
parent_id = azurerm_resource_group.qs101.id
body = jsonencode({
properties = {
enabledRegionSelection = false
}
})
}
在AzAPI中创建资源时,所有资源都应该命名为azapi_resource。资源名称(即“qs101-account”部分)保持不变。
type和name等可以随意指定,但需要注意的是,在type中必须指定API的版本(即@2018-10-15部分)。处于预览状态的资源,在日期后面加上-preview。
有关每个AzAPI的规范,请参考这里。
所以
资源提供程序现在可以使用Terraform创建和管理未提供的资源。在了解AzAPI之前,我们只能手动一点点地创建这些资源,但现在变得容易多了。
然而,与AzureRM提供的资源不同,这些资源的可获取属性有限,所以有时候无法在Terraform的代码中完整地配置想使用的信息(例如连接字符串)。
这次本来想使用Azure Communication Services E-mail(预览版),但由于它尚处于预览阶段,AzureRM尚未提供支持,所以我们只能手动创建。虽然我们现在可以使用AzAPI创建它,但无法在Terraform的代码中将创建的域传递给Function Apps的应用程序设置。这种无法达到的手段是可以理解的,毕竟它只是个预览版本!
就是这样。