本文为您介绍ROS CDK的相关功能。
参数
ROS支持使用参数(Parameters)提高模板的灵活性和可复用性,您可以通过以下代码在ROS CDK中设置参数。
关于参数(Parameters)的更多信息,请参见概览。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as ecs from '@alicloud/ros-cdk-ecs';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const VpcCidrBlock = new ros.RosParameter(this, 'VpcCidrBlock', {
            description: 'The CIDR block of the VPC.',
            type: ros.RosParameterType.STRING,
            associationProperty: ros.RosParameter.AssociationProperty.VPC_CIDR_BLOCK
        });
        
        const VSwitchCidrBlock = new ros.RosParameter(this, 'VSwitchCidrBlock', {
            description: 'The CIDR block of the VSwitch.',
            type: ros.RosParameterType.STRING,
            associationProperty: ros.RosParameter.AssociationProperty.VSWITCH_CIDR_BLOCK
        });
        const ZoneId = new ros.RosParameter(this, 'ZoneId', {
            description: 'Availability Zone ID.',
            type: ros.RosParameterType.STRING,
            associationProperty: ros.RosParameter.AssociationProperty.ZONE_ID
        });
        const Vpc = new ecs.Vpc(this, 'vpc', {
            cidrBlock: VpcCidrBlock,
            vpcName: "demo001"
        });
        const VSwitch = new ecs.VSwitch(this, 'vswitch', {
            vpcId: Vpc.attrVpcId,
            cidrBlock: VSwitchCidrBlock,
            zoneId: ZoneId
        });
    }
Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.ecs.*;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        RosParameter VpcCidrBlock = RosParameter.Builder.create(this, "VpcCidrBlock").
                description("The CIDR block of the VPC.").type(RosParameterType.STRING).
                associationProperty(RosParameter.AssociationProperty.VPC_CIDR_BLOCK).build();
        RosParameter VSwitchCidrBlock = RosParameter.Builder.create(this, "VSwitchCidrBlock").
                description("The CIDR block of the VSwitch.").type(RosParameterType.STRING).
                associationProperty(RosParameter.AssociationProperty.VSWITCH_CIDR_BLOCK).build();
        RosParameter ZoneId = RosParameter.Builder.create(this, "ZoneId").
                description("Availability Zone ID.").type(RosParameterType.STRING).
                associationProperty(RosParameter.AssociationProperty.ZONE_ID).build();
        Vpc vpc = Vpc.Builder.create(this, "vpc").vpcName("demo001").
                cidrBlock(VpcCidrBlock.getValue()).build();
        VSwitch vswitch = VSwitch.Builder.create(this, "vswitch").vpcId(vpc.getAttrVpcId()).
                cidrBlock(VSwitchCidrBlock.getValue()).zoneId(ZoneId.getValue()).build();
    }
}Python示例
import ros_cdk_core as core
import ros_cdk_ecs as ecs
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        vpc_cidr_block = core.RosParameter(self, "VpcCidrBlock", description="The CIDR block of the VPC.",
                                           type=core.RosParameterType.STRING,
                                           association_property=core.RosParameter.AssociationProperty.VPC_CIDR_BLOCK)
        vswitch_cidr_block = core.RosParameter(self, "VSwitchCidrBlock", description="The CIDR block of the VSwitch.",
                                               type=core.RosParameterType.STRING,
                                               association_property=core.RosParameter.AssociationProperty.VSWITCH_CIDR_BLOCK)
        zone_id = core.RosParameter(self, "ZoneId", description="Availability Zone ID.",
                                    type=core.RosParameterType.STRING,
                                    association_property=core.RosParameter.AssociationProperty.ZONE_ID)
        vpc = ecs.Vpc(self, "vpc", ecs.VPCProps(
            cidr_block=vpc_cidr_block,
            vpc_name="demo001"
        ))
        vswitch = ecs.VSwitch(self, "vswitch", ecs.VSwitchProps(
            cidr_block=vswitch_cidr_block,
            zone_id=zone_id,
            vpc_id=vpc.attr_vpc_id
        ))C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            var VpcCidrBlock = new RosParameter(this, "VpcCidrBlock", new RosParameterProps
            {
                Description = "The CIDR block of the VPC.",
                Type = RosParameterType.STRING,
                AssociationProperty = RosParameter.AssociationProperty.VPC_CIDR_BLOCK
            });
            
            var VSwitchCidrBlock = new RosParameter(this, "VSwitchCidrBlock", new RosParameterProps
            {
                Description = "The CIDR block of the VSwitch.",
                Type = RosParameterType.STRING,
                AssociationProperty = RosParameter.AssociationProperty.VSWITCH_CIDR_BLOCK
            });
            
            var ZoneId = new RosParameter(this, "ZoneId", new RosParameterProps
            {
                Description = "Availability Zone ID.",
                Type = RosParameterType.STRING,
                AssociationProperty = RosParameter.AssociationProperty.ZONE_ID
            });
            var Vpc = new Vpc(this, "vpc", new VPCProps
            {
                CidrBlock = VpcCidrBlock.Value,
                VpcName = "demo001"
            });
            
            var VSwitch = new VSwitch(this, "vswitch", new VSwitchProps
            {
                CidrBlock = VSwitchCidrBlock.Value,
                ZoneId = ZoneId.Value,
                VpcId = Vpc.AttrVpcId
            });
        }
    }
}
您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "VpcCidrBlock": {
      "Type": "String",
      "Description": "The CIDR block of the VPC.",
      "AssociationProperty": "ALIYUN::VPC::VPC::CidrBlock"
    },
    "VSwitchCidrBlock": {
      "Type": "String",
      "Description": "The CIDR block of the VSwitch.",
      "AssociationProperty": "ALIYUN::VPC::VSwitch::CidrBlock"
    },
    "ZoneId": {
      "Type": "String",
      "Description": "Availability Zone ID.",
      "AssociationProperty": "ZoneId"
    }
  },
  "Resources": {
    "vpc": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "CidrBlock": {
          "Ref": "VpcCidrBlock"
        },
        "EnableIpv6": false,
        "VpcName": "demo001"
      }
    },
    "vswitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "CidrBlock": {
          "Ref": "VSwitchCidrBlock"
        },
        "VpcId": {
          "Fn::GetAtt": [
            "vpc",
            "VpcId"
          ]
        },
        "ZoneId": {
          "Ref": "ZoneId"
        }
      }
    }
  }
}资源
ROS支持为模板中的资源设置DependsOn、Count和Condition属性,具体如下:
- DependsOn - 设置DependsOn属性,可以指定特定资源紧跟着另一个资源后创建。为某个资源添加DependsOn属性后,该资源仅在DependsOn属性中指定的资源之后创建。您可以通过以下代码在ROS CDK中设置DependsOn属性。 - TypeScript示例- import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const vpc = new ecs.Vpc(this, 'ROS-VPC', { vpcName: 'VPC_Name', cidrBlock: '10.0.0.0/8', enableIpv6: false, description: 'This is the description of VPC', }); const vswitch = new ecs.VSwitch(this, 'ROS-VSwitch', { vpcId: vpc.getAtt('VpcId'), zoneId: 'cn-beijing-h', vSwitchName: 'VSwitch_Name', cidrBlock: '10.0.0.0/20' }); vswitch.addDependency(vpc); } }- Java示例- package com.myorg; import com.aliyun.ros.cdk.core.*; import com.aliyun.ros.cdk.ecs.*; public class DemoStack extends Stack { public DemoStack(final Construct scope, final String id) { this(scope, id, null); } public DemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // The code that defines your stack goes here Vpc vpc = Vpc.Builder.create(this, "ROS-VPC").vpcName("VPC_Name"). description("This is the description of VPC").cidrBlock("10.0.0.0/8").enableIpv6(false).build(); VSwitch vswitch = VSwitch.Builder.create(this, "ROS-VSwitch").vpcId(vpc.getAttrVpcId()). cidrBlock("10.0.0.0/20").zoneId("cn-beijing-h").vSwitchName("VSwitch_Name").build(); vswitch.addDependency(vpc); } }- Python示例- import ros_cdk_core as core import ros_cdk_ecs as ecs class DemoStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here vpc = ecs.Vpc(self, "ROS-VPC", ecs.VPCProps( cidr_block="10.0.0.0/8", vpc_name="VPC_Name", description="This is the description of VPC", enable_ipv6=False )) vswitch = ecs.VSwitch(self, "ROS-VSwitch", ecs.VSwitchProps( cidr_block="10.0.0.0/20", zone_id="cn-beijing-h", vpc_id=vpc.attr_vpc_id, v_switch_name="VSwitch_Name" )) vswitch.add_dependency(vpc)- C#示例- using AlibabaCloud.SDK.ROS.CDK.Core; using AlibabaCloud.SDK.ROS.CDK.Ecs; namespace Demo { public class DemoStack : Stack { public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // The code that defines your stack goes here var Vpc = new Vpc(this, "ROS-VPC", new VPCProps { CidrBlock = "10.0.0.0/8", VpcName = "VPC_Name", Description = "This is the description of VPC", EnableIpv6 = false }); var VSwitch = new VSwitch(this, "ROS-VSwitch", new VSwitchProps { CidrBlock = "10.0.0.0/20", ZoneId = "cn-beijing-h", VpcId = Vpc.AttrVpcId, VSwitchName = "VSwitch_Name" }); VSwitch.AddDependency(Vpc); } } }- 您可以解析ROS CDK代码,生成如下ROS模板: - { "Description": "This is the simple ros cdk app example.", "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "Create by ROS CDK" ] } }, "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "ROS-VPC": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "Description": "This is the description of VPC", "EnableIpv6": false, "VpcName": "VPC_Name" } }, "ROS-VSwitch": { "Type": "ALIYUN::ECS::VSwitch", "Properties": { "CidrBlock": "10.0.0.0/20", "VpcId": { "Fn::GetAtt": [ "ROS-VPC", "VpcId" ] }, "ZoneId": "cn-beijing-h", "VSwitchName": "VSwitch_Name" }, "DependsOn": [ "ROS-VPC" ] } } }
- Count - 为资源指定Count属性后,ROS会对模板进行预处理,把该资源展开成多个资源。 操作资源栈时使用处理后的模板。您可以通过以下代码在ROS CDK中设置Count属性。 - TypeScript示例- import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const vpc = new ecs.Vpc(this, 'ROS-VPC', { cidrBlock: '10.0.0.0/8', enableIpv6: false, }); vpc.addCount(2) const vsw =new ecs.VSwitch(this, `vsw-from-ros-cdk`, { vpcId: ros.Fn.select(ros.RosPseudo.index, vpc.attrVpcId), zoneId: ros.Fn.select(ros.RosPseudo.index, ros.Fn.getAzs(ros.RosPseudo.region)), cidrBlock: '10.0.0.0/16', }); vsw.addCount(2) } }- Java示例- package com.myorg; import com.aliyun.ros.cdk.core.*; import com.aliyun.ros.cdk.ecs.*; public class DemoStack extends Stack { public DemoStack(final Construct scope, final String id) { this(scope, id, null); } public DemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // The code that defines your stack goes here Vpc vpc = Vpc.Builder.create(this, "ROS-VPC").cidrBlock("10.0.0.0/8").enableIpv6(false).build(); vpc.addCount(2); VSwitch vswitch = VSwitch.Builder.create(this, "vsw-from-ros-cdk"). vpcId(Fn.select(RosPseudo.getIndex(), vpc.getAttrVpcId())). cidrBlock("10.0.0.0/16"). zoneId(Fn.select(RosPseudo.getIndex(), Fn.getAzs(RosPseudo.getRegion()))).build(); vswitch.addCount(2); } }- Python示例- import ros_cdk_core as core import ros_cdk_ecs as ecs class DemoStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here vpc = ecs.Vpc(self, "ROS-VPC", ecs.VPCProps( cidr_block="10.0.0.0/8", enable_ipv6=False )) vpc.add_count(2) vswitch = ecs.VSwitch(self, "vsw-from-ros-cdk", ecs.VSwitchProps( cidr_block="10.0.0.0/16", zone_id=core.Fn.select(core.RosPseudo.index, core.Fn.get_azs(core.RosPseudo.region)), vpc_id=core.Fn.select(core.RosPseudo.index, vpc.attr_vpc_id) )) vswitch.add_count(2)- C#示例- using AlibabaCloud.SDK.ROS.CDK.Core; using AlibabaCloud.SDK.ROS.CDK.Ecs; namespace Demo { public class DemoStack : Stack { public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // The code that defines your stack goes here var Vpc = new Vpc(this, "ROS-VPC", new VPCProps { CidrBlock = "10.0.0.0/8", EnableIpv6 = false }); Vpc.AddCount(2); var VSwitch = new VSwitch(this, "vsw-from-ros-cdk", new VSwitchProps { CidrBlock = "10.0.0.0/16", ZoneId = Fn.Select(RosPseudo.Index, Fn.GetAzs(RosPseudo.Region)), VpcId = Fn.Select(RosPseudo.Index, Vpc.AttrVpcId) }); VSwitch.AddCount(2); } } }- 您可以解析ROS CDK代码,生成如下ROS模板: - { "Description": "This is the simple ros cdk app example.", "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "Create by ROS CDK" ] } }, "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "ROS-VPC": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "EnableIpv6": false }, "Count": 2 }, "vsw-from-ros-cdk": { "Type": "ALIYUN::ECS::VSwitch", "Properties": { "CidrBlock": "10.0.0.0/16", "VpcId": { "Fn::Select": [ { "Ref": "ALIYUN::Index" }, { "Fn::GetAtt": [ "ROS-VPC", "VpcId" ] } ] }, "ZoneId": { "Fn::Select": [ { "Ref": "ALIYUN::Index" }, { "Fn::GetAZs": { "Ref": "ALIYUN::Region" } } ] } }, "Count": 2 } } }
- Condition - 使用Condition属性可以指定是否需要创建资源。只有Condition所指定的条件值为True时,才会创建此资源。您可以通过以下代码在ROS CDK中设置Condition属性。 - TypeScript示例- import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const createVPC = new ros.RosParameter(this, 'CreateVPC', { type: ros.RosParameterType.BOOLEAN, defaultValue: true, }); const isCreateVPC = new ros.RosCondition(this, 'IsCreateVPC', { expression: ros.Fn.conditionEquals(true, createVPC.valueAsBoolean), }); const vpc = new ecs.Vpc(this, 'ROS-VPC', { vpcName: 'VPC_Name', cidrBlock: '10.0.0.0/8', enableIpv6: false, description: 'This is the description of VPC', }); vpc.addCondition(isCreateVPC) } }- Java示例- package com.myorg; import com.aliyun.ros.cdk.core.*; import com.aliyun.ros.cdk.ecs.*; public class DemoStack extends Stack { public DemoStack(final Construct scope, final String id) { this(scope, id, null); } public DemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // The code that defines your stack goes here RosParameter CreateVpc = RosParameter.Builder.create(this, "CreateVpc") .type(RosParameterType.BOOLEAN). defaultValue(true).build(); RosCondition IsCreateVpc = RosCondition.Builder.create(this, "IsCreateVpc").expression(Fn.conditionEquals(true, CreateVpc.getValueAsBoolean())).build(); Vpc vpc = Vpc.Builder.create(this, "ROS-VPC").vpcName("VPC_Name").description("This is the description of VPC"). cidrBlock("10.0.0.0/8").enableIpv6(false).build(); vpc.addCondition(IsCreateVpc); } }- Python示例- import ros_cdk_core as core import ros_cdk_ecs as ecs class DemoStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here create_vpc = core.RosParameter(self, "CreateVPC", type=core.RosParameterType.BOOLEAN, default_value=True) is_create_vpc = core.RosCondition(self, "IsCreateVPC", expression=core.Fn.condition_equals(True, create_vpc.value_as_boolean)) vpc = ecs.Vpc(self, "ROS-VPC", ecs.VPCProps( cidr_block="10.0.0.0/8", vpc_name="VPC_Name", description="This is the description of VPC", enable_ipv6=False )) vpc.add_condition(is_create_vpc)- C#示例- using AlibabaCloud.SDK.ROS.CDK.Core; using AlibabaCloud.SDK.ROS.CDK.Ecs; namespace Demo { public class DemoStack : Stack { public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { // The code that defines your stack goes here var CreateVpc = new RosParameter(this, "CreateVpc", new RosParameterProps { Type = RosParameterType.BOOLEAN, DefaultValue = true }); var IsCreateVpc = new RosCondition(this, "IsCreateVpc", new RosConditionProps { Expression = Fn.ConditionEquals(true, CreateVpc.ValueAsBoolean) }); var Vpc = new Vpc(this, "ROS-VPC", new VPCProps { CidrBlock = "10.0.0.0/8", EnableIpv6 = false, Description = "This is the description of VPC", VpcName = "VPC_Name" }); Vpc.AddCondition(IsCreateVpc); } } }- 您可以解析ROS CDK代码,生成如下ROS模板: - { "Description": "This is the simple ros cdk app example.", "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "Create by ROS CDK" ] } }, "ROSTemplateFormatVersion": "2015-09-01", "Parameters": { "CreateVPC": { "Type": "Boolean", "Default": true } }, "Conditions": { "IsCreateVPC": { "Fn::Equals": [ true, { "Ref": "CreateVPC" } ] } }, "Resources": { "ROS-VPC": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "Description": "This is the description of VPC", "EnableIpv6": false, "VpcName": "VPC_Name" }, "Condition": "IsCreateVPC" } } }
- 获取资源属性 - ROS CDK支持获取资源属性,并支持使用内部函数ref获取指定资源的值,如下以多种开发语言示例展示。 - TypeScript示例- import * as ros from '@alicloud/ros-cdk-core'; import * as ecs from '@alicloud/ros-cdk-ecs'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const vpc = new ecs.Vpc(this, 'vpc-from-ros-cdk', { vpcName: 'test-ros-cdk', cidrBlock: '10.0.0.0/8', description: 'This is ros cdk test' }); const vsw1 = new ecs.VSwitch(this, 'vsw-from-ros-cdk-1', { cidrBlock: '10.0.1.0/16', zoneId: 'cn-beijing-g', vpcId: ros.Token.asString(vpc?.ref) }); const vsw2 = new ecs.VSwitch(this, 'vsw-from-ros-cdk-2', { cidrBlock: '10.0.2.0/16', zoneId: 'cn-beijing-h', vpcId: vpc.attrVpcId }); } }- Java示例- package com.myorg; import com.aliyun.ros.cdk.core.*; import com.aliyun.ros.cdk.ecs.Vpc; import com.aliyun.ros.cdk.ecs.VSwitch; public class DemoStack extends Stack { public DemoStack(final Construct scope, final String id) { this(scope, id, null); } public DemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // The code that defines your stack goes here Vpc vpc1 = Vpc.Builder.create(this, "vpc-from-ros-cdk").vpcName("test-ros-cdk").description("This is ros cdk test"). cidrBlock("10.0.0.0/8").build(); VSwitch vsw1 = VSwitch.Builder.create(this, "vsw-from-ros-cdk-1").vpcId(vpc1.getRef()).zoneId("cn-beijing-g"). cidrBlock("10.0.1.0/16").build(); VSwitch vsw2 = VSwitch.Builder.create(this, "vsw-from-ros-cdk-2").vpcId(vpc1.getAttrVpcId()).zoneId("cn-beijing-h"). cidrBlock("10.0.2.0/16").build(); } }- Python示例- import ros_cdk_core as core import ros_cdk_ecs as ecs class DemoStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here vpc = ecs.Vpc(self, "vpc-from-ros-cdk", ecs.VPCProps( cidr_block='10.0.0.0/8', vpc_name='test-ros-cdk', description='This is ros cdk test' )) vsw1 = ecs.VSwitch(self, "vsw-from-ros-cdk-1", ecs.VSwitchProps( cidr_block='10.0.1.0/16', vpc_id=vpc.ref, zone_id='cn-beijing-g' )) vsw2 = ecs.VSwitch(self, "vsw-from-ros-cdk-2", ecs.VSwitchProps( cidr_block='10.0.2.0/16', vpc_id=vpc.attr_vpc_id, zone_id='cn-beijing-h' ))- C#示例- using AlibabaCloud.SDK.ROS.CDK.Core; using AlibabaCloud.SDK.ROS.CDK.Ecs; namespace Demo { public class DemoStack : Stack { public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var vpc = new Vpc(this, "vpc-from-ros-cdk", new VPCProps { VpcName = "test-ros-cdk", CidrBlock = "10.0.0.0/8", Description = "This is ros cdk test" }); var vsw1 = new VSwitch(this, "vsw-from-ros-cdk-1", new VSwitchProps { VpcId = vpc.Ref, CidrBlock = "10.0.1.0/16", ZoneId = "cn-beijing-g" } ); var vsw2 = new VSwitch(this, "vsw-from-ros-cdk-2", new VSwitchProps { VpcId = vpc.AttrVpcId, CidrBlock = "10.0.2.0/16", ZoneId = "cn-beijing-h" } ); } } }- 您可以解析ROS CDK代码,生成如下ROS模板: - { "Description": "This is the simple ros cdk app example.", "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "Create by ROS CDK" ] } }, "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "vpc-from-ros-cdk": { "Type": "ALIYUN::ECS::VPC", "Properties": { "CidrBlock": "10.0.0.0/8", "Description": "This is ros cdk test", "EnableIpv6": false, "VpcName": "test-ros-cdk" } }, "vsw-from-ros-cdk-1": { "Type": "ALIYUN::ECS::VSwitch", "Properties": { "CidrBlock": "10.0.1.0/16", "VpcId": { "Ref": "vpc-from-ros-cdk" }, "ZoneId": "cn-beijing-g" } }, "vsw-from-ros-cdk-2": { "Type": "ALIYUN::ECS::VSwitch", "Properties": { "CidrBlock": "10.0.2.0/16", "VpcId": { "Fn::GetAtt": [ "vpc-from-ros-cdk", "VpcId" ] }, "ZoneId": "cn-beijing-h" } } } }
- DataSource资源 - ROS CDK支持使用DataSource资源类型查询对应资源需要使用的资源信息,如下以多种开发语言示例展示。 - TypeScript示例- import * as ros from '@alicloud/ros-cdk-core'; import * as vpc from '@alicloud/ros-cdk-vpc'; export class DemoStack extends ros.Stack { constructor(scope: ros.Construct, id: string, props?: ros.StackProps) { super(scope, id, props); new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example."); // The code that defines your stack goes here const eip = new vpc.Eip(this, 'eip-from-ros-cdk' ,{ name: 'demo001' }) const eips = new vpc.datasource.Addresses(this, 'ds-eip-from-ros-cdk',{ ipAddress: eip.attrEipAddress }) const eipAddresses = new ros.RosOutput(this, 'eipAddresses', { value: eips.attrAddresses, description: 'eipAddresses', }); const eipStatus = new ros.RosOutput(this, 'eipStatus', { value: ros.Fn.getJsonValue('Status', ros.Fn.select(0, eips.attrAddresses)), description: 'eipStatus', }); } }- Java示例- package com.myorg; import com.aliyun.ros.cdk.core.*; import com.aliyun.ros.cdk.vpc.Eip; import com.aliyun.ros.cdk.vpc.datasource.Addresses; public class DemoStack extends Stack { public DemoStack(final Construct scope, final String id) { this(scope, id, null); } public DemoStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); // The code that defines your stack goes here Eip eip1 = Eip.Builder.create(this, "Eip").name("demo001").build(); Addresses eipAddresses = Addresses.Builder.create(this,"DataSourceAddresses").ipAddress(eip1.getAttrEipAddress()).build(); RosOutput.Builder.create(this,"EipAddresses").value(eipAddresses.getAttrAddresses()).build(); RosOutput.Builder.create(this,"EipStatus").value(Fn.getJsonValue("Status", Fn.select(0,eipAddresses.getAttrAddresses()))).build(); } }- Python示例- import ros_cdk_core as core import ros_cdk_vpc as vpc class DemoStack(core.Stack): def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) # The code that defines your stack goes here eip1 = vpc.Eip(self, "Eip", vpc.EIPProps( name="demo001" )) ds_eip = vpc.datasource.Addresses(self, "ds_eip", vpc.datasource.AddressesProps( ip_address=eip1.attr_eip_address )) core.RosOutput(self, "eips_addresses", value=ds_eip.attr_addresses) core.RosOutput(self, "eip_status", value=core.Fn.get_json_value('Status', core.Fn.select(0, ds_eip.attr_addresses)))- C#示例- using AlibabaCloud.SDK.ROS.CDK.Core; using AlibabaCloud.SDK.ROS.CDK.Vpc; using AlibabaCloud.SDK.ROS.CDK.Vpc.Datasource; namespace Demo { public class DemoStack : Stack { public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var Eip = new Eip(this, "eip-from-ros-cdk", new EIPProps { Name = "demo003" }); var DataSourceEip = new Addresses(this, "ds-eip-from-ros-cdk", new AddressesProps { IpAddress = Eip.AttrEipAddress }); new RosOutput(this, "EipsAddresses", new RosOutputProps { Value = DataSourceEip.AttrAddresses }); new RosOutput(this, "EipStatus", new RosOutputProps { Value = Fn.GetJsonValue("Status", Fn.Select(0, DataSourceEip.AttrAddresses)) }); } } }- 您可以解析ROS CDK代码,生成如下ROS模板: - { "Description": "This is the simple ros cdk app example.", "Metadata": { "ALIYUN::ROS::Interface": { "TemplateTags": [ "Create by ROS CDK" ] } }, "ROSTemplateFormatVersion": "2015-09-01", "Resources": { "eip-from-ros-cdk": { "Type": "ALIYUN::VPC::EIP", "Properties": { "AutoPay": true, "Bandwidth": 5, "DeletionProtection": false, "InstanceChargeType": "Postpaid", "InternetChargeType": "PayByBandwidth", "Name": "demo001", "Period": 1, "PricingCycle": "Month" } }, "ds-eip-from-ros-cdk": { "Type": "DATASOURCE::EIP::Addresses", "Properties": { "IpAddress": { "Fn::GetAtt": [ "eip-from-ros-cdk", "EipAddress" ] } } } }, "Outputs": { "eipAddresses": { "Description": "eipAddresses", "Value": { "Fn::GetAtt": [ "ds-eip-from-ros-cdk", "Addresses" ] } }, "eipStatus": { "Description": "eipStatus", "Value": { "Fn::GetJsonValue": [ "Status", { "Fn::Select": [ 0, { "Fn::GetAtt": [ "ds-eip-from-ros-cdk", "Addresses" ] } ] } ] } } } }
函数
ROS支持使用函数(Functions)管理资源栈,您可以通过以下代码在ROS CDK中设置函数。
关于函数(Functions)的更多信息,请参见函数(Functions)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as ecs from '@alicloud/ros-cdk-ecs';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const vpcName = new ros.RosParameter(this, 'VpcName', {
            type: ros.RosParameterType.STRING,
            defaultValue:"VPC1,VPC2,VPC3"
        });
        const vswName = new ros.RosParameter(this, 'VSWName', {
            type: ros.RosParameterType.JSON,
            defaultValue: {"VSWName": "VSW1"}
        });
        const vpc = new ecs.Vpc(this, 'ROS-VPC', {
            vpcName: ros.Fn.select(0, ros.Fn.split(',', vpcName.valueAsString)),
            cidrBlock: '10.0.0.0/8',
            enableIpv6: false,
            description: 'This is the description of VPC',
        });
        const vswitch = new ecs.VSwitch(this, 'ROS-VSwitch', {
            vpcId: vpc.getAtt('VpcId'),
            vSwitchName: ros.Fn.getJsonValue('VSWName', vswName.valueAsAny),
            cidrBlock: '10.0.0.0/20',
            zoneId: ros.Fn.select(0, ros.Fn.getAzs(ros.Fn.ref('ALIYUN::Region'))),
        });
        vswitch.addDependency(vpc);
        const SubResultOutput = new ros.RosOutput(this, 'result', {
            value: ros.Fn.sub('Var1: ${Var1}, Var2: ${Var2}, StackName: ${ALIYUN::StackName}, Region: ${ALIYUN::Region}', {
                Var1: 'Var1Value',
                Var2: 'Var2Value',
            }),
            description: 'test Sub function result',
        });
        const maxResultOutput = new ros.RosOutput(this, 'maxVal', {
            value: ros.Fn.max([1, 777]),
            description: 'test max function',
        });
        const minResultOutput = new ros.RosOutput(this, 'minVal', {
            value: ros.Fn.min([1, 777]),
            description: 'test min function',
        });
        const addResultOutput = new ros.RosOutput(this, 'testFunction1', {
            value: ros.Fn.add([3.14, 8.4]),
            description: 'number type add',
        });
    }
}Java示例
package com.myorg;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.ecs.*;
import java.util.HashMap;
import java.util.List;
import java.util.Arrays;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        ObjectNode VSWNameValue = new ObjectMapper().createObjectNode();
        VSWNameValue.put("VSWName", "VSW1");
        HashMap<String, Object> ResultOutputJson = new HashMap<>();
        ResultOutputJson.put("Var1", "Var1Value");
        ResultOutputJson.put("Var2", "Var2Value");
        List<Number> list1 = Arrays.asList(1, 777);
        List<Number> list2 = Arrays.asList(3.14, 8.4);
        RosParameter VpcName = RosParameter.Builder.create(this, "VpcName").type(RosParameterType.STRING).
                defaultValue("VPC1,VPC2,VPC3").build();
        RosParameter VSWName = RosParameter.Builder.create(this, "VSWName").type(RosParameterType.JSON).
                defaultValue(VSWNameValue).build();
        Vpc vpc = Vpc.Builder.create(this, "ROS-VPC").vpcName(Fn.select(0, Fn.split(",", VpcName.getValueAsString()))).
                cidrBlock("10.0.0.0/8").enableIpv6(false).description("This is the description of VPC").build();
        VSwitch vswitch = VSwitch.Builder.create(this, "ROS-VSwitch").vpcId(vpc.getAttrVpcId()).vSwitchName(Fn.getJsonValue("VSWName", VSWName.getValueAsAny())).
                cidrBlock("10.0.0.0/20").zoneId(Fn.select(0, Fn.getAzs(Fn.ref("ALIYUN::Region")))).build();
        vswitch.addDependency(vpc);
        RosOutput SubResultOutput = RosOutput.Builder.create(this, "result").value(
                Fn.sub("Var1: ${Var1}, Var2: ${Var2}, StackName: ${ALIYUN::StackName}, Region: ${ALIYUN::Region}", ResultOutputJson)
        ).description("test Sub function result").build();
        RosOutput MaxResultOutput = RosOutput.Builder.create(this, "maxVal").value(Fn.max(list1)).description("test max function").build();
        RosOutput MinResultOutput = RosOutput.Builder.create(this, "minVal").value(Fn.min(list1)).description("test min function").build();
        RosOutput AddResultOutput = RosOutput.Builder.create(this, "testFunction1").value(Fn.add(list2)).description("number type add").build();
    }
}Python示例
import ros_cdk_core as core
import ros_cdk_ecs as ecs
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        vpc_name = core.RosParameter(self, "VpcName",
                                     type=core.RosParameterType.STRING,
                                     default_value="VPC1,VPC2,VPC3")
        vsw_name = core.RosParameter(self, "VSWName",
                                     type=core.RosParameterType.JSON,
                                     default_value={"VSWName": "VSW1"})
        vpc = ecs.Vpc(self, "ROS-VPC", ecs.VPCProps(
            cidr_block="10.0.0.0/8",
            vpc_name=core.Fn.select(0, core.Fn.split(',', vpc_name.value_as_string)),
            description="This is the description of VPC",
            enable_ipv6=False
        ))
        vswitch = ecs.VSwitch(self, "ROS-VSwitch", ecs.VSwitchProps(
            cidr_block="10.0.0.0/20",
            v_switch_name=core.Fn.get_json_value('VSWName', vsw_name.value_as_any),
            vpc_id=vpc.attr_vpc_id,
            zone_id=core.Fn.select(0, core.Fn.get_azs(core.Fn.ref('ALIYUN::Region')))
        ))
        vswitch.add_dependency(vpc)
        sub_result_output = core.RosOutput(self, "result", value=core.Fn.sub(
            "Var1: ${Var1}, Var2: ${Var2}, StackName: ${ALIYUN::StackName}, Region: ${ALIYUN::Region}", {
                "Var1": "Var1Value",
                "Var2": "Var2Value"
            }), description="test Sub function result")
        max_result_output = core.RosOutput(self, "maxVal", value=core.Fn.max([1.777]), description="test max function")
        min_result_output = core.RosOutput(self, "minVal", value=core.Fn.min([1, 777]), description="test min function")
        add_result_output = core.RosOutput(self, "testFunction1", value=core.Fn.add([3.14, 8.4]),
                                           description="number type add")
