Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结
Posted 科技D人生
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结相关的知识,希望对你有一定的参考价值。
前言
Terraform 是一个开源的自动化资源编排工具。资源编排服务 ROS(Resource Orchestration Service)为 Terraform 提供了托管的能力。当您了解了 Terraform 和 Terraform 托管方式,需要开发 Terraform 代码并在 ROS 中使用时,可以采用本文介绍的开发方式和开发建议。
开发方式
建议使用熟悉的开发方式编写和测试 Terraform 代码。您可以采用以下开发方式:
- 本地开发。
- 使用Terraform在线调试工具开发(仅支持阿里云)。
- 使用 ROS 创建 Terraform 类型资源栈,然后根据需求继续创建或更新资源栈。
开发建议
- 不建议在 .tf 文件中声明阿里云(alicloud)Provider。ROS 提供了一个默认的阿里云 Provider,使用当前阿里云账号的临时 AccessKey(或 STS 凭证)以及资源栈所属的地域。使用默认 Provider 的优点如下:
- 简化开发,提升安全性,降低访问密钥(AccessKey)泄露的风险。
- 保证资源与资源栈所属地域相同,以便进行统一管理和集成。
- 当资源与资源栈所属地域相同时,支持询价、系统标签、传递资源栈用户标签、传递资源栈所属资源组、风险检查等功能。
- 把仅供本地使用的代码放入以 .debug.tf 结尾的文件。在 Terraform 托管中,ROS 会忽略以 .debug.tf 结尾的文件,不参与 Terraform 编排。但在本地测试时,会参与 Terraform 编排。例如:您可以编写一个名为 provider.debug.tf 的文件,对阿里云 Provider 进行配置。在本地开发时,该文件中配置会生效,资源会创建在中国香港(cn-hongkong)地域。但在 ROS 中创建资源栈时,ROS 会忽略该文件,资源会创建在资源栈所属地域。provider.debug.tf 文件内容如下:
variable "region" type = string default = "cn-hongkong" provider "alicloud" region ="$var.region"
- 建议指定 Provider 版本。从 1.0 版本(Aliyun::Terraform-v1.0)开始,Terraform 托管支持连续的 Provider 版本。通过指定 Provider 版本,可以防止 Provider 更新引入问题,保障稳定性。代码示例如下:
terraform required_providers alicloud = source = "aliyun/alicloud" version = "1.140.0"
- 不建议使用 .tfvars 文件,而是通过 ROS 参数传递变量值。
其优点如下:
- 减少模板的修改次数。大部分情况下,只需要修改参数值。
- 变量与ROS参数一一对应,在控制台清晰可见。如果使用.tfvars文件,可能覆盖变量值,造成实际值与控制台显示值不一致。
- 通过伪参数获取资源栈信息。例如:在 .tf 文件中定义变量 ALIYUN__Region,通过 var.ALIYUN__Region 访问,即可获取资源栈所属地域。代码示例如下:
variable "ALIYUN__Region" type = string default = "cn-hongkong"
- 细化变量定义。ROS会自动把Terraform变量转换成ROS参数,细化变量定义会使得ROS转换的结果更为准确。
- 为变量设置 type 字段,否则 ROS 可能会将变量当作字符串类型处理,并传递给 Terraform,Terraform 在编排时可能出现变量类型错误。
- 如果参数包含敏感信息,在其对应的变量中将 sensitive 设置为 true。
variable "password" type = string sensitive = true
- 使用Metadata控制参数(变量)在控制台的显示。
- 为参数分组
- 隐藏参数:使用 Metadata.ALIYUN::ROS::Interface.Hidden 指定需要隐藏的参数列表。
"ROSTemplateFormatVersion": "2015-09-01", "Description": "Creates a simple oss bucket", "Parameters": "BucketName": "Type": "String", "Label": "Bucket Name", "Description": "en": "Bucket name", "zh-cn": "Bucket名称" , "Default": "bucketName1" , "Metadata": "ALIYUN::ROS::Interface": "Hidden": [ "BucketName" ] , "Workspace": ...
- 参数约束查询:使用.metadata文件中ALIYUN::ROS::Interface字段的ResourcesForParameterConstraints设置参数约束。
- 控制参数(变量)在控制台的输入方式。
- 在 ROS 参数中,通过 AssociationProperty 和 AssociationPropertyMetadata 可以自动验证参数值的合法性,并且给参数提供取值信息。
- 在 Terraform 变量中,通过 description 字段控制 AssociationProperty 和 AssociationPropertyMetadata。代码示例如下:
variable "vpc_id" type = string description = <<EOT "AssociationProperty": "ALIYUN::ECS::VPC::VPCId", "Description": "en": "Please search the ID starts with (vpc-xxx)from console-Virtual Private Cloud", "zh-cn": "在专有网络控制台的专有网络页面查看专有网络ID。" , "Label": "en": "Existing VPC ID", "zh-cn": "现有专有网络ID" EOT
以上是关于Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结的主要内容,如果未能解决你的问题,请参考以下文章
Terraform 学习总结(10)—— 阿里云平台 Terraform 代码开发技巧总结
Terraform 学习总结—— 基于阿里云平台上的 Terraform 实战
Terraform 学习总结—— 基于阿里云平台上的 Terraform 实战
Terraform 学习总结—— 如何解决存量云资源的管理难题