从远程状态重建/重新创建 terraform

3
一个承包商在本地笔记本上构建了应用程序的AWS基础架构,从未提交过代码就离开了(擦除了笔记本电脑的硬盘)。但他确实使用Terraform创建了基础架构,并将远程状态存储在s3存储桶中,s3://analytics-nonprod/analytics-dev.tfstate。
此状态文件包括应用程序的所有VPC、子网、igw、nacl、ec2、ecs、sqs、sns、lambda、firehose、kinesis、redshift、neptune、glue连接、glue作业、alb、route53、s3等。
我能够运行Cloudformer为整个基础架构生成云形成文档,并尝试使用terraformer导入基础架构,但terraformer不包括neptune和lambda组件。
最好的方法/过程是什么,可以仅从远程状态重新创建某种可用的terraform? 我是否应该生成一些通用的: resource "aws_glue_connection" "dev" { } 然后运行“terraform import aws_glue_connection.dev”, 接着运行“terraform show”来为每个资源进行操作?
1个回答

1
Terraform没有专门用于将现有状态转换为配置的机制,实际上在一般情况下这样做会导致信息损失,因为Terraform配置可能包含将资源连接在一起的表达式,而这些表达式不包含在状态快照中。
但是,通过配置足够的Terraform来找到您可以访问的远程状态,运行terraform init使Terraform读取它,然后运行terraform show以以人类可理解的方式查看状态信息,这可能能够得到一个起点--可能不是100%有效,但希望比什么都没有更好。
例如,您可以编写一个像这样的后端配置:
terraform {
  backend "s3" {
    bucket = "analytics-nonprod"
    key    = "analytics-dev.tfstate"
  }
}

如果您使用适当的 AWS 凭据运行 terraform init,那么 Terraform 应该会读取该状态快照,安装其中包含的资源实例所属的提供程序,然后使您处于可以针对该现有状态运行 Terraform 命令的情况下。只要您不执行任何修改状态的操作,就应该能够使用诸如 terraform show 的命令来检查它。
您可以将 terraform show 输出复制到新 Terraform 代码库中的另一个文件中作为起点。该输出旨在供人阅读,并不一定都可由 Terraform 自身解析,但输出样式与配置语言相似,因此希望将其转换为可用形式不需要太多的努力。
需要注意的一个重要细节是 Terraform 模块的处理。如果生成此状态的配置包含任何 module "foo" 块,则在您的 terraform show 输出中,您将看到类似以下内容的一些内容:
# module.foo.aws_instance.bar
resource "aws_instance" "bar" {
  # ...
}

为了复制该配置,仅将整个输出粘贴到一个文件中是不够的。相反,任何具有上面注明属于模块的注释的资源块都需要放置在属于该模块的配置文件中,否则Terraform将无法理解该块与它在状态中看到的对象相关联。

我强烈建议在开始之前先备份您拥有的状态对象,并且在您处于仅具有后端配置的这种奇怪状态时非常小心,因为如果 Terraform 能够从执行环境中获取足够的提供者配置,它可能会计划销毁状态中的所有对象以匹配配置。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接