C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
using Newtonsoft.Json.Linq;
using System.Collections.Generic;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            
            JObject VSWNameObj = new JObject();
            VSWNameObj.Add("VSWName", "VSW1");
            
            Dictionary<string, object> ResultOutputObj = new Dictionary<string, object>();
            ResultOutputObj.Add("Var1", "Var1Value");
            ResultOutputObj.Add("Var2", "Var2Value");
            double[] maxAndMinOutputArray = new double[2] {1, 777};
            object[] testFunction1Array = new object[2] {3.14, 8.4};
            var VpcName = new RosParameter(this, "VpcName", new RosParameterProps
            {
                Type = RosParameterType.STRING,
                DefaultValue = "VPC1,VPC2,VPC3"
            });
            
            var VSWName = new RosParameter(this, "VSWName", new RosParameterProps
            {
                Type = RosParameterType.JSON,
                DefaultValue = VSWNameObj
            });
            var Vpc = new Vpc(this, "ROS-VPC", new VPCProps
            {
                CidrBlock = "10.0.0.0/8",
                VpcName = Fn.Select(0, Fn.Split(",", VpcName.ValueAsString)),
                Description = "This is the description of VPC",
                EnableIpv6 = false
            });
            
            var VSwitch = new VSwitch(this, "ROS-VSwitch", new VSwitchProps
            {
                CidrBlock = "10.0.0.0/20",
                ZoneId = Fn.Select(0, Fn.GetAzs(Fn.Ref("ALIYUN::Region"))),
                VpcId = Vpc.AttrVpcId,
                VSwitchName = Fn.GetJsonValue("VSWName", VSWName.ValueAsAny)
            });
            VSwitch.AddDependency(Vpc);
            var SubResultOutput = new RosOutput(this, "result", new RosOutputProps
            {
                Value = Fn.Sub("Var1: ${Var1}, Var2: ${Var2}, StackName: ${ALIYUN::StackName}, Region: ${ALIYUN::Region}", ResultOutputObj),
                Description = "test Sub function result"
            });
            var maxResultOutput = new RosOutput(this, "maxVal" ,new RosOutputProps
            {
                Value = Fn.Max(maxAndMinOutputArray),
                Description = "test max function"
            });
            var minResultOutput = new RosOutput(this, "minVal" ,new RosOutputProps
            {
                Value = Fn.Min(maxAndMinOutputArray),
                Description = "test min function"
            });
            var addResultOutput = new RosOutput(this, "testFunction1" ,new RosOutputProps
            {
                Value = Fn.Add(testFunction1Array),
                Description = "number type add"
            });
        }
    }
}您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "VpcName": {
      "Type": "String",
      "Default": "VPC1,VPC2,VPC3"
    },
    "VSWName": {
      "Type": "Json",
      "Default": {
        "VSWName": "VSW1"
      }
    }
  },
  "Resources": {
    "ROS-VPC": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/8",
        "Description": "This is the description of VPC",
        "EnableIpv6": false,
        "VpcName": {
          "Fn::Select": [
            0,
            {
              "Fn::Split": [
                ",",
                {
                  "Ref": "VpcName"
                }
              ]
            }
          ]
        }
      }
    },
    "ROS-VSwitch": {
      "Type": "ALIYUN::ECS::VSwitch",
      "Properties": {
        "CidrBlock": "10.0.0.0/20",
        "VpcId": {
          "Fn::GetAtt": [
            "ROS-VPC",
            "VpcId"
          ]
        },
        "ZoneId": {
          "Fn::Select": [
            0,
            {
              "Fn::GetAZs": {
                "Ref": "ALIYUN::Region"
              }
            }
          ]
        },
        "VSwitchName": {
          "Fn::GetJsonValue": [
            "VSWName",
            {
              "Ref": "VSWName"
            }
          ]
        }
      },
      "DependsOn": [
        "ROS-VPC"
      ]
    }
  },
  "Outputs": {
    "result": {
      "Description": "test Sub function result",
      "Value": {
        "Fn::Sub": [
          "Var1: ${Var1}, Var2: ${Var2}, StackName: ${ALIYUN::StackName}, Region: ${ALIYUN::Region}",
          {
            "Var1": "Var1Value",
            "Var2": "Var2Value"
          }
        ]
      }
    },
    "maxVal": {
      "Description": "test max function",
      "Value": {
        "Fn::Max": [
          1,
          777
        ]
      }
    },
    "minVal": {
      "Description": "test min function",
      "Value": {
        "Fn::Min": [
          1,
          777
        ]
      }
    },
    "testFunction1": {
      "Description": "number type add",
      "Value": {
        "Fn::Add": [
          3.14,
          8.4
        ]
      }
    }
  }
}条件
ROS支持在模板中定义条件(Conditions),根据您在创建或更新资源栈时,指定的输入参数值进行计算。在每个条件中,都可以引用其他条件、参数值或映射。您可以通过以下代码在ROS CDK中设置条件。
关于条件(Conditions)的更多信息,请参见条件(Conditions)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as rds from '@alicloud/ros-cdk-rds';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const rdsDBInstanceEngineType = new ros.RosParameter(this, 'RdsDBInstanceEngineType', {
            type: ros.RosParameterType.STRING,
            defaultValue: 'sqlserver',
            allowedValues: [
                'sqlserver',
                'mysql'
            ]
        });
        const rdsDBInstanceId = new ros.RosParameter(this, 'RdsDBInstanceId', {
            type: ros.RosParameterType.STRING,
        });
        const rdsDBName = new ros.RosParameter(this, 'RdsDBName', {
            type: ros.RosParameterType.STRING,
        });
        const rdsEngineTypeConditions = new ros.RosCondition(this, 'RdsEngineTypeConditions', {
            expression: ros.Fn.conditionEquals('mysql', rdsDBInstanceEngineType.valueAsString),
        });
        const rdsDataBase = new rds.Database(this, 'Database', {
            dbInstanceId: rdsDBInstanceId.valueAsString,
            dbName: rdsDBName.valueAsString,
            characterSetName: ros.Fn.conditionIf(rdsEngineTypeConditions.node.id, 'utf8', 'Chinese_PRC_CI_AS')
        })
    }
}Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.rds.*;
import java.util.Arrays;
import java.util.List;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        List<String> list1 = Arrays.asList("sqlserver", "mysql");
        RosParameter rdsDBInstanceEngineType = RosParameter.Builder.create(this, "RdsDBInstanceEngineType")
                .type(RosParameterType.STRING).
                defaultValue("sqlserver").allowedValues(list1).build();
        RosParameter rdsDBInstanceId = RosParameter.Builder.create(this, "RdsDBInstanceId")
                .type(RosParameterType.STRING).build();
        RosParameter rdsDBName = RosParameter.Builder.create(this, "RdsDBName")
                .type(RosParameterType.STRING).build();
        RosCondition rdsEngineTypeConditions = RosCondition.Builder.create(this, "RdsEngineTypeConditions").expression(Fn.conditionEquals("mysql", rdsDBInstanceEngineType.getValueAsString())).build();
        Database rdsDataBase = Database.Builder.create(this, "Database").dbName(rdsDBName.getValueAsString()).dbInstanceId(rdsDBInstanceId.getValueAsString()).characterSetName(Fn.conditionIf(rdsEngineTypeConditions.getNode().getId(), "utf8", "Chinese_PRC_CI_AS").toString()).build();
    }
}
Python示例
import ros_cdk_core as core
import ros_cdk_rds as rds
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        rds_db_instance_engine_type = core.RosParameter(self, "RdsDBInstanceEngineType",
                                                        type=core.RosParameterType.STRING,
                                                        default_value="sqlserver",
                                                        allowed_values=["sqlserver", "mysql"])
        rds_db_instance_id = core.RosParameter(self, "RdsDBInstanceId",
                                               type=core.RosParameterType.STRING)
        rds_db_name = core.RosParameter(self, "RdsDBName",
                                        type=core.RosParameterType.STRING)
        rds_engine_type_conditions = core.RosCondition(self, "RdsEngineTypeConditions",
                          expression=core.Fn.condition_equals("mysql", rds_db_instance_engine_type.value_as_string))
        database = rds.Database(self, "Database", rds.DatabaseProps(
            db_name=rds_db_name.value_as_string,
            db_instance_id=rds_db_instance_id.value_as_string,
            character_set_name=core.Fn.condition_if(rds_engine_type_conditions.node.id, "utf8", "Chinese_PRC_CI_AS")
        ))
