我研究了一下[Azure] Azure Resource Manager和Terraform,想知道哪一个更好

首先

在我目前负责的项目中,我们正在使用Azure,并从下一个阶段开始计划通过代码来管理基础架构。为了选一个适合的基础设施即代码(IaC),我研究了Azure ResourceManager(ARM)和我之前接触过的Terraform,不知道哪一个更好。

由于本调查基于经验而非运营,因此如果您在运营方面有意见或建议,我们非常希望您能够留下评论。

ARM(Azure资源管理器)是什么

Azure推出的IaC工具。有两种资源定义方法,一种是ARM模板(JSON),另一种则是被称为Bicep的Azure专用DSL(领域特定语言)。据说在部署过程中,Bicep会自动转换为ARM模板,所以ARM模板并没有完全被淘汰。

例子:ARM

{
  "$schema": "https://schema.management.azure.com/schemas/2019-04-01/deploymentTemplate.json#",
  "contentVersion": "1.0.0.0",
  "parameters": {
    "location": {
      "type": "string",
      "defaultValue": "[resourceGroup().location]"
    },
    "storageAccountName": {
      "type": "string",
      "defaultValue": "[format('toylaunch{0}', uniqueString(resourceGroup().id))]"
    }
  },
  "resources": [
    {
      "type": "Microsoft.Storage/storageAccounts",
      "apiVersion": "2021-06-01",
      "name": "[parameters('storageAccountName')]",
      "location": "[parameters('location')]",
      "sku": {
        "name": "Standard_LRS"
      },
      "kind": "StorageV2",
      "properties": {
        "accessTier": "Hot"
      }
    }
  ]
}

个人觉得它很像令人惊叹的terraform。

param location string = resourceGroup().location
param storageAccountName string = 'toylaunch${uniqueString(resourceGroup().id)}'

resource storageAccount 'Microsoft.Storage/storageAccounts@2021-06-01' = {
  name: storageAccountName
  location: location
  sku: {
    name: 'Standard_LRS'
  }
  kind: 'StorageV2'
  properties: {
    accessTier: 'Hot'
  }
}

Azure 资源管理器 的概述 – Azure 资源管理器

Terraform 是什么?

这是一款不仅仅在Azure上广泛使用的工具,所以我想很多人可能已经知道,它是由HashiCorp公司开发的基础设施即代码(IaC)工具。在定义资源方面,使用了HCL(HashiCorp配置语言)。

如果使用Azure,似乎会在内部使用Azure Resource Manager API。

关于Azure Provider

土壤建立登记册

如果要定义AzureStorageAccount

resource "azurerm_storage_account" "mystorageaccount" {
  name                        = "st${random_id.randomId.hex}"
  resource_group_name         = azurerm_resource_group.rg.name
  location                     = var.resource_group_location
  account_tier                = "Standard"
  account_replication_type    = "LRS"
}

比较表的汉语说法还有以下几种选项:
– 比较表格
– 对照表格

ARMTerraformリソース定義の方法JSON(ARMテンプレート) or 独自言語(Bicep)独自言語(HCL)独自言語に対するエディタ、IDEのサポートvscodeにARMテンプレート、bicepともにプラグインありvscode,inteliJにプラグインあり。(自分の手元のツールのみ調査しました)対応クラウドプラットフォームAzure複数(Azure,AWS,GCP etc)クラウドプラットフォームの最新機能への追従性常に追従OSSなので時間がかかる可能性がある状態管理ファイル(クラウドリソースと手元のIaCコードの状態差異の管理方法)なし。terraform.tfstate適用前にデプロイ対象を確認できるかWhatifオプションを使うことで可能[1]terraform plan or apply時の最終確認で可能モジュール化できるかBicepなら可能可能リソースのデプロイ順序依存の解決Bicepは自動でやってくれる(ARMテンプレートは明記する必要があった)自動

[1] 关于”What if”选项的情况如何

模板部署的“假设情况” – Azure 资源管理器

那么,最后究竟哪个更好呢?

尽管并非基于个人经验,而是基于研究多篇文章的结果,我仍然认为这取决于具体情况。

这两者我觉得都没有特别突出的优势或劣势。以前由于没有Bicep,无法实现模块化,也因为使用JSON进行冗长的定义而有人回避使用ARM的说法或许也是可行的。但是现在随着Bicep的出现,两者都能实现,所以ARM不再有弱点。

