一个承包商在他的本地笔记本电脑上构建了一个应用程序的AWS基础设施,从未完成他的代码然后离开(擦去笔记本的HD)。但他确实用Terraform创建了基础设施,并将远程状态存储在一个s3桶中,s3://analytics-nonprod/analytics-dev.tfstate。
该状态文件包括所有的VPC、子网、igw、nacl、ec2、ecs、sqs、sns、lambda、消防软管、运动、红移、海王星、胶水连接、胶水作业、alb、route53、s3等。
我能够运行Cloudformer为整个基础设施生成cloudformation,并且尝试使用terraformer导入基础设施,但terraformer不包括neptune和lambda组件。
从远程状态重新创建一些可用的地形的最佳方法/过程是什么?我是否应该生成一些通用的:资源"aws_glue_connection“"dev”{}并运行"terraform import aws_glue_connection.dev“,然后运行"terraform show”
每种资源?
发布于 2019-11-27 01:24:45
Terraform没有专门用于将现有状态转换为配置的机制,实际上,这样做在一般情况下是有损的,因为Terraform配置可能包含将资源连接到其他资源的表达式,而这些表达式在状态快照中没有捕获。
然而,您可能能够获得一个起点--可能不是100%有效,但希望它是一个比没有更好的起点--通过配置Terraform来找到您可以访问的远程状态,运行terraform init使Terraform读取它,然后运行terraform show以一种面向人的方式查看来自状态的信息,这种方式旨在类似(但不一定完全匹配)配置语言。
例如,您可以编写如下后端配置:
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可能(如果它能够从执行环境中获取足够的提供程序配置)计划销毁状态中的所有对象,以便与配置匹配。
https://stackoverflow.com/questions/59042727
复制相似问题