C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Rds;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            
            object[] RdsDBInstanceEngineTypeArray = new object[2] {"sqlserver", "mysql"};
            
            var rdsDBInstanceEngineType = new RosParameter(this, "RdsDBInstanceEngineType", new RosParameterProps
            {
                Type = RosParameterType.STRING,
                DefaultValue = "sqlserver",
                AllowedValues = RdsDBInstanceEngineTypeArray
            });
            var rdsDBInstanceId = new RosParameter(this, "RdsDBInstanceId", new RosParameterProps
            {
                Type = RosParameterType.STRING
            });
            
            var rdsDBName = new RosParameter(this, "RdsDBName", new RosParameterProps
            {
                Type = RosParameterType.STRING
            });
            
            
            var rdsEngineTypeConditions = new RosCondition(this, "RdsEngineTypeConditions", new RosConditionProps
            {
                Expression = Fn.ConditionEquals("mysql", rdsDBInstanceEngineType.ValueAsString)
            });
            var Database = new Database(this, "Database", new DatabaseProps
            {
                DbName = rdsDBName.ValueAsString,
                DbInstanceId = rdsDBInstanceId.ValueAsString,
                CharacterSetName = Fn.ConditionIf(rdsEngineTypeConditions.Node.Id, "utf8", "Chinese_PRC_CI_AS")
            });
        }
    }
}您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "RdsDBInstanceEngineType": {
      "Type": "String",
      "Default": "sqlserver",
      "AllowedValues": [
        "sqlserver",
        "mysql"
      ]
    },
    "RdsDBInstanceId": {
      "Type": "String"
    },
    "RdsDBName": {
      "Type": "String"
    }
  },
  "Conditions": {
    "RdsEngineTypeConditions": {
      "Fn::Equals": [
        "mysql",
        {
          "Ref": "RdsDBInstanceEngineType"
        }
      ]
    }
  },
  "Resources": {
    "Database": {
      "Type": "ALIYUN::RDS::Database",
      "Properties": {
        "CharacterSetName": {
          "Fn::If": [
            "RdsEngineTypeConditions",
            "utf8",
            "Chinese_PRC_CI_AS"
          ]
        },
        "DBInstanceId": {
          "Ref": "RdsDBInstanceId"
        },
        "DBName": {
          "Ref": "RdsDBName"
        }
      }
    }
  }
}映射
ROS支持Key-Value形式的映射(Mappings)表,您可以指定Key从而获取映射表的Value。您可以通过以下代码在ROS CDK中设置映射。
关于映射(Mappings)的更多信息,请参见映射(Mappings)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as ecs from '@alicloud/ros-cdk-ecs';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const region = new ros.RosParameter(this, 'region', {
            type: ros.RosParameterType.STRING,
            allowedValues: ['cn-hangzhou', 'cn-beijing'],
        });
        const vpcId = new ros.RosParameter(this, 'VpcId', {
            type: ros.RosParameterType.STRING,
        });
        const vSwitchId = new ros.RosParameter(this, 'VSwitchId', {
            type: ros.RosParameterType.STRING,
        });
        const securityGroupId = new ros.RosParameter(this, 'SecurityGroupId', {
            type: ros.RosParameterType.STRING,
        });
        const ecsImageInfo = new ros.RosMapping(this, 'ECSImageInfo', {
            mapping: {
                "cn-hangzhou": {
                    "32": "m-25l0rcfjo",
                    "64": "m-25l0rcfj1"
                },
                "cn-beijing": {
                    "32": "m-25l0rcfj2",
                    "64": "m-25l0rcfj3"
                }
            },
        });
        const ecsGroups = new ecs.InstanceGroup(this,'ros-cdk-test-ecs',{
            vpcId: vpcId.valueAsString,
            vSwitchId: vSwitchId.valueAsString,
            imageId: ecsImageInfo.findInMap(region.valueAsString, '64'),
            maxAmount: 1,
            securityGroupId: securityGroupId.valueAsString,
            instanceType:'ecs.c6.large',
            instanceName: 'test-ros-cdk-ecs',
        });
    }
}Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.ecs.*;
import java.util.Arrays;
import java.util.Map;
import java.util.HashMap;
import java.util.List;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.fasterxml.jackson.databind.ObjectMapper;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        List<String> list1 = Arrays.asList("cn-hangzhou", "cn-beijing");
        Map<String, Object> RegionHangzhou = new HashMap<>();
        Map<String, Object> RegionBeijing = new HashMap<>();
        RegionHangzhou.put("32", "m-25l0rcfjo");
        RegionHangzhou.put("64", "m-25l0rcfj1");
        RegionBeijing.put("32", "m-25l0rcfj2");
        RegionBeijing.put("64", "m-25l0rcfj3");
        Map<String, Map<String, Object>> mapping = new HashMap<>();
        mapping.put("cn-hangzhou", RegionHangzhou);
        mapping.put("cn-beijing", RegionBeijing);
        RosParameter region = RosParameter.Builder.create(this, "region").type(RosParameterType.STRING).allowedValues(list1).build();
        RosParameter VpcId = RosParameter.Builder.create(this, "VpcId").type(RosParameterType.STRING).build();
        RosParameter VSwitchId = RosParameter.Builder.create(this, "VSwitchId").type(RosParameterType.STRING).build();
        RosParameter SecurityGroupId = RosParameter.Builder.create(this, "SecurityGroupId").type(RosParameterType.STRING).build();
        RosMapping EcsImageInfo = RosMapping.Builder.create(this, "ECSImageInfo").mapping(mapping).build();
        InstanceGroup.Builder.create(this, "ros-cdk-test-ecs").vpcId(VpcId.getValueAsString()).
                vSwitchId(VSwitchId.getValueAsString()).maxAmount(1).securityGroupId(SecurityGroupId.getValueAsString()).
                instanceType("ecs.c6.large").instanceName("test-ros-cdk-ecs").imageId(EcsImageInfo.findInMap(region.getValueAsString(), "64")).build();
    }
}
Python示例
import ros_cdk_core as core
import ros_cdk_ecs as ecs
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        region = core.RosParameter(self, "region",
                                   type=core.RosParameterType.STRING,
                                   allowed_values=["cn-hangzhou", "cn-beijing"])
        vpc_id = core.RosParameter(self, "VpcId", type=core.RosParameterType.STRING)
        vs_witch_id = core.RosParameter(self, "VSwitchId", type=core.RosParameterType.STRING)
        sg_id = core.RosParameter(self, "SecurityGroupId", type=core.RosParameterType.STRING)
        ecs_image_info = core.RosMapping(self, "ECSImageInfo", mapping={
            "cn-hangzhou": {
                "32": "m-25l0rcfjo",
                "64": "m-25l0rcfj1"
            },
            "cn-beijing": {
                "32": "m-25l0rcfj2",
                "64": "m-25l0rcfj3"
            }
        })
        ecs.InstanceGroup(self, "ros-cdk-test-ecs", ecs.InstanceGroupProps(
            vpc_id=vpc_id.value_as_string,
            v_switch_id=vs_witch_id.value_as_string,
            security_group_id=sg_id.value_as_string,
            max_amount=1,
            instance_type="ecs.c6.large",
            instance_name="test-ros-cdk-ecs",
            image_id=ecs_image_info.find_in_map(region.value_as_string, "64")
        ))