但是,考虑到这样可能对困惑中的人没有什么帮助,所以我想列出以下三种我认为值得推荐的选项,供您参考。

希望积极地利用和体验Azure的最新功能的人

→ ARM架构。

尽管ARM可能存在从功能发布到反映到ARM有一定时滞的可能性,但相较于无法添加ARM的Terraform,可以期望ARM的RESTAPI反映更快。

使用同一产品也使用其他云平台资源的人

→ 地貌改造。

虽然ARM变得更加易于编写了,但它仍然是专为Azure量身定制的IaC工具,如果想要综合管理其他云平台,我认为应该选择Terraform。

虽然我们没有创建服务之类的打算,但是如果有人想要先了解IaC,我们可以考虑学习。

→ 土地改造。

个人观点而言,如果在工作中没有确定要使用Azure,我认为适用于各种云平台的Terraform会比较好。总之,先掌握Terraform,这样无论将来在自己的兴趣爱好或工作中使用哪个云平台,都可以灵活应对。

可能在积累经验之后,观点可能会发生改变。

    • ARMがAzure謹製であること

 

    • これは当たり前ですがterraformでazureを運用していくと痒いところに手が届かない!という事態が頻繁に起きたら、上記がARMの大きな強みになりうると思ったからです。

 

    • 状態管理ファイルの有無

 

    ARMには状態管理ファイルがなく、Terraformにはtfstateがありますが、これは素人目には一見管理しなくて済むARMの方がいいじゃん!とも思えますが、逆にファイル管理できないということは状態を切り戻したりする上で不便なこともあるんじゃないかと感じています。また逆に”terraform側のtfstateの管理の手間”があまりにも大きければ”ARMで出来ないこと”は些細なことに思えるかもしれません。これらは今後運用経験を積んだ段階でまた記事を書きたいと思います。

除了ARM和Terraform,还有其他的选择:Pulumi。

除了Pulumi之外,还有其他IaC工具,但由于在调查时我注意到它并引起了我的兴趣,我想简要介绍一下!

Pulumi是什么意思?

使用熟悉的语言、工具和工程实践构建、部署和管理现代云应用和基础设施。

据我了解,这个工具可以让用户用自己喜欢的语言编写基础设施定义。

来源:Pulumi – 现代化的基础设施即代码

云平台的适用性

    • AWS

 

    • Azure

 

    • GCP

 

    kubenertes

中文

    • JavaScript/TypeScript

 

    • Python

 

    • Go

 

    C#,F#,VB

写作样例(部分摘录)

据参考资料,如果要在TypeScript中部署AzureStorageAccount,可以使用以下写法。

审查新项目 | Azure

import * as pulumi from "@pulumi/pulumi";
import * as resources from "@pulumi/azure-native/resources";
import * as storage from "@pulumi/azure-native/storage";

// Create an Azure Resource Group
const resourceGroup = new resources.ResourceGroup("resourceGroup");

// Create an Azure resource (Storage Account)
const storageAccount = new storage.StorageAccount("sa", {
    resourceGroupName: resourceGroup.name,
    sku: {
        name: storage.SkuName.Standard_LRS,
    },
    kind: storage.Kind.StorageV2,
});

// Export the primary key of the Storage Account
const storageAccountKeys = storage.listStorageAccountKeysOutput({
    resourceGroupName: resourceGroup.name,
    accountName: storageAccount.name
});

因为此次还没有充分调查,所以只作简要介绍,但我认为这是一个非常有趣的工具,所以我可能会在以后的文章中再次写到它。

这篇文章总结得很清楚易懂。

ARM vs Terraform系の記事

IaC: Azure Resource Manager Templates vs. Terraform.

Compare ARM templates vs. Terraform for infrastructure as code

Azure の構成管理を ARM templates と Terraform で検討してみた – Qiita

Comparing Azure ARM vs Cloudify vs Terraform | Cloudify

Terraform,ARMだけでなくPulumiも比較対象に入れている記事
ARM Templates vs Terraform vs Pulumi – Infrastructure as Code in 2021

TerraformをARM(Bicep)で置き換えるべきかについての記事
Would I replace Terraform with Bicep ? ??

Pulumiについて

Pulumi – Modern Infrastructure as Code

これが次世代プロビジョニングツールの実力か!? PulumiでAWSリソースを作成してみた | DevelopersIO

广告
将在 10 秒后关闭
bannerAds