云服务器价格_云数据库_云主机【优惠】最新活动-搜集站云资讯

美国服务器_华为虚拟主机_评分榜

小七 141 0

构建用于生产的HashiCorp地形配置

当您开始学习使用HashiCorp Terraform时,可以从一个配置文件开始,其中包含所有的基础结构作为代码。随着您了解更多信息,您将开始与同事或团队共享和协作这些配置文件。最终,多个团队成员开始创建、共享和协作相同的配置。随着团队的成长,如何扩展地形配置?在这篇文章中,我们将讨论构建您的Terraform配置的方法,以改进测试、可重用性和可伸缩性。我们首先将Terraform配置分解为模块,以减少组件之间的依赖性。接下来,我们将讨论使用模块来促进跨多个环境重用和测试基础架构组件。最后,我们研究Terraform注册表如何实现模块的标准化和重用。»分解单片配置假设您有一个大型的Terraform配置来部署一些添加和读取消息队列的函数,这些函数都包含在虚拟网络中。在一个文件中定义所有基础结构组件,主.tf.资源"aws\uiam_role""文档翻译"{}资源"aws_lambda_function""文档翻译"{}资源"aws_sqs_queue""文档翻译"{}资源"aws_subnet""文档翻译"{}资源"aws\u vpc""文档翻译"{}随着越来越多的团队成员在文档翻译功能之外的功能上进行协作,他们需要自己的消息队列和单独的网络配置。为了实现重用,可以将每种类型的基础结构组件分解到自己的目录中,这样其他团队就可以引用配置并为自己的目的进行定制。在构建Terraform配置的模块时,可以参数化特定的配置,例如FIFO队列选项或组件命名。>树我的公司职能├—文档元数据│ └── 主.tf├——文件翻译│ └── 主.tf———模块├—函数│ ├── 主.tf//包含aws_iam_角色、aws_lambda_函数│ ├── 输出.tf│ └── 变量.tf├—排队│ ├── 主.tf//包含aws_sqs_队列│ ├── 输出.tf│ └── 变量.tf———虚拟网├── 主.tf//包含aws_vpc、aws_子网├── 输出.tf└── 变量.tf这种文件结构利用了Terraform模块。通过将我们的配置组织到带有模块的子目录中,您可以单独测试每个部分,并将它们重新用于新功能。通过创建一个主.tf用于文档翻译功能的文件。将模块源设置为modules目录中本地定义的模块。"vnet"模块{source="../modules/vnet"cidr_block="10.0.0.0/16"}"队列"模块{source="../modules/queue"name="terraform示例队列"延迟时间=90秒最大消息大小=2048消息保存秒数=86400接收_wait_time_seconds=10}"功能"模块{source="../modules/function"filename="lambda_函数_有效载荷.zip"function_name="lambda_function_name"角色=aws_角色.iam_for_lambda.阿恩处理程序="出口.测试"source_code_hash=filebase64sha256("lambda_函数_有效载荷.zip")运行时="nodejs8.10"}这个主.tf文件表示文档翻译功能的基础结构配置,包括模块导入和每个模块所需的变量。在应用配置之前,运行terraform init在本地文件路径检索模块。»定义模块的注意事项当分解Terraform配置时,可以根据爆炸半径、变化率、责任范围和易于管理将配置划分为模块。在上一个示例中,您创建了一个函数模块,其中包含aws_lambda_函数以及与该函数关联的aws_iam_角色。您将IAM角色定义作为功能模块的一部分,因为它的职责范围是对功能的。函数可以频繁更改,尤其是在更新和重新部署代码时。因此,您需要将其与网络配置分开,网络配置可能相当静态。类似地,对lambda函数的更改比更改网络配置具有更小的爆炸半径。对网络配置的更改可能会完全破坏和创建网络资源,这会影响网络上承载的任何资源。除模块资源外,确定模块配置所需的输入参数。在本例中,您决定队列只能是标准的,而不能是FIFO。因此,不要包含启用FIFO队列的输入。使用模块输入传递来自其他模块的信息,例如子网和安全组标识符。"vnet"模块{source="../modules/vnet"cidr_block="10.0.0.0/16"}"队列"模块{source="../modules/queue"name="terraform示例队列"//为清楚起见省略专有网络配置{子网标识=module.vnet.subnet_标识安全组标识=module.vnet.security_组_id}}或者,您可以使用数据源动态地发现模块中的基础结构组件。例如,您决定将vnet模块的所有权转移给网络团队,以便他们可以为您的功能管理IP地址间隔。在网络团队创建虚拟网络后,您可以动态引用他们通过利用aws_vpcs数据源创建的VPC,并搜索与您的功能相关的标签。数据"aws_vpcs""foo"{标记={function="文档翻译"}}数据源根据标识VPC用途的标记检索VPC列表,在本例中,用于文档翻译功能。有关分解整体地形项目的其他模式的更多详细信息,请参阅本文。»针对环境的单独配置除了模块化通用的Terraform配置以供重用外,您还经常管理多个环境,例如登台或生产环境。一个很好的做法是将每个环境分离到自己的文件夹中,甚至是一个完全独立的存储库中。有关更多信息,请参阅Terraform推荐实践文档。>树我的公司职能├—模块├—产品│–├—文档元数据│ │ └── 主.tf│—文档翻译│ └── 主.tf———分期├—文档元数据│ └── 主.tf———文件翻译└── 主.tf虽然每个环境都有一个文件夹,但在可伸缩性和可用性方面有一些好处。首先,每个环境都保持一个独立的状态。使用Terraform CLI,您可以使用Terraform workspace命令为每个环境初始化一个新状态。接下来,您必须进入每个环境的目录并分别运行terraforminit。这提供了重要的隔离,以保护生产环境免受在登台过程中进行的任何类型的实验。其次,可以为每个环境有选择地导入模块。例如,某些环境可能需要一个队列,而其他环境可能具有共享队列,以降低测试期间的基础设施成本。这允许对每个环境进行粒度控制,并鼓励在将来添加其他环境时环境配置的可重复性。»共享模块除了使用本地路径定义模块源之外,还可以使用远程源(如版本控制或对象存储终结点)定义模块源。这种方法使您能够对模块进行版本设置。回想一下在这个例子中,网络团队拥有虚拟网络配置的所有权。他们决定将其托管在GitLab中,从而支持对网络配置进行单独的功能测试和安全强化。他们发布的最新版本,通过了带有git引用v3.0.0的功能和安全测试。为了使用GitLab中的网络模块,请更新主.tf使生产指向新的模块源和版本v3.0.0。"vnet"模块{source="git::https://git.mycompany.com/vnet.git?参考=v3.0.0"cidr_block="10.0.0.0/16"}在重构以使用网络团队的虚拟网络模块之后,运行terraforminit来检索远程模块。必须运行terraform init或terraform get来安装远程模块。通过在远程端点分别管理、托管和版本控制模块,其他团队可以在发布Terraform模块以供整个组织通用之前共享、测试和强化其Terraform模块。在使用新版本的模块更新基础结构配置之前,可以对每个配置的向后不兼容更改进行通信。»缩放模块安装与维护重构基础结构配置以使用模块,并开始使用由不同团队创建的其他模块。然而,在数百个模块引用之后,您会意识到,不仅要检索和安装模块,而且还要跟踪模块的更新、可用版本、输入和输出,都需要一些时间。作为第一个解决方案,您可以将所有模块作为git子模块检索,并重构您的Terraform配置以引用具有本地路径的模块。这将本地缓存所有模块以供使用,同时便于在单独的存储库中维护模块。要解决Terraform模块安装缓慢和额外维护的问题,请使用公开可用的Terraform注册表或组织范围内的Terraform云私有模块注册表来存储和管理模块。此模式可快速从Terraform注册表或Terraform云私有模块注册表导入模块。你可以利用