NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

如何将基础设施自动导入 Terraform ?

  • 2020-08-03
  • 本文字数:2471 字

    阅读完需:约 8 分钟

如何将基础设施自动导入 Terraform ?

关于导入现有基础设施,很多读者表示有一个优雅的工具,可以实现自动导入,这款工具叫 Terraformer,使用起来非常简单,并且还可以将逆向工程自动转换为可用的 Terraform 资源,使用它有一些注意事项,本文会进一步探讨。


本文最初发表于 Medium 博客,经原作者 Craig Godden-Payne 授权,InfoQ 中文站翻译并分享。

什么是 Terraform?

Terraform 是一个 CLI 工具,可基于现有的基础设施(逆向 Terraform)生成 tf/jsontfstate 文件。

Terraformer 使用 Terraform 提供程序,旨在轻松支持新添加的资源。要使用新字段升级资源,只需升级相关的 Terraform 提供程序即可。


我将回顾所经历过的完全相同的场景,这样,你就可以确切地看到使用 Terraform 导入是有多么简单。

为什么要导入现有基础设施?

在正文开始之前,我们需要先聊一下这个话题。就像生活中的其他事情一样,有时无法对未来进行规划。如果没有对基础设施的创建进行充分的规划,就可能会导致时间压力、紧急释放或需要手动创建基础设施,并且最初就从未使用过 Terraform。

示例:已定义资源,并希望告知状态该资源已存在。

想象一下,如果在生产中出现问题,就必须迅速进行更改以防止停机。在 route53 中手动添加更改以添加 DNS 记录。

一旦事情稳定,同样的记录将被定义为 Terraform 资源,但当应用运行时,将会返回一条消息,说明该资源已存在,这会导致应用阶段失败。


在这种情况下,需要做的就是导入现有资源的状态,以便下次运行 Terraform 应用时,Terraform 软件将考虑处于其状态的资源。在以后,这意味着所做的任何更改都将作为修改,而非添加。


在这种假设的情况下,让我们假设以下资源是从 AWS 控制台中创建的:


Route53 Record Set Name: www.mywebsite.com. Route53 Record Set Type: CNAME Route53 Record Set Value: mywebsite.com 
复制代码


现在,由于这三个资源都很简单,并且知道具体创建了什么,因此,可以将他们添加到 Terraform 项目中:


resource aws_route53_record www { name = "www.mywebsite.com" type = "CNAME" zone_id = aws_route53_zone.zone.id records = ["mywebsite.com"] ttl = 300 } resource aws_route53_zone zone { name         = "mywebsite.com" } 
复制代码


应用 Terraform 时的错误消息如下所示:


* aws_route53_record.www: 1 error(s) occurred: * aws_route53_record.www: [ERR]: Error building changeset: InvalidChangeBatch: RRSet of type CNAME with DNS name www.mywebsite.com. is not permitted as it conflicts with other records with the same DNS name in zone mywebsite.com. status code: 400 
复制代码


由于冲突,Terraform 将在此时退出。


要导入状态,甚至导入现有资源文件(如果你不再拥有它的话),可以运行一下 Terraformer CLI 命令:


AWS_PROFILE=craig terraformer import aws --resources=route53 --filter=aws_route53_record=mywebsite.com --regions=eu-west-2 
复制代码


Terraformer 的美妙之处在于使用了过滤器,而不是 Terraform 使用的命名约定。


你基本上可以根据给定的名称来猜测资源名称,而使用 Terraform 时,它必须采用特定的格式。


导入过程耗费几秒钟的时间,但窗口中的输出非常有用:


2020/06/28 21:50:14 aws importing default region 2020/06/28 21:50:14 aws importing... route53 2020/06/28 21:50:17 Refreshing state... aws_route53_zone.tfer--Z06212801O0AQL6BP58RC_mywebsite-002E-com 2020/06/28 21:50:19 aws Connecting.... 2020/06/28 21:50:19 aws save route53 2020/06/28 21:50:19 aws save tfstate for route53 
复制代码



