当前位置: 首页 > 知识库问答 >
问题:

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

雍俊远
2023-03-14

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

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

我能够运行Cloudformer为整个架构体系生成云形成,并尝试使用terraformer导入架构体系,但terraformer不包括neptune和lambda组件。

从远程状态重新创建某种程度上可用的地形的最佳方式/过程是什么?我应该生成一些泛型:资源“aws\u glue\u connection”“dev”{}并运行“terraform import aws\u glue\u connection.dev”,然后运行“terraform show”

每种资源?

共有1个答案

司允晨
2023-03-14

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

然而,通过配置Terraform以找到您可以访问的远程状态,运行Terraform init使Terraform读取,您可能能够获得一个起点——可能不是100%有效,但希望是一个更好的起点,然后运行terraformshow,以人性化的方式查看来自状态的信息,该方式旨在类似(但不一定完全匹配)配置语言

例如,您可以编写如下后端配置:

terraform {
  backend "s3" {
    bucket = "analytics-nonprod"
    key    = "analytics-dev.tfstate"
  }
}

如果您使用适当的AWS凭据运行terraform init,那么Terraform应该读取该状态快照,安装其中资源实例所属的提供程序,然后让您处于可以针对该现有状态运行Terraform命令的状态。只要您不采取任何修改状态的操作,您应该能够使用像terraform show这样的命令来检查它。

然后,作为起点,您可以将terraform show输出复制到新Terraform代码库中的另一个文件中。输出是针对人类消费的,不一定都可以由Terraform本身解析,但是输出风格与配置语言足够相似,希望不会花费太多精力将其按摩成可用的形状。

需要注意的一个重要细节是地形模块的处理。如果产生此状态的配置包含任何模块“foo”块,则在terraform show输出中,您将看到如下内容:

# module.foo.aws_instance.bar
resource "aws_instance" "bar" {
  # ...
}

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

我强烈建议您在开始之前备份一个state对象的副本,并且您应该非常小心,不要在只有后端配置的奇怪状态下应用任何计划,因为Terraform可能(如果它能够从执行环境中获取足够的提供程序配置的话)计划销毁状态中的所有对象以匹配配置。

 类似资料:
  • 我正在创建在状态栏中显示通知图标的应用程序。当用户打开状态栏并点击图标时,应用程序应该被启动。 我正在寻找一种方法来避免在这次发布期间重新创建应用程序。我已经创建了测试应用程序,并将日志消息添加到处理程序onCreate、onRestart、onResume、onStop和onDestroy中。日志消息说明了问题: 用户启动应用程序-onCreate、onResume 步骤7的行为与步骤3和5的行

  • 问题内容: 我有一个脚本,可以使用令牌远程触发Jenkins上的作业。这是我的脚本: 运行它之后,我得到以下响应: 我注意到它返回标题中的队列URL:http : //jenkins.myserver.com/jenkins/queue/item/91。但我不知道该如何使用此返回URL。 1)我想知道是否有人知道如何检查我刚刚创建的工作的状态? 2)由于上述回应并未传回工作编号,因此我无法真正使用

  • 我是一个新手,我想建立动态地图 最终地图检查={'卧房':'床','浴室':'bathbub\u轮廓'}; 它显示一个错误 lib/模板/general.dart:164: 18:错误:无法从返回类型为MapEntry的函数返回类型为Row的值 “行”来自“包:flatter/src/widgets/basic”。dart’(“../flight/packages/flight/lib/src/w

  • 我正在尝试使用Java在远程服务器上创建一个加密的MySQL备份,以防止IT员工查看备份。基本上,我正在使用的服务器运行MySQL,它生成易于访问的.sql备份文件。我搜索了很多关于如何创建加密备份,但没有有效的结果。最后我得到的是使用java服务器将.sql文件压缩成一个受密码保护的rar文件,并从PC机上删除.sql文件。有没有更好的方法使我的备份在不需要RAR的情况下不可访问?

  • 是否有一种方法可以禁用远程资源检索(也许有利于本地资源),最好是通过向Maven传递命令行参数,但如果不能,则通过修改Maven根POM的本地副本? 编辑:添加完整堆栈跟踪。似乎方法是使用来自Velocity的反射调用的,这使我认为一定有一个Velocity模板在某个Apache工件中引用,但是我在https://svn.Apache.org/repos/asf/maven/resources/的

  • 我正在尝试将数据列表作为列表。但如果无法访问服务器,我需要返回http状态404。对我来说,POST方法工作得很好,但GET方法返回200并带有http.ok到客户端页面。如何添加响应?