34、使用 Terraform、GitHub 和 Atlantis 实现 CI/CD

使用 Terraform、GitHub 和 Atlantis 实现 CI/CD

1. 部署相关概念

在 Terraform 中,持续部署归结为运行 terraform apply 。这可以通过简单的 Bash 脚本自动完成,但难点在于将其集成到 CD 工具中,以确保不会误删数据。假设集成测试做得很好,且有足够信心在无需用户进一步交互的情况下进行部署,就可以让其自动运行。

之前展示过使用 Jenkins、GitHub Actions 甚至 Bash 脚本实现自动化的示例,这些方法能将更改部署到基础设施。不过,也有专门的解决方案,下面来看看最受欢迎的几种。

2. 常用工具介绍
工具名称 简介 特点 官网
HashiCorp Cloud HashiCorp 提供的基于云的服务,用于基础设施自动化和管理 包含 Terraform、Vault、Consul 和 Nomad 等流行工具,用户可使用本地相同工具创建和管理基础设施
Terraform Cloud HashiCorp 专门针对 Terraform 推出的服务 为团队提供协作基础设施代码、存储配置状态和自动化工作流的中心平台,具备工作区管理、版本控制和协作工具等功能
Scalr 云管理平台,提供企业级云基础设施自动化和管理解决方案 多云管理平台,有商业版(SaaS 解决方案)和开源版;能运行 Terraform 代码,具备成本分析、Web UI、集中单点登录、角色和模块注册表等功能
Spacelift 云原生 IaC 平台,帮助开发团队使用 Terraform、Pulimi 或 CloudFormation 自动化和管理基础设施 支持 Kubernetes 自动化,提供版本控制、自动化测试、持续交付、实时监控和警报等功能 https://spacelift.com
Env0 SaaS 平台,使团队能够使用 Terraform 自动化基础设施和应用交付工作流 提供自动化环境配置、与流行 CI/CD 工具集成、支持多云提供商等功能 https://www.env0.com/
Atlantis 开源项目,简化 Terraform 基础设施代码管理 与现有版本控制系统集成,监控包含 Terraform 代码更改的拉取请求,自动创建环境并提供预览,支持自动合并拉取请求和应用更改
3. Atlantis 工作原理

Atlantis 通过与现有的版本控制系统(如 GitHub 或 GitLab)集成,持续监控包含 Terraform 代码更改的拉取请求。当新的拉取请求打开时,Atlantis 会自动为更改创建新环境,并在拉取请求中发布带有环境链接的评论,方便审查人员在实时环境中查看更改并提供反馈。更改审查和批准后,Atlantis 可自动合并拉取请求并将更改应用到目标基础设施。

4. 部署 Atlantis 到 AWS

以下是部署 Atlantis 到 AWS 的具体步骤:

graph TD;
    A[克隆 GitHub 仓库] --> B[创建 Terraform 变量文件];
    B --> C[更新变量];
    C --> D[运行 terraform init];
    D --> E[运行 terraform plan];
    E --> F[运行 terraform apply];
  • 克隆 GitHub 仓库
git clone git@github.com:terraform-aws-modules/terraform-aws-atlantis.git
  • 创建 Terraform 变量文件
cp terraform.tfvars.sample terraform.tfvars
  • 更新变量
    需要更新的变量如下:
cidr = "10.10.0.0/16"
azs = ["eu-west-1a", "eu-west-1b"]
private_subnets = ["10.10.1.0/24", "10.10.2.0/24"]
public_subnets = ["10.10.11.0/24", "10.10.12.0/24"]
route53_zone_name = "example.com"
ecs_service_assign_public_ip = true
atlantis_repo_allowlist = ["github.com/terraform-aws-modules/*"]
atlantis_github_user = ""
atlantis_github_user_token = ""
tags = {
    Name = "atlantis"
}
- `atlantis_repo_allowlist`:指向希望 Atlantis 使用的仓库。
- `route53_zone_name`:改为类似 `automation.yourorganisation.tld` 的公共域名,GitHub 将使用它向 Atlantis 发送 Webhook 触发构建。
- `atlantis_github_user`:GitHub 用户名。
- `atlantis_github_user_token`:需访问 GitHub 网站生成个人访问令牌(PAT),参考文档:https://docs.github.com/en/authentication/keeping-your-account-and-data-secure/creating-a-personal-access-token。
  • 运行 terraform init
admin@myhome~/aws$ terraform init
  • 运行 terraform plan
admin@myhome~/aws$ terraform plan

如果输出类似如下内容,可进行应用:

Plan: 49 to add, 0 to change, 0 to destroy.
  • 运行 terraform apply
admin@myhome~/aws$ terraform apply

应用完成后会输出类似如下内容:

Apply complete! Resources: 49 added, 0 changed, 0 destroyed.