C#示例
using System.Collections;
using System.Collections.Generic;
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
using Stack = AlibabaCloud.SDK.ROS.CDK.Core.Stack;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            IDictionary<string, IDictionary<string, object>> regionObj = new Dictionary<string, IDictionary<string, object>>();
            Dictionary<string, object> beijingObj = new Dictionary<string, object>();
            Dictionary<string, object> hangzhouObj = new Dictionary<string, object>();
            regionObj.Add("cn-beijing", beijingObj);
            regionObj.Add("cn-hangzhou", hangzhouObj);
            beijingObj.Add("32", "m-25l0rcfjo");
            beijingObj.Add("64", "m-25l0rcfj1");
            hangzhouObj.Add("64", "m-25l0rcfj3");
            hangzhouObj.Add("32", "m-25l0rcfj2");
            
            object[] RegionArray = new object[2] {"cn-hangzhou", "cn-beijing"};
            
            var VpcId = new RosParameter(this, "VpcId", new RosParameterProps
            {
                Type = RosParameterType.STRING,
            });
            var region = new RosParameter(this, "region", new RosParameterProps
            {
                Type = RosParameterType.STRING,
                AllowedValues = RegionArray
            });
            
            var VSwitchId = new RosParameter(this, "VSwitchId", new RosParameterProps
            {
                Type = RosParameterType.STRING
            });
            
            var SecurityGroupId = new RosParameter(this, "SecurityGroupId", new RosParameterProps
            {
                Type = RosParameterType.STRING
            });
            var ecsImageInfo = new RosMapping(this, "ECSImageInfo", new RosMappingProps
            {
                Mapping = regionObj
            });
            var ecs = new InstanceGroup(this, "ros-cdk-test-ecs", new InstanceGroupProps
            {
                VpcId = VpcId.ValueAsString,
                VSwitchId = VSwitchId.ValueAsString,
                SecurityGroupId = SecurityGroupId.ValueAsString,
                MaxAmount = 1,
                InstanceType = "ecs.c6.large",
                InstanceName = "test-ros-cdk-ecs",
                ImageId = ecsImageInfo.FindInMap(region.ValueAsString, "64")
            });
        }
    }
}您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "region": {
      "Type": "String",
      "AllowedValues": [
        "cn-hangzhou",
        "cn-beijing"
      ]
    },
    "VpcId": {
      "Type": "String"
    },
    "VSwitchId": {
      "Type": "String"
    },
    "SecurityGroupId": {
      "Type": "String"
    }
  },
  "Mappings": {
    "ECSImageInfo": {
      "cn-hangzhou": {
        "32": "m-25l0rcfjo",
        "64": "m-25l0rcfj1"
      },
      "cn-beijing": {
        "32": "m-25l0rcfj2",
        "64": "m-25l0rcfj3"
      }
    }
  },
  "Resources": {
    "ros-cdk-test-ecs": {
      "Type": "ALIYUN::ECS::InstanceGroup",
      "Properties": {
        "ImageId": {
          "Fn::FindInMap": [
            "ECSImageInfo",
            {
              "Ref": "region"
            },
            "64"
          ]
        },
        "InstanceType": "ecs.c6.large",
        "MaxAmount": 1,
        "AllocatePublicIP": true,
        "AutoRenew": "False",
        "AutoRenewPeriod": 1,
        "InstanceChargeType": "PostPaid",
        "InstanceName": "test-ros-cdk-ecs",
        "InternetChargeType": "PayByTraffic",
        "InternetMaxBandwidthIn": 200,
        "InternetMaxBandwidthOut": 1,
        "IoOptimized": "optimized",
        "Period": 1,
        "PeriodUnit": "Month",
        "SecurityGroupId": {
          "Ref": "SecurityGroupId"
        },
        "SystemDiskCategory": "cloud_efficiency",
        "VpcId": {
          "Ref": "VpcId"
        },
        "VSwitchId": {
          "Ref": "VSwitchId"
        }
      }
    }
  }
}输出
ROS支持在输出(Outputs)中定义在调用查询资源栈接口时返回的值。您可以通过以下代码在ROS CDK中设置输出。
关于输出(Outputs)的更多信息,请参见输出(Outputs)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as ecs from '@alicloud/ros-cdk-ecs';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const vpc = new ecs.Vpc(this, 'vpc-from-ros-cdk', {
            vpcName: 'test-ros-cdk',
            cidrBlock: '10.0.0.0/8',
            description: 'This is ros cdk test'
        });
        const vpcId = new ros.RosOutput(this, 'vpcId', {
            value:  vpc.attrVpcId,
            description: 'VpcId',
        });
        const vRouterId = new ros.RosOutput(this, 'VRouterId', {
            value:  vpc.attrVRouterId,
            description: 'VRouterId',
        });
        const routeTableId = new ros.RosOutput(this, 'RouteTableId', {
            value:  vpc.attrRouteTableId,
            description: 'RouteTableId',
        });
    }
}Java示例
package com.myorg;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.node.ObjectNode;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.ecs.*;
import java.util.HashMap;
import java.util.List;
import java.util.Arrays;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        ObjectNode VSWNameValue = new ObjectMapper().createObjectNode();
        Vpc vpc = Vpc.Builder.create(this, "vpc-from-ros-cdk").vpcName("test-ros-cdk").
                cidrBlock("10.0.0.0/8").description("This is ros cdk test").build();
        RosOutput vpcId = RosOutput.Builder.create(this, "vpcId").value(vpc.getAttrVpcId()).description("VpcIdn").build();
        RosOutput VRouterId = RosOutput.Builder.create(this, "VRouterId").value(vpc.getAttrVRouterId()).description("VRouterId").build();
        RosOutput RouteTableId = RosOutput.Builder.create(this, "RouteTableId").value(vpc.getAttrRouteTableId()).description("RouteTableId").build();
    }
}
Python示例
import ros_cdk_core as core
import ros_cdk_ecs as ecs
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        vpc = ecs.Vpc(self, "vpc-from-ros-cdk", ecs.VPCProps(
            cidr_block="10.0.0.0/8",
            vpc_name="test-ros-cdk",
            description="This is ros cdk test"
        ))
        vpc_id = core.RosOutput(self, "vpcId", value=vpc.attr_vpc_id, description="VpcId")
        vrouter_id = core.RosOutput(self, "VRouterId", value=vpc.attr_v_router_id, description="VRouterId")
        route_table_id = core.RosOutput(self, "RouteTableId", value=vpc.attr_route_table_id,
                                        description="RouteTableId")
