终极 Terraform 工作流程:使用 Github Actions 设置 Terraform(和远程状态)

2025-06-07

终极 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 徽标

Terraform 是一款 CLI 工具,允许您以声明式代码方式创建基础架构。当您的基础架构以代码形式编写时,您可以应用相同的质量保证流程,例如代码审查和构建管道。

我非常喜欢 Terraform 的主要原因之一是它与云平台无关,您可以将它与 AWS、GCP 等一起使用。这意味着一旦您了解了 Terraform,如果您想使用其他云服务,就无需重新学习基础设施即代码工具。

需要复习一下“基础设施即代码”吗?请查看:《基础设施即代码:快速简明讲解》。或者想了解声明式基础设施即代码的详细信息?请查看:《声明式 vs. 命令式基础设施即代码》

为什么选择 AWS?

AWS 徽标

AWS 徽标

那么问题来了:为什么选择 AWS?有两个原因:一是因为……它是 AWS(稍后会详细介绍),二是因为我需要集成一些东西才能创建演示!

事实上,您也可以将今天的 CI 设置复用到所有其他云提供商。如果您感兴趣,我们将在文章末尾详细介绍如何操作。

但我选择 AWS 的原因是,它很可能是你想学习或已经在使用的云提供商。不仅如此,AWS 还是市场领导者,并且拥有最成熟的 Terraform 社区

刚接触 AWS?请查看:初学者该从哪里开始学习 AWS?以及如何开始学习

为什么选择 Github Actions?

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 密钥。

您需要从您的 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。请按照其网站上的说明进行操作。现在,当您运行……

terraform -v

您应该会看到正在运行的 Terraform 版本。

步骤 4:运行 Terraform Init

执行 Terraform Init

执行 Terraform Init

现在安装了 Terraform,进入之前克隆的存储桶的根目录并运行...

terraform init

运行此命令将下载 Terraform 需要执行的任何必要插件/内容,在我们的例子中主要是 AWS 提供商代码。

步骤 5:设置存储桶名称

Terraform 后端存储桶名称

Terraform 后端存储桶名称

接下来,我们需要更新仓库中的存储桶名称。由于存储桶名称需要全局唯一,因此您需要更新存储桶名称。

因此继续打开main.tf文件并更新两个存储桶值(是的,还有注释掉的值,我们稍后会需要它)为与您的项目相关的名称。

类似于……

my-demo-terraform-backend或者my-home-automation-terraform-backend

步骤 6:创建存储桶

后端 Terraform S3 存储桶

后端 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 状态复制到远程状态

现在我们要重新运行 terraform init。

当我们重新初始化 Terraform 时,它会注意到我们当前的设置(带有后端)与我们最初使用本地状态的设置不同。由于 Terraform 非常智能,它会询问我们是否要将当前创建的状态传输到远程存储桶中。

等等……我们先想一下我们在做什么,因为这涉及很多元信息。本质上,我们要把后端 S3 的资源信息移动到后端 S3 中。这很奇怪,我们为什么要这么做?

即使将后端 S3 配置保留在当前状态,也能确保后端存储桶也在 Terraform 中进行管理。如果我们想要执行诸如更新存储桶版本控制、配置存储桶权限或实现 S3 备份等操作,这将非常有用。

现在,我们的后端 S3 已经设置并配置完毕。现在只差一件事:Github Actions 中的 CI 服务器需要 AWS 权限才能执行我们的 Terraform。

步骤 9:设置你的 Github Actions Secrets

Github 中的 AWS 秘密

Github 中的 AWS 秘密

您需要做的第一件事是确保 Github Actions 有权对您的 AWS 账户进行操作。因此,请将您的 AWS 凭证添加到您的代码库的 secrets 设置中(这些设置是针对每个代码库配置的)。

使用与本地机器上完全相同的密钥名称,并设置AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY。这将允许 Terraform AWS 插件进行身份验证以创建您的资源。

步骤 10:提交、推送并运行

在 Github Actions 中成功应用 Terraform

在 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 大师!

这就是我们今天要讲的所有内容。我真心希望这些内容能帮助你掌握设置 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
PREV
使用 Create-React-App 和 Express 结论
NEXT
🚀 10+ 个有望赢得 2024 年黑客马拉松的项目🏆💻