【问题标题】:Import all resources defined in tf file导入 tf 文件中定义的所有资源
【发布时间】:2018-05-16 18:30:30
【问题描述】:

假设我使用 terraform 构建了我的基础架构,但我的 tfstate 因某种原因被删除。这意味着我已经在 tf 文件中定义了我的资源,我只需要重新导入所有内容。

这必须是手动过程吗?

例如,这是我导入 EC2 实例的方式:

terraform import aws_instance.web i-123456

如果我必须为每个非常痛苦的资源都这样做(还不如删除所有内容并重新开始)。

如果我已经有了我的 tf 文件,有没有办法只导入其中定义的所有资源?例如,我需要实例 ID 才能导入该实例。 terraform import 命令能否只读取我的 tf 文件并找到映射到“aws_instance.web”的资源?

为了做到这一点,terraform 需要将该 aws 实例映射到 tf 文件中的资源 - 这当然是 tfstate 的目的。但是 terraform 是否也可以使用资源映射来标记资源?所以我可以对 tf 文件进行导入,terraform 只是动态读取 tf 文件并通过唯一标签找到与 tf 资源对应的物理资源?

【问题讨论】:

  • 如果您定义了两个相同的资源,这将如何工作?
  • 你是什么意思?就像我有两个定义同名资源的不同 tf 文件一样?抱歉,我的头还在 terraform 周围,所以也许我在这里遗漏了什么?
  • 是的,有点。如果您使用完全相同的参数定义了两个 EC2 实例(例如),Terraform 如何在不存储到实例 ID 的映射的情况下知道哪个是哪个?
  • 嗯,假设我只有一个 tf 文件,该文件中定义的每个资源是否都需要具有唯一的名称?因此,如果这些实例本身被标记为该映射 terraform 可以知道哪个是正确的?
  • 理论上是的。但一般而言,并非所有资源都是“可标记的”。 (嗯,它们可能在 AWS 中,我不知道。但它们肯定不是一般的。)

标签: terraform


【解决方案1】:

不,在 Terraform 中无法在本地执行此操作;即使你一起编写了一个脚本——我认为它不是很可靠,你也不能相信它选择了正确的资源(至少不容易)。

Terraform 在文档中多次表示您需要保护您的状态文件;这就是为什么鼓励远程商店(例如 S3)处理您关心的任何事情的原因;以及为什么这是 Terraform Enterprise 的卖点。

【讨论】:

  • 听起来,如果您使用 terraform,您的基础架构最好具有足够的动态性,这样您就可以构建一个全新的版本,并在您的状态损坏时迁移到该版本,否则您就完蛋了。
  • @red888 我的意思是你使用的任何东西都是如此。 Terraform 建议使用 S3 作为数据存储并确保启用版本控制。
  • 很多资源可以明确识别;例如,一个模板说要制作一个名为 pineapple 的 AWS S3,好吧,全球至多有一个具有该名称的 aws 存储桶。同上角色和政策以及许多其他资源。在那些有一些歧义的地方,例如实例,可能的目标列表可以呈现给用户以选择正确的目标。在我看来,tf 积极阻止这种做法是因为这样做不符合他们的商业利益,而不是因为不可能。
猜你喜欢
  • 2015-07-08
  • 2022-12-23
  • 2016-04-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-02-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多