C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            var Vpc = new Vpc(this, "vpc-from-ros-cdk", new VPCProps
            {
                CidrBlock = "10.0.0.0/8",
                VpcName = "test-ros-cdk",
                Description = "This is ros cdk test"
            });
            var vpcId = new RosOutput(this, "vpcId" ,new RosOutputProps
            {
                Value = Vpc.AttrVpcId,
                Description = "VpcId"
            });
            var VRouterId = new RosOutput(this, "VRouterId" ,new RosOutputProps
            {
                Value = Vpc.AttrVRouterId,
                Description = "VRouterId"
            });
            var RouteTableId = new RosOutput(this, "RouteTableId" ,new RosOutputProps
            {
                Value = Vpc.AttrRouteTableId,
                Description = "RouteTableId"
            });
        }
    }
}您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "vpc-from-ros-cdk": {
      "Type": "ALIYUN::ECS::VPC",
      "Properties": {
        "CidrBlock": "10.0.0.0/8",
        "Description": "This is ros cdk test",
        "EnableIpv6": false,
        "VpcName": "test-ros-cdk"
      }
    }
  },
  "Outputs": {
    "vpcId": {
      "Description": "VpcId",
      "Value": {
        "Fn::GetAtt": [
          "vpc-from-ros-cdk",
          "VpcId"
        ]
      }
    },
    "VRouterId": {
      "Description": "VRouterId",
      "Value": {
        "Fn::GetAtt": [
          "vpc-from-ros-cdk",
          "VRouterId"
        ]
      }
    },
    "RouteTableId": {
      "Description": "RouteTableId",
      "Value": {
        "Fn::GetAtt": [
          "vpc-from-ros-cdk",
          "RouteTableId"
        ]
      }
    }
  }
}伪参数
ROS支持将伪参数(Pseudo parameters)作为模板的固定参数。它们可以和用户定义的参数一样被引用,其值在ROS运行时确定。您可以通过以下代码在ROS CDK中设置伪参数。
关于伪参数(Pseudo parameters)的更多信息,请参见伪参数(Pseudo parameters)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
export class DemoStack extends ros.Stack {
  constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
    super(scope, id, props);
    new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
    // The code that defines your stack goes here
    const StackName = new ros.RosOutput(this, 'StackName', {
      value:  ros.RosPseudo.stackName,
    });
    const accountId = new ros.RosOutput(this, 'accountId', {
      value:  ros.RosPseudo.accountId,
    });
    const region = new ros.RosOutput(this, 'region', {
      value:  ros.RosPseudo.region,
    });
    const stackId = new ros.RosOutput(this, 'stackId', {
      value:  ros.RosPseudo.stackId,
    });
    const tenantId = new ros.RosOutput(this, 'tenantId', {
      value:  ros.RosPseudo.tenantId,
    });
  }
}Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        // The code that defines your stack goes here
        RosOutput StackName = RosOutput.Builder.create(this, "StackName").value(RosPseudo.getStackName()).build();
        RosOutput accountId = RosOutput.Builder.create(this, "accountId").value(RosPseudo.getAccountId()).build();
        RosOutput region = RosOutput.Builder.create(this, "region").value(RosPseudo.getRegion()).build();
        RosOutput stackId = RosOutput.Builder.create(this, "stackId").value(RosPseudo.getStackId()).build();
        RosOutput tenantId = RosOutput.Builder.create(this, "tenantId").value(RosPseudo.getTenantId()).build();
    }
}Python示例
import ros_cdk_core as core
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        stack_name = core.RosOutput(self, "StackName", value=core.RosPseudo.stack_name)
        account_id = core.RosOutput(self, "accountId", value=core.RosPseudo.account_id)
        region = core.RosOutput(self, "region", value=core.RosPseudo.region)
        stack_id = core.RosOutput(self, "stackId", value=core.RosPseudo.stack_id)
        tenant_id = core.RosOutput(self, "tenantId", value=core.RosPseudo.tenant_id)C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            // The code that defines your stack goes here
            var StackName = new RosOutput(this, "StackName" ,new RosOutputProps
            {
                Value = RosPseudo.StackName
            });
            var accountId = new RosOutput(this, "accountId" ,new RosOutputProps
            {
                Value = RosPseudo.AccountId
            });
            var region = new RosOutput(this, "region" ,new RosOutputProps
            {
                Value = RosPseudo.Region
            });
            var stackId = new RosOutput(this, "stackId" ,new RosOutputProps
            {
                Value = RosPseudo.StackId
            });
            var tenantId = new RosOutput(this, "tenantId" ,new RosOutputProps
            {
                Value = RosPseudo.TenantId
            });
        }
    }
}您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "TemplateTags": [
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Outputs": {
    "StackName": {
      "Value": {
        "Ref": "ALIYUN::StackName"
      }
    },
    "accountId": {
      "Value": {
        "Ref": "ALIYUN::AccountId"
      }
    },
    "region": {
      "Value": {
        "Ref": "ALIYUN::Region"
      }
    },
    "stackId": {
      "Value": {
        "Ref": "ALIYUN::StackId"
      }
    },
    "tenantId": {
      "Value": {
        "Ref": "ALIYUN::TenantId"
      }
    }
  }
}元数据
ROS支持使用元数据(Metadata)对Parameters中定义的参数进行分组,并且为每一组分别定义标签。您可以通过以下代码在ROS CDK中设置元数据。
关于元数据(Metadata)的更多信息,请参见元数据(Metadata)。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
export class DemoStack extends ros.Stack {
    constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
        super(scope, id, props);
        new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
        // The code that defines your stack goes here
        const vpcId = new ros.RosParameter(this, 'VpcId', {
            type: ros.RosParameterType.STRING,
        });
        const metaData = new ros.RosInfo(this, ros.RosInfo.metadata, {
            'ALIYUN::ROS::Interface': {
                'ParameterGroups': {
                    "Parameters": [
                        vpcId.node.id
                    ],
                    "Label": {
                        "default": {
                            "zh-cn": "基础资源配置",
                            "en": "Infrastructure Configuration"
                        }
                    }
                },
                'TemplateTags': ['Demo Template']
            }
        });
    }
}Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        RosParameter VpcId = RosParameter.Builder.create(this, "VpcId").type(RosParameterType.STRING).build();
        Map<String, Object> MetadataObj = new HashMap<>();
        Map<String, Object> InterfaceObj = new HashMap<>();
        Map<String, Object> ParameterGroupsObj = new HashMap<>();
        ArrayList<String> TemplateTagsArray = new ArrayList<>();
        ArrayList<String> ParametersArray = new ArrayList<>();
        Map<String, Object> LabelObj = new HashMap<>();
        Map<String, String> defaultObj = new HashMap<>();
        TemplateTagsArray.add("Demo Template");
        TemplateTagsArray.add("Create by ROS CDK");
        ParametersArray.add(VpcId.getNode().getId());
        MetadataObj.put("ALIYUN::ROS::Interface", InterfaceObj);
        InterfaceObj.put("ParameterGroups", ParameterGroupsObj);
        InterfaceObj.put("TemplateTags", TemplateTagsArray);
        ParameterGroupsObj.put("Parameters", ParametersArray);
        ParameterGroupsObj.put("Label", LabelObj);
        LabelObj.put("default", defaultObj);
        defaultObj.put("zh-cn", "基础资源配置");
        defaultObj.put("en", "Infrastructure Configuration");
        this.getTemplateOptions().setMetadata(MetadataObj);
    }
}Python示例
import ros_cdk_core as core
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        vpc_id = core.RosParameter(self, "VpcId", type=core.RosParameterType.STRING)
        metadata = core.RosInfo(self, core.RosInfo.metadata, {
            'ALIYUN::ROS::Interface': {
                'ParameterGroups': {
                    "Parameters": [
                        vpc_id.node.id
                    ],
                    "Label": {
                        "default": {
                            "zh-cn": "基础资源配置",
                            "en": "Infrastructure Configuration"
                        }
                    }
                },
                'TemplateTags': ['Demo Template']
            }
        })
