写点什么

如何将基础设施自动导入 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


2020-08-03 13:352037

评论

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

强强联合!天翼云与神州信息共助银行数字化转型升级!

天翼云开发者社区

数据库 云计算

“开放原子开源大赛”来袭, inBuilder低代码开发创新赛火热报名中!

inBuilder低代码平台

What's new in Pika v3.5.1

apache/dubbo-go

redis redis sentinel Pika

华秋DFM新功能丨可焊性检查再次升级,抢先体验!

华秋电子

什么是API商品数据接口?该怎么使用?

Noah

API 安全 API 文档 API 开发

Spring Boot 中常见且必备的注解解析

Liam

Java 程序员 Spring Boot 后端 注解

KubeCon China 2023 | 以开源促进智能世界底座共建,给世界提供更好选择

新消费日报

DxO FilmPack 6 for Mac(胶片模拟效果滤镜软件) 6.15.0完美激活版

mac

图像处理软件 苹果mac Windows软件 DxO FilmPack 6

供应链透明度的代币开发

区块链软件开发推广运营

交易所开发 dapp开发 区块链开发 NFT开发

元服务助力山东舜和酒店数字化转型,促鸿蒙生态繁荣!

最新动态

探索古彝文AI识别技术:助力中国传统文化的传承与发扬

颜淡慕潇

人工智能 算法 AI识别技术 前言技术

支持信创系统的数据库审计系统有哪些?用哪家好?

行云管家

数据库 信创 数据安全 国产化 数据库审计

如何用装饰者模式代理final方法

程序员万金游

spring aop #java #程序员 #Spring #后端

ARTS-week7(23.9.25-23.9.30)

Echo!!!

牵引数字经济重要增长极,天翼云智能边缘云助力元宇宙加速发展!

天翼云开发者社区

云计算

4点策略调优!智能外呼助力汽车行业盘活客户价值

中关村科金

智能外呼系统

关于 TDengine 的论文资料都在这里了,等你来取!

TDengine

时序数据库 国产数据库 ​TDengine

WIFI7-802.11be/EHT-IPQ9574-IPQ9554-QCN9274-QCN6274 support-320/240MHz and Multi-RU technology

wifi6-yiyi

WiFi7 ipq9554 802.11be

得物API元数据中心探索与思考

得物技术

API管理 元数据中心 自动解析

中秋国庆花式玩法,用低代码DIY假日大屏“Vlog”

华为云开发者联盟

低代码 开发 华为云 华为云开发者联盟 企业号9月PK榜

Petal 出行新人超值百元大礼包,中秋国庆优惠等你领!

最新动态

专业强大的字体管理软件:RightFont 直装激活最新版

mac大玩家j

字体设置 Mac软件 字体设计 字体管理工具

三个要点,掌握Spring Boot单元测试

互联网工科生

Spring Boot 分层架构 单元测试 JUnit Mockito

打造香港最安全便捷的银行,众安银行发布首份技术白皮书

ZA技术社区

科技 众安保险 ZA Bank 虚拟银行

苹果电脑pdf文档大小压缩推荐 PDF Squeezer激活中文最新版

胖墩儿不胖y

Mac软件 pdf编辑器 pdf处理工具

DApp区块链公链智能合约质押挖矿系统开发

l8l259l3365

文心一言 VS 讯飞星火 VS chatgpt (102)-- 算法导论9.3 8题

福大大架构师每日一题

福大大架构师每日一题

[分组聚合]基于Lucene8进行多值字段分组聚合(多属性字段)

alexgaoyh

lucene Spring Boot 分组聚合 单字段 多属性

长沙企业采购云管平台选哪家厂商?联系电话多少?

行云管家

云计算 云服务 云管理平台 云管平台

DxO PureRAW for Mac(RAW照片处理器)v3.6.0永久激活版

mac

苹果mac Windows软件 DxO PureRAW raw智能照片处理工具

深圳华秋电子有限公司与共熵服务中心缔结战略合作伙伴关系

华秋电子

合作伙伴

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