导入 tf 文件中定义的所有资源

red*_*888 8 terraform

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

这是否必须是手动过程?

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

terraform import aws_instance.web i-123456
Run Code Online (Sandbox Code Playgroud)

如果我必须为每个资源都这样做,那就太痛苦了(不妨删除所有内容并重新开始)。

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

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

TJ *_*dle 7

不,在 Terraform 中无法本地执行此操作;即使你一起编写了一种方法 - 我认为它不会非常可靠,你也无法相信它选择了正确的资源(至少不容易)。

Terraform 在文档中多次提到您需要保护状态文件;这就是为什么鼓励远程存储(例如 S3)用于您关心的任何事情的原因;以及为什么这是 Terraform Enterprise 的卖点。

  • 很多资源都可以明确识别;例如,有一个模板说要制作一个名为 pineapple 的 AWS S3,好吧,全球最多只有一个具有该名称的 aws 存储桶。同样的角色和政策以及许多其他资源。在存在一些歧义的那些中,例如实例,可以向用户呈现可能目标的列表以选择正确的目标。在我看来,tf 似乎积极阻止这种方法,因为这样做不符合他们的商业利益,而不是因为这是不可能的。 (5认同)
  • 所以听起来,如果你使用 terraform,你的基础设施最好是足够动态的,这样你就可以构建一个全新的版本,并在你的状态被破坏的情况下迁移到那个版本,否则你就搞砸了。 (2认同)
  • @red888 我的意思是对于你使用的任何东西都是如此。Terraform 建议使用 S3 作为数据存储并确保启用版本控制。 (2认同)