您可以解析ROS CDK代码,生成如下ROS模板:
{
  "Description": "This is the simple ros cdk app example.",
  "Metadata": {
    "ALIYUN::ROS::Interface": {
      "ParameterGroups": {
        "Parameters": [
          "VpcId"
        ],
        "Label": {
          "default": {
            "zh-cn": "基础资源配置",
            "en": "Infrastructure Configuration"
          }
        }
      },
      "TemplateTags": [
        "Demo Template",
        "Create by ROS CDK"
      ]
    }
  },
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "VpcId": {
      "Type": "String"
    }
  }
}标签
ROS支持为创建的资源绑定标签。您可以通过以下代码在ROS CDK中设置标签。
TypeScript示例
import * as ros from '@alicloud/ros-cdk-core';
import * as ecs from '@alicloud/ros-cdk-ecs';
export class DemoStack extends ros.Stack {
  constructor(scope: ros.Construct, id: string, props?: ros.StackProps) {
    super(scope, id, props);
    new ros.RosInfo(this, ros.RosInfo.description, "This is the simple ros cdk app example.");
    // The code that defines your stack goes here
    new ecs.Vpc(this, 'vpc-from-ros-cdk', {
      vpcName: 'test-ros-cdk',
      cidrBlock: '10.0.0.0/8',
      description: 'This is ros cdk test'
    });
    this.tags.setTag("MySampleTag", "MyTagValue");
  }
}Java示例
package com.myorg;
import com.aliyun.ros.cdk.core.*;
import com.aliyun.ros.cdk.ecs.Vpc;
public class DemoStack extends Stack {
    public DemoStack(final Construct scope, final String id) {
        this(scope, id, null);
    }
    public DemoStack(final Construct scope, final String id, final StackProps props) {
        super(scope, id, props);
        Vpc vpc1 = Vpc.Builder.create(this, "vpc-from-ros-cdk").vpcName("test-ros-cdk").description("This is ros cdk test").
                cidrBlock("10.0.0.0/8").build();
        this.getTags().setTag("MySampleTag", "MyTagValue");
    }
}Python示例
import ros_cdk_core as core
import ros_cdk_ecs as ecs
class DemoStack(core.Stack):
    def __init__(self, scope: core.Construct, construct_id: str, **kwargs) -> None:
        super().__init__(scope, construct_id, **kwargs)
        # The code that defines your stack goes here
        vpc = ecs.Vpc(self, "vpc-from-ros-cdk", ecs.VPCProps(
            cidr_block='10.0.0.0/8',
            vpc_name='test-ros-cdk',
            description='This is ros cdk test'
        ))
        self.tags.set_tag("MySampleTag", "MyTagValue")C#示例
