加速 Terraform init

简介: 编写 Terraform 模板,第一步一定是执行 `terraform init` 命令,来初始化一些后续操作需要用到的设置和数据,包括自动下载使用到的 Provider。但是对于国内用户来说,由于 Terraform Provider 并没有国内源,所以 terraform init 时下载 Provider 就成了耗时严重的环节。

前言

Terraform 是开源的,用于资源编排管理的自动化工具。 Infrastructure as Code ,以代码的形式将所要管理的资源定义在模板中,通过解析并执行模板来自动化完成所定义资源的创建、变更和管理。

相信绝大多数云上用户对其已经不再陌生,并且越来越多的公司和开发者已经开始使用 Terraform 来编排管理他们的云资源基础设施。更多的 Terraform 使用,我们可以参考玩转阿里云 Terraform 系列文章

其中 Terraform 提供了很多 Providers 供用户使用,当然也包括阿里云 Provider。Terraform 通过 Provider 来完成对基础设施资源的管理。不同的基础设施提供商都需要提供一个 Provider 来实现对自家基础设施的统一管理。目前,Terraform 累计提供了超过 200 个 Providers。因此 Terraform 可以通过一致的流程以及 Provider 机制来帮助用户进行高效便利的多云管理。

我们编写 Terraform 模板,配置了 Provider,定义好编排配置后,第一步一定是执行 terraform init 命令,来初始化一些后续操作需要用到的设置和数据,包括自动下载我们使用到的 Provider。

但是对于国内用户来说,由于 Terraform Provider 并没有国内源,所以 terraform init 时下载 Provider 就成了耗时严重的环节,随便一个 Provder 动辄 3 分钟以上的下载时间,严重影响了我们的效率,更不要说一个完整的 Terraform 模板可能需要用到多个 Provider 了。

因此,我们需要考虑如何加速 terraform init,即加速 Provider 的下载。

目前阿里云 Cloud Shell 已经进行了 terraform init 的加速,原来动辄数分钟的 init 过程现在只需要几秒中。同时我们可以在 Cloud Shell 中直观的体验 Terrafrom 的教程:使用 Terraform 管理云资源

Provider Cache

默认情况下,terraform init 会将 Provider 下载到当前工作目录的子目录 .terraform/plugins/ 中,以便保证每个工作目录都是独立的。我们可以开始 Provider 的缓存,Provider 会优先读取缓存,缓存没有命中的才会进行下载,保证每个相同版本的 Provider 只会下载一次。

开启方式有两种,我们可以修改 Terraform 的配置文件,在配置文件 ~/.terraformrc 中增加 plugin_cache_dir 的设置。

plugin_cache_dir = "$HOME/.terraform.d/plugin-cache"

或者通过环境变量的方式来进行设置。

export TF_PLUGIN_CACHE_DIR="$HOME/.terraform.d/plugin-cache"

需要注意的是,缓存目录必须存在,Terraform 不会为我们自动创建目录,因此不存在的话需要自行创建。同时,一旦 Provider 进行缓存,Terraform 不会自行删除它。随着 Provider 的升级,老的未使用的版本我们可能需要手动删除。

使用缓存可以极大的解决我们后续使用时的速度问题,但是一旦需要使用新的 Provider,或者升级 Provider,首次的下载时间依然很慢,不论是 Terraform 自动下载,还是我们手动下载然后放到缓存目录中。尤其是多人协作的云端环境中,提升执行速度的同时,还要兼顾 Provider 更新的及时性。

设置 Provider Host

另一种比较 Hack 的方式,是设置 Provider Host。首先我们需要了解 terraform init 时,下载 Provider 的流程。

可以看到 Terraform 会通过请求 https://registry.terraform.io/v1/providers/-/${provider}/versions 获取 Provider 的版本信息,以 Aliyun Provider 为例,请求结果为:

{
  "id": "hashicorp/alicloud",
  "versions": [
    {
      "version": "1.17.0",
      "protocols": ["4"],
      "platforms": [
        {
          "os": "linux",
          "arch": "amd64"
        },
        ...
      ]
    },
    ...
  ]
}

如果我们指定的 Provider 版本存在(没有指定,则取最新的版本),Terraform 会请求 https://registry.terraform.io/v1/providers/hashicorp/${provider}/${version}/download/${os}/${arch} 获取该版本的信息。以64 位 linux 系统上的 Aliyun Provider 1.58.1 为例,请求结果为:

{
    "protocols": ["4.0","5.0"],
    "os": "linux",
    "arch": "amd64",
    "download_url": "https://releases.hashicorp.com/terraform-provider-alicloud/1.58.1/terraform-provider-alicloud_1.58.1_linux_amd64.zip",
    "shasums_url": "https://releases.hashicorp.com/terraform-provider-alicloud/1.58.1/terraform-provider-alicloud_1.58.1_SHA256SUMS",
    "shasums_signature_url": "https://releases.hashicorp.com/terraform-provider-alicloud/1.58.1/terraform-provider-alicloud_1.58.1_SHA256SUMS.sig",
    "shasum": "f1af67c5bc068960f1726fe43bb8c2bd485140274fbe4e036dc52d50a7da329f",
    "signing_keys": {
        "gpg_public_keys": [
            {
                "ascii_armor": "...",
                "source": "HashiCorp",
                "source_url": "https://www.hashicorp.com/security.html"
            }
    ]
  }
}

其中包含 Provider 和 shasum 的下载地址。Terraform 会通过返回的下载地址下载 Provider,同时通过 shasum 校验文件完整性。

因此,我们可以将从 registry.terraform.io 这个 Provider Host 获取 Provider 元信息的请求指向我们自己的 Provider Service,然后在 Terraform 获取指定版本 Provider 信息时,将 Provider 的下载地址 download_url 修改为我们自己维护的 Provider 下载源,配合 Provider Cache,保证任何时候,terraform init 都可以快速的执行。

