您可以通过参数约束查询功能来查询模板中定义参数的取值。

背景信息

通过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资源时,需要填写ZoneInfoInstanceType等参数。

由于各个地域支持的ECS实例规格不同,填写ZoneInfo后,可能导致您无法选择特定的InstanceType

如果您只需要选择特定的InstanceType,那么您可以通过Metadata设置参数之间的依赖关系。

说明 有关Metadata的更多信息,请参见元数据(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已隐藏)。