using AlibabaCloud.SDK.ROS.CDK.Core;
using AlibabaCloud.SDK.ROS.CDK.Ecs;
namespace Demo
{
    public class DemoStack : Stack
    {
        public DemoStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props)
        {
            var vpc = new Vpc(this, "vpc-from-ros-cdk", new VPCProps
            {
                VpcName = "test-ros-cdk",
                CidrBlock = "10.0.0.0/8",
                Description = "This is ros cdk test"
            });
            this.Tags.SetTag("MySampleTag", "MyTagValue");
        }
    }
}您可以执行以下命令,查询资源栈绑定的标签详情。
ros-cdk list-stacks返回结果如下:
✅ The Stacks list is:
 [
	{
		"Status": "CREATE_COMPLETE",
		"StackType": "ROS",
		"ResourceGroupId": "rg-acfm2xw4X5w****",
		"StatusReason": "Stack CREATE completed successfully",
		"CreateTime": "2021-12-27T11:09:22",
		"RegionId": "cn-beijing",
		"DisableRollback": false,
		"StackName": "DemoStack",
		"Tags": [
			{
				"Value": "rg-acfm2xw4X5w****",
				"Key": "acs:rm:rgId"
			},
			{
				"Value": "MyTagValue",
				"Key": "MySampleTag"
			}
		],
		"TimeoutInMinutes": 20,
		"StackId": "7a2a9f34-ae88-41d0-aae0-51aeerE****"
	}
]