Outputs:
alb_arn = "arn:aws:elasticloadbalancing:eu-central-1:673522028003:loadbalancer/app/atlantis/8e6a5c314c2936bb"
atlantis_url = "https://atlantis.atlantis.devopsfury.com"
atlantis_url_events = "https://atlantis.atlantis.devopsfury.com/events"
public_subnet_ids = [
    "subnet-08a96bf6a15a65a20",
    "subnet-0bb98459f42567bdb",
]
webhook_secret = <sensitive>

若一切正常,可通过之前创建的 atlantis.automation.yourorganisation.tld 域名访问 Atlantis 网站。要查看 webhook_secret ,可运行:

admin@myhome:~/aws$ terraform output webhook_secret
5. 创建 Webhook

可以使用 Terraform 自动化创建 Webhook,模块链接:https://github.com/terraform-aws-modules/terraform-aws-atlantis/tree/master/examples/github-repository-webhook。也可手动创建,参考文档:https://docs.github.com/en/webhooks-and-events/webhooks/creating-webhooks,记得使用 Terraform 输出变量中的 webhook_secret 。创建 Webhook 的详细文档可参考:https://www.runatlantis.io/docs/configuring-webhooks.html#github-github-enterprise。

6. 运行 Terraform 使用 Atlantis

要执行 terraform plan ,需在 GitHub 仓库创建新的拉取请求。创建一个模块来创建 S3 桶和 DynamoDB 表, main.tf 文件内容如下:

# Configure the AWS Provider
provider "aws" {
    region = var.region
}

terraform {
    required_version = ">=1.0"
    backend "local" {
        path = "tfstate/terraform.local-tfstate"
    }
}

resource "aws_s3_bucket" "terraform_state" {
    bucket = "terraform-states"
    acl = "private"
    force_destroy = false
    versioning {
        enabled = true
    }
    server_side_encryption_configuration {
        rule {
            apply_server_side_encryption_by_default {
                sse_algorithm = "AES256"
            }
        }
    }
}

resource "aws_dynamodb_table" "dynamodb-terraform-state-lock" {
    name = "terraform-state-lock"
    hash_key = "LockID"
    read_capacity = 1
    write_capacity = 1
    attribute {
        name = "LockID"
        type = "S"
    }
    tags = {
        Name = "DynamoDB Terraform State Lock Table"
    }
}

variables.tf 文件内容:

variable "region" {
    type = string
    default = "eu-central-1"
}

将这些文件添加到 Git 并提交更改,创建新的拉取请求后,在拉取请求中添加评论 atlantis plan 即可触发计划。

Atlantis 目前不支持自动应用更改,但可以在 CI 级别实现自动化。例如,使用 GitHub 时,可创建 GitHub Action,在测试成功后添加 atlantis apply 评论,触发 Atlantis 应用更改并报告状态。

通过使用 Atlantis,开发人员无需在本地机器上直接运行 Terraform 即可修改基础设施,避免多人同时应用更改造成的破坏,同时提高了基础设施更改的可见性。不过,使用 Terraform 构建 CI/CD 仍有很长的路要走,基础设施即代码(IaC)的测试功能仍落后于其他编程语言,但许多开发者正在努力改进。

7. 总结

本文探讨了使用 Terraform 进行 IaC 的好处,以及在 Terraform 工作流中纳入 CI/CD 流程的重要性。介绍了测试基础设施和各种自动化部署工具,重点讲解了如何将开源工具 Atlantis 部署到 AWS 并配置 GitHub 触发 terraform plan terraform apply 。通过将 Atlantis 集成到 Terraform 工作流中,可以提高协作效率、减少错误,并实现更快、更安全的基础设施更改。

8. 练习
  • 尝试按照文档 https://www.runatlantis.io/guide/testing-locally.html 在本地部署 Atlantis。
  • 创建一个仓库,为自己配置 Webhook 和个人访问令牌(PAT),并为新仓库运行计划(提示:可以使用 null 资源进行测试)。
  • 在其中一个 CD 解决方案网站上创建账户,并尝试使用该 SaaS 运行计划,公共仓库通常有免费计划。

使用 Terraform、GitHub 和 Atlantis 实现 CI/CD

9. 深入理解 Atlantis 的优势

Atlantis 为 Terraform 的使用带来了诸多显著优势,以下通过表格详细展示:
| 优势 | 具体说明 |
| ---- | ---- |
| 简化工作流程 | 提供简洁的创建、审查和合并拉取请求的工作流,减少手动操作,提高效率。 |
| 实时预览 | 自动创建新环境并提供链接,让审查人员在实时环境中查看更改,及时反馈。 |
| 分布式锁定 | 避免多人同时应用更改,防止冲突和数据损坏,保护基础设施安全。 |
| 提高可见性 | 所有更改都在 GitHub 上进行跟踪和审查,团队成员可清晰了解基础设施的变更情况。 |

10. 常见问题及解决方法

