Terraform是一個開源的自動化Resource Orchestration Service工具。Resource Orchestration Service服務ROS(Resource Orchestration Service)為Terraform提供了託管的能力。當您瞭解了Terraform和Terraform託管方式,需要開發Terraform代碼並在ROS中使用時,可以採用本文介紹的開發方式和開發建議。
開發方式
建議使用熟悉的開發方式編寫和測試Terraform代碼。您可以採用以下開發方式:
- 本地開發。
- 使用Terraform線上調試工具開發(僅支援阿里雲)。
- 使用ROS建立Terraform類型資源棧,然後根據需求繼續建立或更新資源棧。更多資訊,請參見建立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 }