如何在Terraform中进行计算资源抽象的泛化?

问题描述 投票:0回答:1

我一直在研究 Terraform 的功能,对于它是否真正与云无关,我遇到了不同的意见。虽然 Terraform 本身并不声称“编写一次,到处运行”,但它确实支持多云兼容性,我认为这是云不可知论的一种形式。我知道我需要为每个云提供商以声明方式定义配置,只要 Terraform 支持通过高级配置变量进行抽象,这对我来说不是问题。

例如,我想为 GCP 和 AWS 配置具有以下属性的虚拟机:

  • CPU:2个
  • 内存:3 GB
  • 磁盘:20 GB

这些属性是不同云提供商的虚拟机的标准属性。但是,据我所知,特定的 VM 类型(例如 GCE 和 EC2 实例)可能与这些规范不完全匹配。例如,GCE 不提供恰好具有 2 个 CPU 和 3 GB RAM 的虚拟机,但 AWS EC2 可以。

我的目标是定义这些通用变量,并让 Terraform 自动为每个提供者选择最接近的可用虚拟机类型。有没有办法编写 Terraform 代码来抽象这些高级配置并将它们映射到 GCP 和 AWS 的适当 VM 类型?理想情况下,我希望避免对这些配置与每个提供程序的特定实例类型之间的映射进行硬编码。 Terraform 中有支持这种抽象的插件或方法吗?

此外,您能否提供一个简单的示例来演示如何根据指定的 CPU、RAM 和磁盘要求为 GCP 和 AWS 实现此抽象?

terraform virtual-machine terraform-provider-aws terraform-provider-gcp iaas
1个回答
0
投票

实现您的目标的一个重要要求是能够访问目标平台的所有可用实例类型,以便您可以选择最适合的实例类型。 Terraform 本身没有这些信息,因此您需要在 Terraform 之外为自己构建针对该问题框架的任何解决方案。


在与使用 Terraform 的其他人的讨论中,我看到的一个常见妥协是组织使用 Terraform 定义其自己的一组与云无关的实例类型,每个实例类型都有一组特定的特征,然后手动维护查找从组织自己的实例类型到每个平台的真实实例类型的表。

要将其应用到您的情况,您需要为“2 个 CPU、3 GB RAM、20 GB 磁盘”决定一个对您的团队有意义的合理符号名称 - 在这个示例中,我将调用它

2c-3r-20d
- 然后为您打算使用的每个目标平台决定其实例类型中的哪一个是最匹配的,将该查找表声明为 Terraform 中的地图。

locals {
  aws_instance_types = tomap({
    "2c-3r-20d" = "m7i.large"
    # (and any others you want to define)
  })
}
locals {
  gcp_instance_types = tomap({
    "2c-3r-20d" = "n4-standard-2"
    # (and any others you want to define)
  })
}

然后,您可以鼓励组织中的人员使用自定义实例类型名称而不是特定于平台的名称来描述他们的需求,并使用您编写的 Terraform 配置来转换为您手动标识为最接近的特定于平台的实例类型匹配。

(请注意,EC2 和 GCP 都将存储大小视为基本上独立于实例类型的东西,因为它们将磁盘视为附加到 VM 的单独对象,而不是 VM 的一部分。您仍然可以选择捆绑如果需要,您可以将磁盘大小转换为您自己的实例类型,但在这种情况下,您需要为每个平台定义一个更复杂的查找表,指定实例类型根存储卷的设置。)

最新问题
© www.soinside.com 2019 - 2025. All rights reserved.