繁体   English   中英

从远程状态重建/重新创建地形

[英]Rebuild/recreate terraform from remote state

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

此状态文件包括应用程序的所有 VPC、子网、igw、nacl、ec2、ecs、sqs、sns、lambda、firehose、kinesis、redshift、海王星、胶水连接、胶水作业、alb、route53、s3 等.

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

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

每个资源?

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 可能(如果它能够从执行环境中获取足够的提供者配置)计划销毁状态中的所有对象以匹配配置。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM