全部產品
Search
文件中心

Resource Orchestration Service:Terraform代碼開發方式和建議

更新時間:Aug 24, 2023

Terraform是一個開源的自動化Resource Orchestration Service工具。Resource Orchestration Service服務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在Resource Orchestration Service控制台動態選擇參數配置
    • 在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
      }