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

时间:2019-11-26 02:12:56

标签: amazon-web-services terraform terraform-provider-aws

承包商在其本地笔记本电脑上构建了应用程序的AWS基础设施,从不提交代码,然后就留下了(擦拭笔记本电脑的HD)。但是他确实使用Terraform创建了基础架构,并将远程状态存储在s3存储桶s3://analytics-nonprod/analytics-dev.tfstate中。

此状态文件包括所有VPC,子网,igw,nacl,ec2,ecs,sqs,sns,lambda,firehose,kinesis,redshift,neptune,胶水连接,胶水作业,alb,route53,s3等。该应用程序。

我能够运行Cloudformer来为整个基础架构生成cloudformation,还尝试使用terraformer导入基础架构,但是terraformer不包含海王星和lambda组件。

仅从远程状态重新创建某种可用的地形的最佳方法/过程是什么? 我应该生成一些泛型: 资源“ aws_glue_connection”“ dev” {} 并运行“ terrain import aws_glue_connection.dev” 然后运行“ terraform show”

每种资源?

1 个答案:

答案 0 :(得分:0)

Terraform没有专门用于将现有状态转换为配置的机制,并且在通常情况下这样做确实是有损失的,因为Terraform配置可能包含将状态快照中未捕获的资源彼此连接的表达式。

但是,通过配置Terraform恰好足以找到您可以访问的远程状态,您可以运行一个起点-可能不是100%有效,但希望有一个总比没有更好的起点。 {1}}使Terraform读取它,然后运行terraform init以面向人类的方式查看状态信息,该方式旨在类似于(但不一定是完全匹配)配置语言。

例如,您可以编写这样的后端配置:

terraform show

如果您在运行terraform { backend "s3" { bucket = "analytics-nonprod" key = "analytics-dev.tfstate" } } 的情况下使用了适当的AWS凭证,则Terraform应该读取该状态快照,安装其中的资源实例所属的提供程序,然后使您处于可以针对其运行Terraform命令的情况现有状态。只要您不执行任何修改状态的操作,就应该可以使用terraform init之类的命令对其进行检查。

然后您可以将terraform show输出复制到新Terraform代码库中的另一个文件中作为起点。输出针对的是人类消费,不一定要由Terraform本身进行解析,但是输出样式与配置语言足够相似,希望它不需要花费太多的精力就可以将其压缩为可用的形状。

要注意的一个重要细节是Terraform模块的处理。如果产生此状态的配置包含任何terraform show块,那么在您的module "foo"输出中,您将看到类似以下内容:

terraform show

要为此复制配置,仅将整个输出粘贴到一个文件中是不够的。取而代之的是,任何在其上面带有注释的资源块都必须放在属于该模块的配置文件中,否则Terraform将无法理解该块与其在模块中可以看到的对象有关。状态。


我强烈建议您在开始之前为状态对象制作一份备份,并且在处于仅具有后端配置的这种奇怪状态时,请务必小心不要应用任何计划,因为Terraform可能(如果能够从执行环境中获取足够的提供程序配置)计划销毁该状态下的所有对象以匹配该配置。