我在考虑使用ARM模板和Terraform来管理Azure的配置
序言
我們所屬的組織目前正在使用 Azure,為了推動 IaC,我們已開始進行技術驗證。我們將整理從 ARM templates 的教學、Terraform for Azure 的教學、HashiCorp on Azure 的網絡研討會,以及閱讀文件中獲得的資訊。
请注意,本文作者在撰写文章时的技能水平如下:Azure经验约2周,ARM模板经验约20小时,Terraform经验约40小时。同时,我也有少量在GCP中使用基础设施即代码(使用Google Cloud SDK和Terraform)进行配置管理的经验。
关于考虑该使用什么的问题,我持有的立场是什么。
我同意“用一种工具来解决所有问题并不是一个好主意”的观点来进行构成管理。因为我们应该采用适合特定问题的工具,而围绕目标系统的问题也在不断变化。
我认为目标是始终要使 “基础设施能够持续得到重复利用”。
因此,我们不会通过在每个比较区域中决定 ARM 模板和 Terraform 的优劣,而是会逐步描述它们的特点。
第一个参考:
请用汉语将以下内容表达得更简洁:
參攷1:
我们将Terraform与这些工具进行比较,但需要注意的是,Terraform并不排斥其他系统。
通过https://www.terraform.io/intro/vs/index.html的网站了解以下内容。
第二个参考:
由于自动化相关工具的流行和淘汰速度很快,我认为仅仅使用一个工具来完成所有事情不是一个很好的想法。
关于Terraform
特点
即使是多供应商,也能提供统一的工作流程。
Terraform能够提供统一的基础设施构建工作流程。无论是在Azure、GCP还是本地环境下,无论是构建虚拟机还是Kubernetes,都可以通过plan来确认基础设施的变更差异,然后通过apply来进行基础设施的构建。整个流程如下所示。
構成ファイル(.tf)を記述
↓
init (provider plugins の取得。)
↓
plan (新規作成した場合の構築内容を表示。)
↓
apply (インフラを新規構築。stateファイルの作成。)
↓
(インフラの変更が必要になる。)
↓
構成ファイル(.tf)を修正
↓
plan -out=newplan (インフラの変更内容の確認。変更プランとして書き出し。)
↓
apply "new_plan" (変更プランを適用。)
↓
(インフラが不要になる。)
↓
destroy (インフラの破棄。)
代码审查和持续集成的运用似乎很方便。
推荐在网络研讨会上的运营方式如下所示。
-
- state ファイルを blob ストレージ (または Terraform Cloud)で管理する
-
- 構成ファイルを記述したらコードレビューを入れる
-
- CI で plan を実行させ、構成ファイルと plan コマンドで出力される変更の両方を確認する
-
- apply は必ず CI に実行させる
-
- 新規にインフラを作る場合は必ず Terraform を使って Azure Portal から作成をしない
- Azure の Provider できない値指定は ARM templates と併用するか Provider に Pull Request を投げる
在基础设施构建和修改方面进行代码审查后,从持续集成中执行的流程非常出色。
顺便一提,在网络研讨会上,我们得到的回答是无法将现有的Azure资源替换为HCL。但是,可以通过使用terraform import命令来创建状态文件。
已经为Terraform Cloud 提供了供使用的设施。
根据我阅读的这篇文章,虽然我自己没有尝试过,但看起来非常不错。
(Translation: Based on the article I have read, although I haven’t personally tried it, it seems very good.)
其他特点
-
- 構成ファイル(.tf)が読みやすい
-
- 構成ファイルはコメントが書ける
- VS Code にも JetBrain のIDEでもプラグインがある
令人关注的地方
有一些让我在意的地方。
提供商是否支持对Azure的更改。
在网络研讨会上,当我提出问题时,由于该项目是开源软件,所以在跟进Azure的变更方面会有些许延迟,他们希望我能为该项目做出贡献。该项目使用Go(包括Terraform主体和Provider),但很可惜,我可能会觉得难以理解。
我感觉源码的更新频繁。
https://github.com/terraform-providers/terraform-provider-azurerm/pulse/monthly
请查看 HashiCorp 的网站以了解他们与 Microsoft 的强大合作关系,这一合作已经持续多年。链接为 https://www.hashicorp.com/cloud-partners/microsoft?product=terraform。
Terraform 仅仅是一个包装器
我是否可以对Azure的各个基础设施的API版本等进行详细指定和属性调整,我感到有些不安(很抱歉没有仔细阅读内部代码就说这种话)。
试着动动手
请参考我留下的执行教程和备忘录,以了解情况。
-
- チュートリアル
https://learn.hashicorp.com/tutorials/terraform/infrastructure-as-code?in=terraform/azure-get-started
环境设定
-
- azsure cli を install する
-
- install
brew install hashicorp/tap/terraform
Terraform v0.13.5
terraform -install-autocomplete
vscode の pligin を install
hashicorp.terraform
azure でリソースグループ terra_test を作成
location: japaneast だけを設定する
cat ~/ghq/github.com/github/gitignore/Terraform.gitignore >> .gitignore
后来将现有基础设施编码化
-
- https://dev.classmethod.jp/articles/aws-with-terraform/
ex. recource group のマイニング
https://www.terraform.io/docs/providers/azurerm/r/resource_group.html
(terraform import azurerm_resource_group.rg /subscriptions//resourceGroups/terra_test)
tfstateが存在する場合に、状態を確認する流れ
$ terraform state list
azurerm_resource_group.rg
$ terraform state show azurerm_resource_group.rg
# azurerm_resource_group.rg:
resource "azurerm_resource_group" "rg" {
id = "/subscriptions/<subscription_id>/resourceGroups/terra_test"
location = "japaneast"
name = "terra_test"
tags = {}
timeouts {}
}
修改基础设施
将 main.tf 文件按如下进行修改。
resource "azurerm_resource_group" "rg" {
name = "terra_test"
location = "japaneast"
tags = {
Environment = "Terraform Getting Started"
}
}
执行 “terraform plan -out=newplan”。
更改部分更容易理解。
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
~ update in-place
Terraform will perform the following actions:
# azurerm_resource_group.rg will be updated in-place
~ resource "azurerm_resource_group" "rg" {
id = "/subscriptions/<subscription_id>/resourceGroups/terra_test"
location = "japaneast"
name = "terra_test"
~ tags = {
+ "Environment" = "Terraform Getting Started"
}
timeouts {}
}
Plan: 0 to add, 1 to change, 0 to destroy.
terraform apply “newplan” を適用する。
Apply complete! Resources: 0 added, 1 changed, 0 destroyed. が表示される
terraform state show azurerm_resource_group.rg すると結果が変わっている
删除基础设施
-
- terraform destroy
- 実行するかどうかが表示される
An execution plan has been generated and is shown below.
Resource actions are indicated with the following symbols:
- destroy
Terraform will perform the following actions:
# azurerm_resource_group.rg will be destroyed
- resource "azurerm_resource_group" "rg" {
- id = "/subscriptions/<subscription_id>/resourceGroups/terra_test" -> null
- location = "japaneast" -> null
- name = "terra_test" -> null
- tags = {
- "Environment" = "Terraform Getting Started"
} -> null
- timeouts {}
}
Plan: 0 to add, 0 to change, 1 to destroy.
Do you really want to destroy all resources?
Terraform will destroy all your managed infrastructure, as shown above.
There is no undo. Only 'yes' will be accepted to confirm.
Enter a value:
有关于Terraform的相关链接
我会放置一些有用的链接和官方文件的链接。
-
- Azure Doc 上の Terraform
https://docs.microsoft.com/ja-jp/azure/developer/terraform/
Terraform Doc の Azure Provider
https://www.terraform.io/docs/providers/azurerm/index.html
Terraform ソース
https://github.com/hashicorp/terraform
Azure Provider ソース
https://github.com/terraform-providers/terraform-provider-azurerm
とにかくここからはじめよう
https://learn.hashicorp.com/collections/terraform/azure-get-started
Terraform Cloudのレビュー記事
チュートリアル + アルファの手順
https://github.com/nnashiki/start-terraform-azure
关于 ARM 模板
ARM 模板的特点
可以立即使用 Azure 的新服务和功能。
公式网站中有关“选择ARM模板的原因”的说明。请参考以下链接:https://docs.microsoft.com/ja-jp/azure/azure-resource-manager/templates/overview#why-choose-arm-templates
能够通过文件管理来管理参数
可以将模板和参数分开进行管理。
有一个名为”what-if”的功能,可以进行试运行(预览)。
即使没有状态文件,您仍然可以使用what-if命令进行干预运行。
可以将现有资源导出到定义文件中。
您可以通过门户将现有资源方便地导出为模板。
其他特点
-
- モジュール化できる
-
- 状態ファイルを管理しない
-
- 相互に依存するリソースのデプロイが調整され、正しい順序で作成される
-
- Azure Key Vault と連携してセキュアな管理ができる
-
- 日本語ドキュメントが充実している
-
- VScode の Azure Resource Manager (ARM) Tools のスニペットが強力
-
- 定義ファイルはJSON
パラメーターを説明は metadata に記載する
"parameters": {
"storageAccountType": {
"type": "string",
"metadata": {
"description": "The type of the new storage account created to store the VM disks."
}
}
}
尝试动手
我进行了教程 – 创建和部署第一个 ARM 模板,并进行了虚拟机的启动和虚拟机资源的修改。我觉得你可以感受到其中的氛围,所以我会记录下步骤和结果。

用中文进行原生的改写:
这是我的感觉。
只是稍微触摸和调查一下,我认为两者都是DRY RUN的,可以进行代码审查,对于进行IaC来说是毫无问题的。不过,如果要规模扩大,用户体验可能会有所改变。
这是全部内容。