终极 Terraform 工作流程:使用 Github Actions 设置 Terraform(和远程状态)
当你尝试自动化或试验云资源时,在 CI 服务器中运行 Terraform 会非常有用。我发现最简单、最便宜、最易用的设置之一是使用 Github Actions 和 S3 来保存状态。
但是学习一门新技术可能会令人沮丧,尤其是当“我做得对吗?”的焦虑袭来时。在本文中,我将引导您从头到尾在 Github Actions 中运行 Terraform 项目——并提供所有您需要了解正在发生的事情及其原因的细节。
在本文结束时,您将在 Github Actions 上使用远程状态运行一个 Terraform 项目。
我们今天正在构建什么
在撰写了大量关于 Terraform 的文章后,我不断收到请求,希望能够提供一个简单的 Terraform 工作流程。所以今天,我将分享如何使用 Terraform 和 Github Actions 来简单地设置一个工作流程。我个人不仅在日常实验中使用它,还在学习和实际应用中使用它。
注意:今天文章的所有代码都在以下 Github repo 中,因此请务必打开它以供参考!
https://github.com/loujaybee/terraform-aws-github-action-bootstrap
Terraform 是学习云计算的好方法,请查看本文了解原因:在云计算之前学习 Terraform 的 5 个重要原因。
Terraform、AWS 和 Github Actions — 为什么?
但是,在我们进入设置之前,让我们快速回顾一下每种技术的作用以及为什么要使用它们。
为什么选择 Terraform?
Terraform 徽标
Terraform 是一款 CLI 工具,允许您以声明式代码方式创建基础架构。当您的基础架构以代码形式编写时,您可以应用相同的质量保证流程,例如代码审查和构建管道。
我非常喜欢 Terraform 的主要原因之一是它与云平台无关,您可以将它与 AWS、GCP 等一起使用。这意味着一旦您了解了 Terraform,如果您想使用其他云服务,就无需重新学习基础设施即代码工具。
需要复习一下“基础设施即代码”吗?请查看:《基础设施即代码:快速简明讲解》。或者想了解声明式基础设施即代码的详细信息?请查看:《声明式 vs. 命令式基础设施即代码》
为什么选择 AWS?
AWS 徽标
那么问题来了:为什么选择 AWS?有两个原因:一是因为……它是 AWS(稍后会详细介绍),二是因为我需要集成一些东西才能创建演示!
事实上,您也可以将今天的 CI 设置复用到所有其他云提供商。如果您感兴趣,我们将在文章末尾详细介绍如何操作。
但我选择 AWS 的原因是,它很可能是你想学习或已经在使用的云提供商。不仅如此,AWS 还是市场领导者,并且拥有最成熟的 Terraform 社区。
刚接触 AWS?请查看:初学者该从哪里开始学习 AWS?以及如何开始学习
为什么选择 Github Actions?
GithubActionsBeta
最后,为什么要使用 Github Actions?首先,Github Actions 与 Github 集成,无需设置任何其他帐户,从而减少您的工作量并加快设置速度。
Github Actions 不仅设置快捷简单,而且重要的是Github Actions 是免费的(对于低使用率而言),这意味着对于任何想要设置此工作流程的人来说,它可能具有最广泛的可访问性。
但除了这两个原因之外,Github Actions 仍然是一个可靠的 CI 工具,并且它具有一些不错的功能,例如基于容器(但这是另一天的话题!
文章的结构
好了,关于今天的内容介绍就到这里,让我们正式进入正题。内容很丰富,为了便于理解,我们将分为两部分……
在第一部分中,我们将使用 S3 设置 Terraform 后端。我们需要这个后端才能在 CI 中运行 Terraform(别担心,我们稍后会讨论原因)。然后,在第二部分中,我们将把 Terraform 管道放入 Github 操作中,并使用我们之前创建的远程状态。
在开始之前,我必须先提醒你一下:使用 CI 设置 Terraform 可能会相当复杂。目前还没有简单的方法,所以我们需要完成一些(看似复杂的)步骤才能让一切正常工作。但请坚持读完本文,因为所有细节都会在过程中揭晓。
使用 CI 和远程状态设置 Terraform 的过程可能相当繁琐,但我会尽力向您详细讲解我们每一步的操作以及背后的原因,以便您能够更好地理解。请相信这个过程!
听起来不错?那就开始吧!
第 1 部分:创建后端
因此,我们需要做的第一件事就是创建 Terraform 后端。但在这之前,我们需要了解什么是后端,让我来解释一下……
什么是 Terraform 后端?
Terraform 的工作原理是将云提供商中现有的资源(使用云 API)与存储的状态文件进行比较。状态文件是您使用 Terraform 管理的资源的表示。
把状态想象成库存清单。当你从库存中取出某件物品时,它就从清单中移除了。有了清单,你就可以快速查看库存中的内容,而无需手动查看。
状态文件就是清单。它实际上是一个基本的 JSON 文件。每当你运行 Terraform 时,它都会更新你的状态文件,该文件默认存储在运行它的机器上。但是,如果我们想与其他人协作或在 CI 工具中使用 Terraform,那么将文件存储在本地是行不通的。
在这种情况下,我们需要将状态存储在“远程”位置,这就是远程状态的概念。因为我们使用 AWS,所以我们可以使用 S3 作为我们的远程状态位置。
因此,为了让我们的 Terraform 设置在 Github Actions CI 中运行,我们需要做的第一件事就是设置我们的远程状态存储桶。
步骤 1:克隆仓库
首先,您需要克隆该仓库。该仓库包含一个最基本的 Terraform 设置和一些 Github Action 工作流,这些工作流会在拉取请求到主干时执行 Terraform 计划,并在合并到主干时进行部署。
git clone git@github.com:loujaybee/terraform-aws-github-action-bootstrap.git
步骤 2:本地设置您的 AWS 访问密钥
创建 AWS 访问密钥
现在,为了访问 AWS,我们需要获取 AWS 账户的访问权限。具体方法就是通过 AWS 密钥。
您需要从您的 AWS 帐户安全凭证页面下载这些并将它们设置在您的本地环境中。
在 bash 中你可以这样做...
set AWS_ACCESS_KEY_ID=YOUR_ACCESS_KEY
set AWS_SECRET_ACCESS_KEY=YOUR_SECRET_KEY
重要提示:攻击者可以利用您的访问密钥,对您的 AWS 账户执行任何您的用户能够执行的操作。因此,请像警惕您的在线银行账户密码一样,对访问密钥保持高度警惕。
如果您不太清楚 AWS 密钥是什么以及它们如何工作,请务必查看这篇文章:AWS 访问密钥 - 安全使用它们的 5 个技巧。
步骤 3:安装 Terraform
Terraform 版本
接下来,为了运行 Terraform,您需要在本地安装 Terraform。请按照其网站上的说明进行操作。现在,当您运行……
terraform -v
您应该会看到正在运行的 Terraform 版本。
步骤 4:运行 Terraform Init
执行 Terraform Init
现在安装了 Terraform,进入之前克隆的存储桶的根目录并运行...
terraform init
运行此命令将下载 Terraform 需要执行的任何必要插件/内容,在我们的例子中主要是 AWS 提供商代码。
步骤 5:设置存储桶名称
Terraform 后端存储桶名称
接下来,我们需要更新仓库中的存储桶名称。由于存储桶名称需要全局唯一,因此您需要更新存储桶名称。
因此继续打开main.tf
文件并更新两个存储桶值(是的,还有注释掉的值,我们稍后会需要它)为与您的项目相关的名称。
类似于……
my-demo-terraform-backend
或者my-home-automation-terraform-backend
步骤 6:创建存储桶
后端 Terraform S3 存储桶
现在,Terraform 设置完毕,存储桶名称已配置完毕,AWS 访问权限也已设置完毕,您应该能够运行您的第一个 Terraform 代码了!
运行应用来创建您的 AWS 存储桶,如下所示...
terraform apply
第一部分到此结束。到目前为止,你应该已经有一个存储桶,我们将用它来存储远程状态。现在我们可以设置 CI 管道,以便在远程(而不是在我们的机器上)运行 Terraform。
但是,你遇到了一个问题……你刚刚在本地机器上创建了一个 AWS 资源,但还没有将状态文件存储在任何地方。我们不想将状态文件存储在 Github 中,因为我们的 CI 无法提交到 Github——所以我们需要将该状态推送到我们新创建的 bucket 中。
第 2 部分:在 Github Actions 上设置 Terraform
在本部分中,我们将讨论两件主要的事情:将我们之前创建的本地状态移动到我们的新远程存储桶,然后授权 Github Actions 运行 Terraform。
步骤 7:取消注释后端配置
正如我们之前所说,将状态文件保存在运行 Terraform 的机器上对于在 CI 中运行 Terraform 不起作用。
因此,要让 Terraform 在 Github Actions 中运行,首先要做的就是取消注释main.tf
文件中的后端配置。后端配置块告诉 Terraform 我们要使用 AWS 和 S3 作为后端远程状态存储。
步骤 8:将您的状态转移到远程
将本地 Terraform 状态复制到远程状态
现在我们要重新运行 terraform init。
当我们重新初始化 Terraform 时,它会注意到我们当前的设置(带有后端)与我们最初使用本地状态的设置不同。由于 Terraform 非常智能,它会询问我们是否要将当前创建的状态传输到远程存储桶中。
等等……我们先想一下我们在做什么,因为这涉及很多元信息。本质上,我们要把后端 S3 的资源信息移动到后端 S3 中。这很奇怪,我们为什么要这么做?
即使将后端 S3 配置保留在当前状态,也能确保后端存储桶也在 Terraform 中进行管理。如果我们想要执行诸如更新存储桶版本控制、配置存储桶权限或实现 S3 备份等操作,这将非常有用。
现在,我们的后端 S3 已经设置并配置完毕。现在只差一件事:Github Actions 中的 CI 服务器需要 AWS 权限才能执行我们的 Terraform。
步骤 9:设置你的 Github Actions Secrets
Github 中的 AWS 秘密
您需要做的第一件事是确保 Github Actions 有权对您的 AWS 账户进行操作。因此,请将您的 AWS 凭证添加到您的代码库的 secrets 设置中(这些设置是针对每个代码库配置的)。
使用与本地机器上完全相同的密钥名称,并设置AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
。这将允许 Terraform AWS 插件进行身份验证以创建您的资源。
步骤 10:提交、推送并运行
在 Github Actions 中成功应用 Terraform
现在,最后一步很简单!提交并将你的更改(主要是你的存储桶名称)推送到你克隆的仓库,然后观察 Github Actions 是否完成!
git add .
添加所有本地更改。
git commit -m "My changes"
提交您的更改。
git push
将您的更改发送到 Github。
瞧!就这么简单。现在,您已经拥有一个已配置 Terraform 后端并正常运行的 Terraform 管道。
高级设置(使用 DynamoDB 锁)
如果您想使设置更高级,可以使用 DynamoDB 引入 Terraform 锁。锁只是确保您的 Terraform 不会同时由两个人执行。
但是锁主要在团队环境中是必要的,因为可能会同时运行 Terraform 应用。不过,如果你觉得有必要,我会把它留作练习,你自己去查阅文档来判断!
重复使用 GCP、Azure 等的设置。
云供应商徽标
不过,在开始之前,我在文章开头确实提到过如何将设置复用到不同的云提供商。其实很简单。你只需要在你的文件中添加另一个 Terraform 配置main.tf
(比如我们现有的 AWS 配置)来配置你的其他帐户即可。
设置新的提供商后,您只需从新提供商添加资源,Terraform 就会创建它们。Terraform 不关心您的后端存储在 AWS 还是 S3,也不关心您是否在 Github Actions 上运行。
关于 Terraform 的更多信息
如果你想了解更多关于 Terraform 和基础设施即代码的知识,我强烈推荐我的免费Terraform Kick Start 电子邮件课程。或者你也可以阅读以下文章:
- 终极 Terraform 工作流程:使用 Github Actions 设置 Terraform(和远程状态)
- 学习 Terraform 的最佳方法是什么?
- 使用 Terraform 和 Github Actions 创建 AWS S3 网站
- 什么是不可变基础设施?
- 将现有基础设施迁移到 Terraform 的 3 个步骤
- 在云计算之前学习 Terraform 的 5 个重要原因。
- Terraform 模块:可维护基础设施代码指南
- 声明式 vs. 命令式基础设施即代码
- 不到 20 分钟即可了解 Terraform 的 6 个基本原理
- 3 个 Terraform 功能助您轻松重构基础设施
成为 Terraform 大师!
这就是我们今天要讲的所有内容。我真心希望这些内容能帮助你掌握设置 Terraform 和 Github Actions 所需的各个部分。
我真心觉得这是一个很棒的设置,在学习 Terraform 和 AWS 时非常有用。现在,您可以简单、快速且可重复地创建、销毁和更新云资源。
一切就绪。现在,您应该已经拥有一个在 Github Actions 中运行 Terraform 的良好设置,并且具有可重复性、可追溯性和更好的易用性。祝您实验愉快!
很快与云原生朋友交谈。
文章《终极 Terraform 工作流程:使用 Github Actions 设置 Terraform(和远程状态)》首先出现在The Dev Coach上。
Lou 是《云原生软件工程简报》的编辑,该简报致力于让云软件工程更易于理解和普及。每两周,您都会收到一份面向云原生软件工程师的精彩内容摘要,直接发送到您的邮箱。
文章来源:https://dev.to/loujaybee/the-ultimate-terraform-workflow-setup-terraform-and-remote-state-with-github-actions-3h05