Terraform v0.12 已经提供了修改 Provider Host 的方式,修改配置文件 ~/.terraformrc,增加配置:

host "registry.terraform.io" {
    services = {
      "modules.v1" = "http://your-mirror.example.com/v1/modules/",
      "providers.v1" = "http://your-mirror.example.com/v1/providers/"
    }
  }

如此,就可以将原本请求 registry.terraform.io 获取 Provider 元信息的请求,修改为请求我们自己的服务。

需要注意的是,modules.v1 需要同时显示定义,如果你不想修改它,则可以继续设置为官方的 https://registry.terraform.io/v1/modules/

我们可以通过阿里云的函数计算作为我们的自定义的 Provider Service,函数计算提供了 HTTP 触发器,让我们的函数服务对外提供 HTTP 服务。同时我们可以使用 OSS 作为我们自己的 Provider 镜像源,然后定时同步官方的 Provider 到我们的 OSS 中,保证 Provider 的持续更新。其中我们可以使用逻辑编排来轻松的编排我们的同步任务。

最后

目前阿里云 Cloud Shell 已经进行了 terraform init 的加速,原来动辄数分钟的 init 过程缩短到了几秒钟。同时你还可以通过教程学习如何使用 Terraform 管理云资源

目录
相关文章
|
数据中心 iOS开发 MacOS
玩转阿里云 Terraform(三):Terraform 的安装和加速
本文以Mac OS为例,详细介绍如何在本地安装Terraform,并在文章最后介绍一种可以加速Terraform安装的方法。
15806 0
|
JSON Kubernetes Unix
Kubernetes crictl管理命令详解
Kubernetes crictl管理命令详解
|
API
Istio 使用ingress和gateway两种方式公开服务
本文档指导您完成Istio网关的部署与配置。首先安装`istiod`(步骤略过)。接着,创建`ingress.yaml`文件,定义Istio入口网关的服务、部署及权限设置,通过`kubectl apply -f ingress.yaml`命令应用。最后,创建Ingress资源,指定主机名、后端服务及TLS配置,实现对外部请求的路由管理。
1048 1
|
存储 Linux 持续交付
史上最全 Terraform 入门教程,助你无坑入门!
【10月更文挑战第26天】这是一个全面的 Terraform 入门教程,涵盖了 Terraform 的基本概念、安装步骤、基础配置、变量和输出变量的使用、模块的定义与使用,以及状态管理。通过实例讲解如何创建本地文件资源和 AWS S3 桶,帮助初学者快速上手并掌握 Terraform 的核心功能。
2393 8
|
弹性计算 监控 负载均衡
【阿里云弹性计算】ECS实例迁移实战:无缝迁移到阿里云的步骤与技巧
【5月更文挑战第22天】阿里云ECS实例迁移实战详解,涵盖无缝迁移步骤与技巧:选择合适迁移方案,如VPC或使用阿里云工具;创建目标环境,数据迁移及配置同步;测试验证功能正常,流量切换;选择低峰期,保证数据一致,实时监控,提升迁移成功率。本文为云平台迁移提供实用指南。
654 2
|
运维 供应链 Devops
构建高效自动化运维体系:Ansible与Terraform的协同策略
【4月更文挑战第24天】 在现代IT基础设施管理中,自动化已成为提升效率、确保一致性和降低人为错误的关键。本文将探讨如何通过结合Ansible和Terraform这两大自动化工具,构建一个强大且灵活的自动化运维体系。Ansible以其强大的配置管理能力被广泛认可,而Terraform则以编排各类云资源见长。文章将深入分析两者的功能特点,并提出一种整合策略,以实现从代码部署到资源管理的全流程自动化,旨在为运维团队提供一套可落地的自动化解决方案。
|
运维 数据中心 数据安全/隐私保护
【Terraform实现云服务基础设施既代码(IaC)案例实战-3】:Terraform+Docker+Portainer+Gitlab+GitlabRunner搭建Tree项目
前言树苗科技公司业务上云2年有余,随着技术的不断发展。运维团队支持业务变更配置、开资源、删资源等过程加班到深夜一两点已是家常便饭。为了进一步提升工作效率,运维总监张三决定对当前业务交付路径进行统一梳理,借助IaC的理念和Terraform自动化工具逐步实施运维生产自动化,改善组内成员频繁加班且重复劳...
949 57
【Terraform实现云服务基础设施既代码(IaC)案例实战-3】:Terraform+Docker+Portainer+Gitlab+GitlabRunner搭建Tree项目
|
数据中心
Terraform使用本地编译(In-house)的Providers
## Terraform Provider的全网标识符 Terraform的Provider在全网的的标识符由三部分组成,分别为`hostname`,`namespace`和`type`组成,即`//`。`hostname`是指分发、下载Provider的域名,默认为`registry.terraform.io`。`namespace`是指提供、开发Provider的组织的命名空间,默认为`has
1603 0
|
弹性计算 架构师 安全
基础设施自动化实践——用Terraform自动化构建云上环境
前言在我们平时的开发工作中,经常会遇到需要搭建各式各样的云上环境,比如项目开发环境、测试环境、部署环境、客户展示环境等。而有时这些搭建过程并不轻松,如可能涉及很多台ECS,可能对镜像或配置有特殊要求,可能涉及较为复杂的网络配置等。而对于这些较为复杂多变的环境部署要求,传统的人工手动配置方法,不仅耗时费力,还有一个很大的问题就是难以追踪管理、难以复用。比如负责搭建环境的架构师如果休假了,团队其他人很
1273 0
基础设施自动化实践——用Terraform自动化构建云上环境