Terraform是一个开源的自动化资源编排工具。资源编排服务ROS(Resource Orchestration Service)为Terraform提供了托管的能力。当您了解了Terraform和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"
        }
      }
    }

    关于Provider版本的更多信息,请参见ROS版本支持情况Provider版本列。

  • 建议使用Aliyun::Terraform-v1.0及其以上版本。

    Aliyun::Terraform-v0.12和Aliyun::Terraform-v0.15版本仅作兼容性维护,Provider的版本及功能不再更新。

  • 不建议使用.tfvars文件,而是通过ROS参数传递变量值。

    其优点如下:

    • 减少模板的修改次数。大部分情况下,只需要修改参数值。
    • 变量与ROS参数一一对应,在控制台清晰可见。如果使用.tfvars文件,可能覆盖变量值,造成实际值与控制台显示值不一致。

    更多信息,请参见Parameters(可选)

  • 通过伪参数获取资源栈信息。

    更多信息,请参见Parameters(可选)。例如:在.tf文件中定义变量ALIYUN__Region,通过var.ALIYUN__Region访问,即可获取资源栈所属地域。代码示例如下:

    variable "ALIYUN__Region" {
      type = string
      default = "cn-hongkong"
    }
  • 细化变量定义。

    ROS会自动把Terraform变量转换成ROS参数,细化变量定义会使得ROS转换的结果更为准确。更多信息,请参见Parameters(可选)

    • 为变量设置type字段,否则ROS可能会将变量当作字符串类型处理,并传递给Terraform,Terraform在编排时可能出现变量类型错误。
    • 如果参数包含敏感信息,在其对应的变量中将sensitive设置为true。
      variable "password" {
        type = string
        sensitive = true
      }
  • 使用Metadata控制参数(变量)在控制台的显示。
    • 为参数分组:更多信息,请参见元数据(Metadata)使用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设置参数约束。更多信息,请参见手动配置Terraform类型模板的参数约束查询
  • 控制参数(变量)在控制台的输入方式。
    • 在ROS参数中,通过AssociationProperty和AssociationPropertyMetadata可以自动验证参数值的合法性,并且给参数提供取值信息。更多信息,请参见AssociationProperty和AssociationPropertyMetadata在资源编排控制台动态选择参数配置
    • 在Terraform变量中,通过description字段控制AssociationProperty和AssociationPropertyMetadata。更多信息,请参见Parameters(可选)。代码示例如下:
      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
      }