速来报名!AICon北京站鸿蒙专场~ 了解详情
写点什么

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

评论

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

FabFilter Total Bundle 2024 for Mac(音频插件合集)

Mac相关知识分享

音频插件 mac插件下载 音乐插件

Allavsoft for Mac(视频下载工具) v3.27.2.8935版

Mac相关知识分享

Mac软件 mac下载 视频下载软件 多媒体下载软件

京东商品详情API:解锁电商数据的金钥匙

Noah

分享一些关于2024下半年AI发展的预测

澳鹏Appen

人工智能 预测 大模型 未来技术趋势 AI趋势

云原生技术实践营 · 深圳站:Serverless + AI 专场开启报名!

阿里巴巴云原生

阿里云 Serverless AI 云原生

网络程序通信的流程

EquatorCoco

php 网络 开发语言

Royal TSX for Mac(强大的远程管理软件)

Mac相关知识分享

服务器管理 mac软件下载 远程管理

抑制告警风暴,我们可以做些什么

乘云数字DataBuff

云原生 可观测 告警风暴

3种方式自动化控制APP

快乐非自愿限量之名

运维 自动化

AI 克隆声音,只需 3 分钟(附最全教程)

阿里巴巴云原生

阿里云 AI 云原生 函数计算

Microsoft Remote Desktop for Mac(微软远程连接软件)

Mac相关知识分享

远程软件 Mac软件 远程桌面 mac下载

MES系统适用于哪些行业?MES系统具体功能有哪些?

万界星空科技

mes 万界星空科技 离散型制造业 流程型制造业

解决 JMeter 返回内容中文乱码问题的详细指南

霍格沃兹测试开发学社

如何使用JavaScript实现在线Excel附件的上传与下载?

不在线第一只蜗牛

JavaScript Excel

今日分享丨点亮这四个技能,你也可以成为可视化专家

inBuilder低代码平台

设计 设计开发

技术加持、产品立身“商查利器”爱企查持续助力诚信社会建设

科技热闻

为什么选择SD-WAN进行企业异地组网?

Ogcloud

SD-WAN 企业组网 SD-WAN组网 异地组网 SDWAN

2024-06-19:用go语言,给定一个起始下标为 0 的整数数组 nums 和一个整数 k, 可以执行一个操作将相邻两个元素按位AND后替换为结果。 要求在最多执行 k 次操作的情况下, 计算数组

福大大架构师每日一题

福大大架构师每日一题

深入分析四层/七层网关

不在线第一只蜗牛

网关

淘宝商品详情API接口:商品属性与评论数据综合获取,助力市场研究

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

小程序与小组件技术和场景介绍解析

Onegun

小程序 finclip 小程序组件

AR巡点检系统:慧眼智巡,未来视界

AR玩家

AR Rokid Vision pro 炬目AR AR巡点检

SD-WAN远程监控异地组网方案

Ogcloud

SD-WAN 远程监控 企业组网 SD-WAN组网 异地组网

构建多模态模型,生成主机观测指标,欢迎来战丨2024天池云原生编程挑战赛

阿里巴巴云原生

阿里云 微服务 云原生

中国首例!「DataKit」上架亚马逊云科技 Marketplace add-ons

观测云

AWS

网络调试利器:Chrome Network工具的详细指南

霍格沃兹测试开发学社

Artstudio Pro for mac(绘图和编辑工具)

Mac相关知识分享

Mac软件 照片编辑软件 数字绘画软件 mac下载

电竞体育直播APP源码开发费用,以及搭建所需的各种资料和服务

软件开发-梦幻运营部

IPQ8074 vs. IPQ8064 SOC: A Technical Comparison

wifi6-yiyi

cpu wifi SOC

淘宝、1688海外站与外贸站搭建:全面解析与代购系统源码探讨

技术冰糖葫芦

API 安全 API 开发 API 策略 pinduoduo API

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