Terraform代碼開發(fā)方式和建議
Terraform是一個開源的自動化資源編排工具。資源編排服務(wù)ROS(Resource Orchestration Service)為Terraform提供了托管的能力。當(dāng)您了解了Terraform和Terraform托管方式,需要開發(fā)Terraform代碼并在ROS中使用時,可以采用本文介紹的開發(fā)方式和開發(fā)建議。
開發(fā)方式
建議使用熟悉的開發(fā)方式編寫和測試Terraform代碼。您可以采用以下開發(fā)方式:
本地開發(fā)。
使用Terraform在線調(diào)試工具開發(fā)(僅支持阿里云)。
使用ROS創(chuàng)建Terraform類型資源棧,然后根據(jù)需求繼續(xù)創(chuàng)建或更新資源棧。更多信息,請參見創(chuàng)建Terraform類型資源棧、繼續(xù)創(chuàng)建資源棧和更新資源棧。
開發(fā)建議
不建議在.tf文件中聲明阿里云(alicloud)Provider。
ROS提供了一個默認的阿里云Provider,使用當(dāng)前阿里云賬號的臨時AccessKey(或STS憑證)以及資源棧所屬的地域。使用默認Provider的優(yōu)點如下:
簡化開發(fā),提升安全性,降低訪問密鑰(AccessKey)泄露的風(fēng)險。
保證資源與資源棧所屬賬號和地域相同,以便進行統(tǒng)一管理和集成。
當(dāng)資源與資源棧所屬賬號和地域相同時,更有效地支持詢價、系統(tǒng)標簽、傳遞資源棧用戶標簽、傳遞資源棧所屬資源組、風(fēng)險檢查等功能。
說明當(dāng)資源與資源棧組所屬賬號和地域不同時,在部分情況下支持詢價、系統(tǒng)標簽、傳遞資源棧用戶標簽和風(fēng)險檢查功能。
當(dāng)資源與資源棧組所屬地域不同時,在部分情況下支持傳遞資源棧所屬資源組功能。
把僅供本地使用的代碼放入以.debug.tf結(jié)尾的文件。
在Terraform托管中,ROS會忽略以.debug.tf結(jié)尾的文件,不參與Terraform編排。但在本地測試時,會參與Terraform編排。例如:您可以編寫一個名為provider.debug.tf的文件,對阿里云Provider進行配置。在本地開發(fā)時,該文件中配置會生效,資源會創(chuàng)建在中國香港(cn-hongkong)地域。但在ROS中創(chuàng)建資源棧時,ROS會忽略該文件,資源會創(chuàng)建在資源棧所屬地域。provider.debug.tf文件內(nèi)容如下:
variable "region" { type = string default = "cn-hongkong" } provider "alicloud" { region ="${var.region}" }
建議指定Provider版本。
從1.0版本(Aliyun::Terraform-v1.0)開始,Terraform托管支持連續(xù)的Provider版本。通過指定Provider版本,可以防止Provider更新引入問題,保障穩(wěn)定性。代碼示例如下:
terraform { required_providers { alicloud = { source = "aliyun/alicloud" version = "1.140.0" } } }
關(guān)于Provider版本的更多信息,請參見ROS版本支持情況的Provider版本列。
建議使用Aliyun::Terraform-v1.0及其以上版本。
Aliyun::Terraform-v0.12和Aliyun::Terraform-v0.15版本僅作兼容性維護,Provider的版本及功能不再更新。
不建議使用.tfvars文件,而是通過ROS參數(shù)傳遞變量值。
其優(yōu)點如下:
減少模板的修改次數(shù)。大部分情況下,只需要修改參數(shù)值。
變量與ROS參數(shù)一一對應(yīng),在控制臺清晰可見。如果使用.tfvars文件,可能覆蓋變量值,造成實際值與控制臺顯示值不一致。
更多信息,請參見Parameters(可選)。
通過偽參數(shù)獲取資源棧信息。
更多信息,請參見Parameters(可選)。例如:在.tf文件中定義變量ALIYUN__Region,通過var.ALIYUN__Region訪問,即可獲取資源棧所屬地域。代碼示例如下:
variable "ALIYUN__Region" { type = string default = "cn-hongkong" }
細化變量定義。
ROS會自動把Terraform變量轉(zhuǎn)換成ROS參數(shù),細化變量定義會使得ROS轉(zhuǎn)換的結(jié)果更為準確。更多信息,請參見Parameters(可選)。
為變量設(shè)置type字段,否則ROS可能會將變量當(dāng)作字符串類型處理,并傳遞給Terraform,Terraform在編排時可能出現(xiàn)變量類型錯誤。
如果參數(shù)包含敏感信息,在其對應(yīng)的變量中將sensitive設(shè)置為true。
variable "password" { type = string sensitive = true }
使用Metadata控制參數(shù)(變量)在控制臺的顯示。
為參數(shù)分組:更多信息,請參見元數(shù)據(jù)(Metadata)和使用Metadata為參數(shù)分組。
隱藏參數(shù):使用Metadata.ALIYUN::ROS::Interface.Hidden指定需要隱藏的參數(shù)列表。
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: ...
參數(shù)約束查詢:使用.metadata文件中ALIYUN::ROS::Interface字段的ResourcesForParameterConstraints設(shè)置參數(shù)約束。更多信息,請參見手動配置Terraform類型模板的參數(shù)約束查詢。
控制參數(shù)(變量)在控制臺的輸入方式。
在ROS參數(shù)中,通過AssociationProperty和AssociationPropertyMetadata可以自動驗證參數(shù)值的合法性,并且給參數(shù)提供取值信息。更多信息,請參見AssociationProperty和AssociationPropertyMetadata和在資源編排控制臺動態(tài)選擇參數(shù)配置。
在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": "在專有網(wǎng)絡(luò)控制臺的專有網(wǎng)絡(luò)頁面查看專有網(wǎng)絡(luò)ID。" }, "Label": { "en": "Existing VPC ID", "zh-cn": "現(xiàn)有專有網(wǎng)絡(luò)ID" } } EOT }