您可以通过参数约束查询功能来查询模板中定义参数的取值。
背景信息
通过AssociationProperty和AssociationPropertyMetadata可以筛选参数。在特定场景下,筛选出来的参数可能不符合需求。
例如:多个产品都支持ZoneId参数,而不同产品支持的ZoneId不同,此时您需要使用参数约束查询功能,查询模板中定义参数的取值。
支持查询的参数
您可以调用GetTemplateParameterConstraints接口查询参数取值,无需在模板中额外增加字段去查询。
Parameters
模块。参数约束查询功能支持查询的参数如下表所示。
资源类型 | 参数 |
---|---|
ALIYUN::CS::KubernetesCluster | MasterInstanceTypes、MasterSystemDiskCategory、WorkerInstanceTypes、WorkerSystemDiskCategory、WorkerVSwitchIds、PodVswitchIds、MasterDataDisks和WorkerDataDisks中的Category |
ALIYUN::CS::ManagedKubernetesCluster | WorkerInstanceTypes、WorkerSystemDiskCategory、 VSwitchIds、PodVswitchIds和WorkerDataDisks中的Category |
ALIYUN::CS::ManagedEdgeKubernetesCluster | WorkerInstanceTypes、WorkerSystemDiskCategory、WorkerDataDiskCategory、VSwitchIds和WorkerDataDisks中的Category |
ALIYUN::ECS::Instance | ZoneId、SystemDiskCategory、InstanceType和DiskMappings中的Category |
ALIYUN::ECS::InstanceGroup | ZoneId、SystemDiskCategory、InstanceType和DiskMappings中的Category |
ALIYUN::ECS::VSwitch | ZoneId |
ALIYUN::RDS::DBInstance | ZoneId、EngineVersion、Category、DBInstanceStorageType和DBInstanceClass |
ALIYUN::RDS::PrepayDBInstance | ZoneId、EngineVersion、Category、DBInstanceStorageType和DBInstanceClass |
ALIYUN::POLARDB::DBCluster | ZoneId和DBNodeClass |
ALIYUN::REDIS::Instance | ZoneId、EngineVersion和InstanceClass |
ALIYUN::REDIS::PrepayInstance | ZoneId、EngineVersion和InstanceClass |
ALIYUN::VPC::NatGateway | ZoneId |
ALIYUN::ADB::DBCluster | ZoneId |
ALIYUN::GPDB::DBInstance | ZoneId |
ALIYUN::GPDB::ElasticDBInstance | ZoneId |
ALIYUN::ALB::LoadBalancer | ZoneMappings中的ZoneId |
ALIYUN::ElasticSearch::Instance | ZoneId、DataNode中的Spec、MasterNode中的Spec和KibanaNode中的Spec |
ALIYUN::SLB::LoadBalancer | MasterZoneId和SlaveZoneId |
ALIYUN::TSDB::HiTSDBInstance | InstanceClass和ZoneId |
参数之间的依赖关系
使用模板在ROS创建ECS资源时,需要填写ZoneInfo
、InstanceType
等参数。
由于各个地域支持的ECS实例规格不同,填写ZoneInfo
后,可能导致您无法选择特定的InstanceType
。
如果您只需要选择特定的InstanceType
,那么您可以通过Metadata
设置参数之间的依赖关系。
ROSTemplateFormatVersion: '2015-09-01'
Parameters:
ZoneInfo:
Type: String
InstanceType:
Type: String
Resources:
ECS:
Type: ALIYUN::ECS::Instance
Properties:
ZoneId:
Ref: ZoneInfo
InstanceType:
Ref: InstanceType
ImageId: ubuntu
Metadata:
ALIYUN::ROS::Interface:
ParameterGroups:
- Parameters:
- InstanceType
- ZoneInfo
手动配置Terraform类型模板的参数约束查询
在Metadata字段或.metadata文件中的ALIYUN::ROS::Interface字段中增加ResourcesForParameterConstraints字段,对参数进行约束。
您需要定义与参数约束相关的资源,并设置对应属性。关于ResourcesForParameterConstraints字段的相关语法,请参见资源(Resources)。
模板中定义的Mappings(可选)、Conditions(可选)和Rules(可选)在参数查询时自动生效。
ROSTemplateFormatVersion: '2015-09-01'
Transform: Aliyun::Terraform-v1.1
Workspace:
.metadata: |-
{
"ALIYUN::ROS::Interface": {
"ResourcesForParameterConstraints": {
"instance": {
"Type": "ALIYUN::ECS::Instance",
"Properties": {
"ImageId": {
"Ref": "image_id"
},
"InstanceType": {
"Ref": "instance_type"
},
"ZoneId": {
"Ref": "zone_id"
}
}
}
},
"Hidden": [
"image_id"
]
}
}
main.tf: |-
variable "image_id" {
type = string
default = "ubuntu_18_04_64_20G_alibase_2019****.vhd"
}
variable "instance_type" {
type = string
}
variable "zone_id" {
type = string
}
resource "alicloud_vpc" "vpc" {
cidr_block = "172.16.X.X/16"
}
resource "alicloud_security_group" "group" {
vpc_id = alicloud_vpc.vpc.id
}
resource "alicloud_vswitch" "vswitch" {
vpc_id = alicloud_vpc.vpc.id
cidr_block = "172.16.X.X/24"
zone_id = var.zone_id
}
resource "alicloud_instance" "instance" {
availability_zone = var.zone_id
security_groups = [alicloud_security_group.group.id]
instance_type = var.instance_type
image_id = var.image_id
vswitch_id = alicloud_vswitch.vswitch.id
}
Terraform模板中定义了4个资源,需要进行约束的参数(zone_id、instance_type)全部与alicloud_instance相关。
在ResourcesForParameterConstraints字段中只需要定义一个类型为ALIYUN::ECS::Instance(ROS中与alicloud_instance对应的资源类型)的资源,并关联相关参数image_id、instance_type、zone_id,就可以实现对instance_type、zone_id的约束(image_id已隐藏)。