将创建一个目录结构,你可以从中获取所需的所有信息。


route53_zone 包含于我的资源类似的定义,terraform.tfstate 文件包含状态信息。


但你必须记住,terrform.tfstate 只包含已过滤资源的状态信息。如果使用它来代替现有的 Terraform 状态,那么你可能会删除已具有状态的资源。


这个状态文件的重点技术是现在可以从状态文件中获取所需的部分,并将其粘贴到现有文件中。


以下是可供参考的文件:

代码文件

resource "aws_route53_zone" "tfer--Z06212801O0AQL6BP58RC_mywebsite-002E-com" { comment       = "Managed by Terraform" force_destroy = "false" name          = "mywebsite.com." } 
复制代码

状态文件

{ "version": 3, "terraform_version": "0.12.18", "serial": 1, "lineage": "17034a7a-eadd-b496-c4e3-0ca3639e33ee", "modules": [ { "path": ["root"], "outputs": { "aws_route53_zone_tfer--Z06212801O0AQL6BP58RC_mywebsite-002E-com_id": { "sensitive": false, "type": "string", "value": "Z06212801O0AQL6BP58RC" } }, "resources": { "aws_route53_zone.tfer--Z06212801O0AQL6BP58RC_mywebsite-002E-com": { "type": "aws_route53_zone", "depends_on": [], "primary": { "id": "Z06212801O0AQL6BP58RC", "attributes": { "comment": "Managed by Terraform", "delegation_set_id": "", "force_destroy": "false", "id": "Z06212801O0AQL6BP58RC", "name": "mywebsite.com.", "name_servers.#": "4", "name_servers.0": "ns-1428.awsdns-50.org", "name_servers.1": "ns-1616.awsdns-10.co.uk", "name_servers.2": "ns-307.awsdns-38.com", "name_servers.3": "ns-944.awsdns-54.net", "tags.%": "0", "vpc.#": "0", "zone_id": "Z06212801O0AQL6BP58RC" }, "meta": { "schema_version": 0 }, "tainted": false }, "deposed": [], "provider": "provider.aws" } }, "depends_on": [] } ] } 
复制代码

结论

Terraform 肯定有它的用途,尽管对于日常单一资源的导入,替代方法使用起来可能会更快。 但我认为,它的主要目的是为了导入更多的基础设施。 我很有兴趣在更大的范围来验证这一点,下次若有机会需要导入多个资源时,我肯定会尝试一下的。


作者介绍:


Craig Godden-Payne,喜欢编写和使用软件、基础设施的技术专家。他热衷将学到的东西都写出来并分享。


原文链接:


https://medium.com/@craig.beardy.digital/automating-importing-of-existing-infrastructure-in-terraform-40f79bff59a5


公众号推荐:

跳进 AI 的奇妙世界,一起探索未来工作的新风貌!想要深入了解 AI 如何成为产业创新的新引擎?好奇哪些城市正成为 AI 人才的新磁场?《中国生成式 AI 开发者洞察 2024》由 InfoQ 研究中心精心打造,为你深度解锁生成式 AI 领域的最新开发者动态。无论你是资深研发者,还是对生成式 AI 充满好奇的新手,这份报告都是你不可错过的知识宝典。欢迎大家扫码关注「AI前线」公众号,回复「开发者洞察」领取。

2020-08-03 13:351810

评论

发布
暂无评论
发现更多内容

Seamless Mobility in Wi-Fi Networks: Exploring the Benefits of Fast Roaming

wallyslilly

IPQ6010 ipq6018 ipq5018 FASTROAMING

专场来袭,深度解读阿里云视频云的全智能进化

阿里云视频云

云计算 阿里云 视频云

h2database BTree 设计实现与查询优化思考 | 京东云技术团队

京东科技开发者

数据库 索引 B+tree 企业号 6 月 PK 榜 h2database

