使用Azure Terrafy将现有的Azure资源转换为Terraform!
这是Azure降临日历2021年的第9天。
首先
开始使用基础架构即代码(Infrastructure as Code)时,如果在GitHub上基于Pull Request进行操作,就可以记录与该Pull Request相关的问题,以及为何创建此Pull Request的原因。还可以记录谁创建和谁合并了该Pull Request。同时,可以在技术决策的同时建立和保留讨论历史,以及构建与业务核心相关的基础架构部分。基础架构即代码不仅仅是用于自动化基础架构或部署,而且还是一种有效的方法,可以在团队中进行讨论并以审计观点进行控制根本的基础架构资源。
关于从现有的Azure资源开始实施基础设施即代码(IaC),我认为利用Terraform是一个选择。然而,考虑到已经在Azure上运营或与其他团队协作等因素,开始时可能会遇到一些困难。因此,为了将现有的Azure资源纳入Terraform的管理范围,我们有一个名为Azure Terrafy的工具。我在公司的Hackthon活动中了解并对其进行了贡献,所以我想在这里介绍一下这个工具。
Azure Terrafy是什么?
Azure Terrafy 可以根据资源组的单位,让用户选择所需资源并生成 tf 文件和 tfstate 文件。在使用 Terraform 开始现有的 Azure 资源时,会遇到各种困难。Azure Terrafy 可以在以下问题时发挥作用。
-
- 他チームやプロダクトに影響を与えたくない
-
- 他のリソースがある中で Try & Error がしにくい
- 限定された範囲で portal 上でポチポチして試したものを export して、書き方がわかった状態から管理しているリポジトリにコミットしたい
Azure Terrafy旨在实现其自身的目标,即在进行terraform plan时产生no diff,同时还考虑了ARM模板的依赖关系生成tf文件使其可用。
如何安装
从发行版下载并使用。(希望支持Homebrew等)
在使用之前,您需要安装Terraform和Azure CLI。
使用
$ aztfy
aztfy [option] <resource group name>
-o string
Specify output dir. Default is a dir under the user cache dir, which is named after the resource group name
-v Print version
执行此命令时,请指定资源组,如示例中的README,用户自己会在操作系统的用户缓存中生成tf、tfstate和备份文件。
示威活动 (Demoshi)
我想尝试使用以前在博客中写的构建AKS的脚本distributed-load-testing-using-locust-on-aks。
$ git clone https://github.com/koudaiii/distributed-load-testing-using-locust-on-aks
$ cd distributed-load-testing-using-locust-on-aks
$ script/bootstrap
尝试使用 aztfy 进行 Terraform 转化,可以默认创建名为 DistributedLoadTesting 的资源组。
$ mkdir sample
$ aztfy -o sample DistributedLoadTesting

当初始化完成后,创建的资源将会显示出来。
Azure Terrafy
DistributedLoadTesting Possible resource type(s): azurerm_kubernetes_cluster_node_pool
3 items
/subscriptions/xxxx-xxxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS
(Skip)
│ /subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS/agentPools/nodepool1
│ (Skip)
/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting
(Skip)
请在画面下方找到键盘操作指南。
↑/k up • ↓/j down • / filter • w save • e show error • r show recommendation • q quit • ? more
通过键盘操作将所需资源移动并通过按下Enter键进行写入。每个Azure资源的Terraform资源类型和任意的名称都需要以“<资源类型>.<名称>”的格式进行编写(例如:azurerm_linux_virtual_machine.example)。在这种情况下,需要从Terraform的官方页面获取Terraform资源类型。或者,按下r键会出现候选项。
DistributedLoadTesting Possible resource type(s): azurerm_kubernetes_cluster_node_pool # <--- 各 Azure リソースの Terraform リソースタイプ
※用户可以通过按下 r 键来查看所选导入项目可能的资源类型,但请注意这并不是100%准确的。(这是因为它依赖于 Azure 提供商的 Terrafom,并且 Terrafom 还依赖于 Azure 的 ARM Template 模板。)
Azure Terrafy
DistributedLoadTesting
3 items
│ /subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS
(Skip)
/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS/agentPools/nodepool1
azurerm_kubernetes_cluster_node_pool.sample
/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting
azurerm_resource_group.sample

一旦确定要输出的资源后,按下”w”键。在这里,关于aztfy的机制是,在其中执行terraform import和terraform add -from-state,然后准备生成文件。最后,利用ARM模板解决各个资源之间的依赖关系。最终生成Terraform模板。
Azure Terrafy
Terraform state and the config are generated at: sample
Press any key to quit
生成的文件是如何制作的?
[2021/12/09 22:06:03] ~/src/github.com/Azure/aztfy (main)(LocustOnAKS)
$ ll sample
total 48
drwxr-xr-x 9 sakabekodai staff 288B Dec 9 22:05 .
drwxr-xr-x 22 sakabekodai staff 704B Dec 9 21:49 ..
drwxr-xr-x 3 sakabekodai staff 96B Dec 9 21:50 .terraform
-rw-r--r-- 1 sakabekodai staff 1.1K Dec 9 21:50 .terraform.lock.hcl
-rw------- 1 sakabekodai staff 221B Dec 9 22:05 .terraform.tfstate.lock.info
-rw-r--r-- 1 sakabekodai staff 741B Dec 9 22:05 main.tf
-rw-r--r-- 1 sakabekodai staff 161B Dec 9 21:49 provider.tf
-rw-r--r-- 1 sakabekodai staff 3.3K Dec 9 22:05 terraform.tfstate
-rw-r--r-- 1 sakabekodai staff 2.4K Dec 9 22:05 terraform.tfstate.backup
主.tf
resource "azurerm_kubernetes_cluster_node_pool" "sample" {
kubernetes_cluster_id = "/subscriptions/xxx-xxxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS"
mode = "System"
name = "nodepool1"
os_disk_type = "Ephemeral"
vm_size = "Standard_DS3_v2"
depends_on = [
# Depending on "/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS", which is not imported by Terraform.
]
}
resource "azurerm_resource_group" "sample" {
location = "eastus"
name = "DistributedLoadTesting"
}
提供者.tf
terraform {
required_providers {
azurerm = {
source = "hashicorp/azurerm"
version = "2.88.0"
}
}
}
provider "azurerm" {
features {}
}
只有所选择的部分被模板化。最后通过terraform plan确认没有差异。
$ terraform plan
azurerm_resource_group.sample: Refreshing state... [id=/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting]
azurerm_kubernetes_cluster_node_pool.sample: Refreshing state... [id=/subscriptions/xxx-xxx/resourceGroups/DistributedLoadTesting/providers/Microsoft.ContainerService/managedClusters/LocustOnAKS/agentPools/nodepool1]
No changes. Your infrastructure matches the configuration.
Terraform has compared your real infrastructure against your configuration and found no differences, so no changes are needed.
庆祝的派对!
最后
关于一系列操作,通过演示视频更容易理解(也可从 README 中查看)。由于还有其他限制条件,请查阅 README。Azure Terrafy刚刚发布,我相信随着用户数量的增加,它会变得更加便利。让我们一起做出贡献吧!