在使用 Atlantis 和 Terraform 进行 CI/CD 过程中,可能会遇到一些问题,以下是常见问题及对应的解决方法:
| 问题 | 现象 | 解决方法 |
| ---- | ---- | ---- |
| Atlantis 无法访问 | 访问 Atlantis 网站时出现 HTTP 500 错误或无法打开页面。 | 前往 AWS 控制台,找到 ECS 服务中的 Atlantis 集群,查看任务状态和日志;也可在 CloudWatch 服务的 atlantis 日志组中查看详细日志。 |
| Webhook 未触发 | 拉取请求更改后,Atlantis 未自动创建环境和评论。 | 检查 GitHub 仓库的 Webhook 配置,确保 URL 和密钥正确;查看 Terraform 输出的 webhook_secret 是否与配置一致。 |
| Terraform 计划失败 | terraform plan 执行时出现错误。 | 检查 Terraform 代码的语法错误,确保变量配置正确;查看 Atlantis 评论中的错误信息,定位问题所在。 |

11. 扩展应用场景

除了上述基本的使用场景,Atlantis 还可以在更多场景中发挥作用,以下是一些扩展应用场景的介绍:
- 多环境管理 :通过配置不同的 Terraform 模块和变量,可以使用 Atlantis 管理多个环境,如开发、测试和生产环境。在不同环境的拉取请求中,Atlantis 会自动根据环境配置创建相应的预览环境。
- 多仓库集成 :如果团队有多个使用 Terraform 的仓库,可以将 Atlantis 配置为支持多个仓库。只需在 atlantis_repo_allowlist 中添加相应的仓库地址,Atlantis 就可以监控这些仓库的拉取请求并进行处理。
- 与其他工具集成 :Atlantis 可以与其他 CI/CD 工具和监控工具集成,进一步完善 DevOps 工作流。例如,与 Slack 集成,当拉取请求有新的评论或状态更新时,自动发送通知到 Slack 频道。

12. 未来发展趋势

随着云计算和 DevOps 技术的不断发展,使用 Terraform 和 Atlantis 进行 CI/CD 也将面临新的挑战和机遇。以下是一些未来可能的发展趋势:

graph LR;
    A[自动化程度提升] --> B[更多自动化任务];
    A --> C[减少人工干预];
    D[安全性增强] --> E[更严格的访问控制];
    D --> F[数据加密和保护];
    G[兼容性扩展] --> H[支持更多云提供商];
    G --> I[与更多工具集成];
  • 自动化程度提升 :未来,Atlantis 可能会支持更多的自动化任务,如自动处理错误、自动回滚等,进一步减少人工干预,提高部署效率。
  • 安全性增强 :随着安全意识的提高,Atlantis 和 Terraform 可能会加强安全功能,如更严格的访问控制、数据加密和保护等,确保基础设施的安全。
  • 兼容性扩展 :为了适应不同的云环境和工具,Atlantis 可能会不断扩展其兼容性,支持更多的云提供商和与更多的 CI/CD 工具集成。
13. 最佳实践建议

为了更好地使用 Terraform、GitHub 和 Atlantis 实现 CI/CD,以下是一些最佳实践建议:
- 代码管理
- 使用版本控制工具(如 Git)管理 Terraform 代码,确保代码的可追溯性和协作性。
- 遵循代码规范和最佳实践,编写清晰、可维护的 Terraform 代码。
- 环境配置
- 使用变量文件管理不同环境的配置,避免硬编码。
- 在生产环境中,使用远程状态存储,确保状态文件的安全和共享。
- 审查流程
- 建立严格的代码审查流程,确保所有更改都经过审查和批准。
- 利用 Atlantis 的实时预览功能,让审查人员在实际环境中查看更改。
- 监控和日志
- 定期监控 Atlantis 和 Terraform 的运行状态,及时发现和解决问题。
- 保存详细的日志,以便在出现问题时进行追溯和分析。

14. 总结回顾

通过本文的介绍,我们了解了使用 Terraform 进行基础设施即代码(IaC)的强大功能,以及如何通过 GitHub 和 Atlantis 实现高效的 CI/CD 工作流。Atlantis 作为一个开源工具,为 Terraform 的使用提供了便捷的拉取请求管理和自动化部署功能,大大提高了团队的协作效率和基础设施的安全性。

在实际应用中,我们需要根据团队的需求和环境特点,合理配置和使用这些工具。同时,不断关注技术的发展趋势,及时调整和优化工作流,以适应不断变化的业务需求。

15. 进一步探索

如果你对使用 Terraform、GitHub 和 Atlantis 实现 CI/CD 感兴趣,可以进一步探索以下内容:
- 深入学习 Terraform 的高级功能,如模块开发、数据资源使用等。
- 研究更多的 CI/CD 工具和技术,如 Jenkins、GitLab CI/CD 等,对比不同工具的优缺点。
- 参与开源社区,与其他开发者交流经验和分享最佳实践,不断提升自己的技术水平。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值