精选8道ES高频面试题和答案,后悔没早点看。

王中阳Go

elasticsearch 面试题 go面试题 后端面试题 ES面试题

堡垒机的作用以及价格简单说明-行云管家

行云管家

网络安全 堡垒机 IT运维

NFTScan | 06.19~06.25 NFT 市场热点汇总

NFT Research

热点 NFT\ 市场

福昕软件与北信源达成战略合作,构建PDF文档安全新格局

新消费日报

这问题巧了,SpringMVC 不同参数处理机制引发的思考 | 京东云技术团队

京东科技开发者

spring springmvc HTTP 请求方式 企业号 6 月 PK 榜

语音厅源码实用功能屏幕的转换

山东布谷科技

软件开发 源码搭建 语音源码 语音厅平台搭建

百度召开CVPR首个大模型研讨会,吸引超1000支队伍参与文心大模型国际比赛

新消费日报

ClickHouse数据表迁移实战之-remote方式 | 京东云技术团队

京东科技开发者

Clickhouse 数据迁移 Remote 迁移数据 企业号 6 月 PK 榜

Java又双叒叕“凉”了?

程序员小毕

Java spring 面试 springboot SpringCloud

inBuilder低代码平台特性推荐系列-第四期

inBuilder低代码平台

喜报:Apache Flink 荣获 2023 年度 SIGMOD 系统奖 !!!

Apache Flink

大数据 flink 实时计算

磐舟磐基平台:基于KubeEdge的落地实践

华为云开发者联盟

云原生 后端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

2023-06-26:在大小为 n x n 的网格 grid 上,每个单元格都有一盏灯,最初灯都处于 关闭 状态 给你一个由灯的位置组成的二维数组 lamps 其中 lamps[i] = [rowi,

福大大架构师每日一题

Go 算法 rust 福大大架构师每日一题

JavaScript 实践+理论(总结篇):作用域、闭包、this、对象原型

控心つcrazy

闭包 原型链 作用域 this 原型模式

教你学会使用Angular 应用里的 export declare const X Y

华为云开发者联盟

前端 华为云 华为云开发者联盟 企业号 6 月 PK 榜

沈阳等级保护测评机构有哪些?有几家?在哪里?

行云管家

等保 等级保护 等保测评 沈阳

如何驯化机器狗读懂人类手势,手把手教你!

飞桨PaddlePaddle

人工智能 百度 paddle 飞桨

6个常见的IB网络不通问题

华为云开发者联盟

后端 开发 华为云 华为云开发者联盟 企业号 6 月 PK 榜

使用 ProcessBuilder API 优化你的流程

快乐非自愿限量之名

数据库 框架开发 开发语言 process

Hive执行计划之只有map阶段SQL性能分析和解读

不在线第一只蜗牛

sql 开发语言 开发框架

DataLeap的全链路智能监控报警实践(二):概念介绍

字节跳动数据平台

数据库性能优化必读,AntDB-M数据库的哈希索引设计

亚信AntDB数据库

数据库 AntDB AntDB数据库 企业号 6 月 PK 榜

用代码玩转迷你图:手把手教你用编程语言打造简洁易读的数据图表!

不在线第一只蜗牛

代码 框架开发

基于 LRU-K 模型如何实现高效的元数据缓存?

焱融科技

#高性能 #文件存储 #分布式存储

云游世界NFT卷轴游戏dapp系统开发合约定制

开发微hkkf5566

从2PC和容错共识算法讨论zookeeper中的Create请求 | 京东云技术团队

京东科技开发者

zookeeper 分布式事务 zookeeper分布式锁 企业号 6 月 PK 榜 容错共识算法

Python Joblib库使用学习总结

EquatorCoco

Python

为什么很多互联网公司很少做单元测试?

博文视点Broadview

如何将基础设施自动导入 Terraform ?_AI&大模型_Craig Godden-Payne_InfoQ精选文章