写点什么

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

评论

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

无线配置多一个路由器作为家庭wifi的无线热点?

eng八戒

家庭网络 热点

8 个很酷的 GitHub 技巧

devpoint

GitHub vscode 开发技巧

使用 App Store Connect API 批量创建内购商品

37手游iOS技术运营团队

AppleParty 苹果派 App Store Connect API 批量创建内购IAP 批量上传 IAP

极客时间运维进阶训练营第十周作业

老曹

追求技术极致 探索落地先机 毫末智行城市NOH公布未来产品规划

科技大数据

新能源汽车

多位AI学者、行业大牛、企业家齐聚2023 HAOMO AI DAY分享自动驾驶行业前沿洞见

科技大数据

分享 7 个不错的 AI 工具

devpoint

人工智能 AI openai

【Redis技术探索】「数据迁移实战」手把手教你如何实现在线+离线模式进行迁移Redis数据实战指南(在线同步数据)

洛神灬殇

redis 数据同步 1月日更 数据同步工具 RedisShake

OpenTelemetry日志体系

骑牛上青山

Java 日志 log 调用链 OpenTelemetry

线上压测

agnostic

Button(按钮)与ImageButton(图像按钮)

芯动大师

Android Studio button imagebutton

直播交友一对一视频语音APP项目系统架构和模式分析(成品1对1源码)

山东布谷科技胡月

视频语音直播app开发 语音直播交友系统搭建 社交app开发 1v1语音系统搭建 视频社交APP开发

2023-01-07:hyper/docker-registry-web是registry的web界面工具之一。请问部署在k3s中,yaml如何写?

福大大架构师每日一题

云原生 k8s k3s 福大大

毫末智行稳健收官2022“三大战役” 火力全开打响2023“四大战役”

科技大数据

智能汽车

用 SwiftUI 实现 AI 聊天对话 app - iChatGPT

37手游iOS技术运营团队

ios SwiftUI openai ChatGPT

社交视频直播一对一交友APP源码之Android如何打包APP

山东布谷科技胡月

语音直播app开发

TSDB助力井下位置服务

CnosDB

数据库 IoT 时序数据库 开源社区 infra

元器件温度系数(ppm/℃)是什么?

不脱发的程序猿

元器件温度系数

中国自动驾驶行业最大智算中心亮相 毫末顾维灏:毫末车端感知架构实现跨代升级

科技大数据

汽车

怎么用vscode创建工程

eng八戒

ide vscode koa

三年成功实现7次OTA升级!MANA六大闭环成毫末产品迭代强大助力

科技大数据

选购LED显示屏时需要注意8个技术参数

Dylan

LED显示屏 户外LED显示屏 led显示屏厂家

MySQL字符集和排序规则详解

C++后台开发

MySQL 数据库 中间件 后端开发 C++开发

盘点毫末智行AI DAY:智算中心成立、六大闭环、MANA五大模型...助力毫末智能驾驶产品快速迭代

科技大数据

VSCODE 配置远程调试环境

eng八戒

ide vscode 服务器

运维训练营第十一课作业

好吃不贵

《零基础学 Python(2023 版)》学习笔记 Day0

IT蜗壳-Tango

Python编程 IT蜗壳教学

尝试阅读理解一份linux shell脚本

eng八戒

bash Shell Linux Kenel 脚本

如何让你的架构设计应用做到高内聚、低耦合?

风铃架构日知录

Java 程序人生 后端 架构设计 后端开发

Guitar Pro2024最新免费版吉他打谱软件下载

茶色酒

Guitar Pro Guitar Pro8 guitar pro2023

HAOMO AI DAY速递:六大闭环、MANA五大模型助力毫末智能驾驶产品快速迭代

科技大数据

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