以SRE的角度解释,这是关于日本最简单的IaC入门的讲述
首先
我在东京的某家公司工作已经快三个月了。虽然我的职位是SRE,但这次我想总结一下IaC(基础设施即代码)。(但我觉得太害羞了不好意思自称为SRE级别。。。)
虽然我对基础设施的代码化很感兴趣,但并不是很了解,我只有前端或后端的经验,但对基础设施方面也开始感兴趣了。希望这对那些和我有类似情况的人有所帮助。
原本上来讲,IaC是什么
云编排(如CloudFormation、Terraform和Ansible)是指使用代码而不是手动过程来管理和设置基础设施。(引自RedHat公司)
换句话说,通过使用代码管理以往由文档和手动方式管理的网络基础设施,使任何人都能够读懂,并进行管理。
从2022年的GitHub使用语言增长率来看,HCL(即Terraform)排名第一,已经在全球范围内得到广泛应用。
手动管理基础设施存在以下缺点。
-
- インフラは構築されているが、手順書が更新されていないため、実態との乖離が生じてしまう。
-
- それまでの財産で入ったソフトウェア・設定によって奇跡的にサーバーが稼働している状態であり、いつ壊れてもおかしくない。
-
- 手順書が複雑になりすぎて、ヒューマンエラーを誘発してしまう。
- (人によっては)そもそも手順書通りに再現、構築ができない。手順書の更新ができない。
使用IaC来解决这些问题。通过引入IaC,可以获得以下优点和缺点。
优点
-
- 人件費を削減できる。
-
- 人為的なミスを未然に防げる。それによって品質が向上する。
- モジュールを利用することによって、サービスの提供が柔軟になる。
顺着解释,如果能将之前手动管理的基础设施进行编码化,就可以自动化安装和配置软件,并且能够减少工作量。
由于无论由谁来进行操作,结果都是相同的,即使像我这样经验不丰富的人也能够在不出错的情况下修改服务器的设置。(这真的非常棒!)
此外,由于可以灵活地管理不同服务所需的不同设置,所以可以在该服务中搭建数据库。而在另一个服务中采用不同的配置,等等,这些都可以轻松实现,从而提高了服务的灵活性,使得搭建验证环境变得容易。
缺点
-
- システム構築のためにIaCのスキルが別に必要で、最初の構築には時間がかかってしまう。(私はまだ暗中模索)
-
- IaCツールのVerによって記述が大きく変化するため、キャッチアップが大変である。
- 簡単な設定変更でも時間がかかる場合がある。(例えばCLIからECSコンテナに接続できるようにするだけでも、公式ドキュメントを調べて、実装方法を探して検証する必要があります。AWSのマネジメントコンソールを使えば一発。)
IaC的技能需要与基础设施知识分开。另外,由于Terraform的版本不同,编写方式也会有很大差异,因此适应这些变化也是一项艰巨的任务。据传闻,对现有系统进行Terraform版本升级的工作,需要耗费巨大的工时和难度。
此外,即使使用AWS管理控制台,有时也需要花费一些时间才能完成一次解决问题的配置更改。
Ansible的特点和历史特点
Ansible是一种开源的配置管理工具(用于辅助管理服务器状态和配置的工具)(Python编写)。最初是Ansible公司开发的,后来由RedHat公司收购,并因此受到关注。
作为Ansible的特点,按照以yaml格式编写的Playbook中所述的代码,自动对执行对象称为Inventory的服务器和网络进行配置。预先定义服务器和网络应如何配置(结构),然后如果实际情况与定义内容有差异,Ansible会自动将其配置(结构)更改为预先定义的内容。Playbook和Inventory齐备即可运行,这也是其特点之一。
由于Ansible可以代替人进行SSH连接,因此需要将指纹注册到首次连接的服务器上,这也是我被前辈工程师反复教导的一点。
Terraform的特点和历史
Terraform是HashiCorp公司开发的配置管理工具(使用Go语言编写)。我们可以使用一种名为HCL的专有语言来编写描述。
可以通过代码来管理基础设施资源,如下所示。
resource "aws_vpc" "main" {
cidr_block = "10.0.0.0/16"
enable_dns_hostnames = "true"
tags = {
Name = "aws-terraform-vpc"
}
}
resource "aws_subnet" "public-a" {
vpc_id = aws_vpc.main.id
availability_zone = "ap-northeast-1a"
cidr_block = "10.0.0.0/24"
map_public_ip_on_launch = true #サブネットで起動したインスタンスにパブリックIPを許可する
tags = {
Name = "public-a"
}
}
查看官方文档后,与CloudFormation相比,可以管理更多的云资源是其中一个优点。
Ansible和Terraform之间的区别。
由于被称为相同的配置管理工具,许多人认为Ansible和Terraform在用途上非常相似,但这两者的角色实际上是不同的。(即使和后端工程师的朋友聊天时,我也经常被问到这个问题。)
Terraform主要用于管理云资源,而Ansible则负责管理已创建服务器的软件方面。使用Terraform构建服务器,然后使用Ansible来管理实际构建好的服务器的状态,这就是大致的概念。

Ansible、Chef和Puppet之间的比较。
以下是比较表:作为同一种配置管理工具,也有人提到了基于Ruby的Chef和Puppet。

作为Ansible常被提到的优点之一是它可以在无需代理的情况下使用。此外,由于格式采用了yaml形式,这也是一种其他基础设施工程师也将使用的格式,因此具有很高的通用性。只要掌握了yaml,就不需要编程知识,这也成为选择该工具的原因之一。相反,它并没有实现GUI,并且不适用于复杂的处理。
Terraform和CloudFormation的比较
尽管Terraform可以管理AWS、Azure和Google Cloud Platform等各种云资源,但CloudFormation主要用于AWS资源管理。在Terraform出现之前,人们已经开始使用CloudFormation,而Terraform则崭露头角,以弥补其弱点。(有一个名为”terraform plan”的命令,它会在现阶段的代码中告诉您将构建哪些资源。)
CloudFormation使用yaml格式进行编写,而Terraform使用一种名为HCL的专有语言进行编写。(由于需要学习HCL,学习成本可能会稍高?)
如果愿意的话,Terraform提供了简单的教程,请参考一下。
结束
您认为怎么样呢?如果能对您有一点点的参考,我将非常高兴。
对于我自己来说,我对业务的贡献还很低,每天都只是学习为主。
我希望在提高工作理解的同时,也能深入了解领域知识,成为一名优秀的SRE工程师,为公司做出更大的贡献。
非常感谢您读到这里。