ROS模板参数的进化之路

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
简介: 在使用ROS资源编排产品创建资源时,使用参数(Parameters)可提高模板的灵活性和可复用性,为了保证资源能顺利创建,通常需要打开多个控制台查找资源参数信息,这种体验是非常糟糕的。我们不喜欢手动输出参数,更加希望用鼠标点点就能选到正确的参数。## AssociationProperty和AssociationPropertyMetadata在模板中使用 `AssociationPrope

在使用ROS资源编排产品创建资源时,使用参数(Parameters)可提高模板的灵活性和可复用性,为了保证资源能顺利创建,通常需要打开多个控制台查找资源参数信息,这种体验是非常糟糕的。我们不喜欢手动输出参数,更加希望用鼠标点点就能选到正确的参数。

AssociationProperty和AssociationPropertyMetadata

在模板中使用 AssociationPropertyAssociationPropertyMetadata 字段能动态的获取对应的属性。例如 ImageId 参数需要填写ECS的镜像ID,镜像ID可是一大长串的字符,而且公共镜像随着时间的推移,镜像ID还有可能变化,此时如果使用 AssociationProperty 就能动态的获取到所有的镜像ID。

{
    "Parameters":
    {
        "ImageId":
        {
            "AssociationProperty": "ALIYUN::ECS::Instance::ImageId",
            "Description": "请选择镜像",
            "Label": "镜像",
            "Type": "String"
        }
    },
    "ROSTemplateFormatVersion": "2015-09-01"
}

注:上述模板无法直接创建资源,仅做参数选填演示

复制上述模板到 ROS 控制台创建资源栈,可体验到如下效果

如果还希望对动态查找的结果做筛选,则可以使用 AssociationPropertyMetadata 来指定。例如 VSwitchId 参数需要填写某个 Vpc 下的某个可用区的交换机ID,则可以参考如下模板。

{
    "Metadata":
    {
        "ALIYUN::ROS::Interface":
        {
            "ParameterGroups":
            [
              {
                "Parameters": [
                  "VpcId",
                  "ZoneId",
                  "VSwitchId"
                ]
              }
            ]
        }
    },
    "Parameters":
    {
        "VSwitchId":
        {
            "AssociationProperty": "ALIYUN::ECS::VSwitch::VSwitchId",
            "AssociationPropertyMetadata":
            {
                "VpcId": "${VpcId}",
                "ZoneId": "${ZoneId}"
            },
            "Description": "请选择需要的交换机",
            "Label": "交换机",
            "Type": "String"
        },
        "VpcId":
        {
            "AssociationProperty": "ALIYUN::ECS::VPC::VPCId",
            "Description": "请选择需要的Vpc",
            "Label": "VpcId",
            "Type": "String"
        },
        "ZoneId":
        {
            "AssociationProperty": "ALIYUN::ECS::Instance::ZoneId",
            "Description": "请选择可用区",
            "Label": "可用区Id",
            "Type": "String"
        }
    },
    "ROSTemplateFormatVersion": "2015-09-01"
}

注: 模板中的 _Metadata_ 是为了让参数按照指定的顺序显示
注:上述模板无法直接创建资源,仅做参数选填演示

实际效果如下图所示

OOS参数仓库

AssociationPropertyAssociationPropertyMetadata 还是有局限性,仅限于系统支持的部分特定参数,但是有些自己的业务数据参数又臭又长,它又不是类似云产品ID这种能动态查询的,例如密钥数据、脚本数据、SQL语句或者某些需要加密的数据,每次手动去复制粘贴也非常繁琐。

参数仓库就能很好的解决这类参数,把密钥数据、脚本数据、SQL语句这些扔到参数仓库中,给它取一个好听的名字,填写参数时直接引用即可。

然后再模板中把 Type 设置为参数仓库的类型即可。

  • ALIYUN::OOS::Parameter::Value 表示普通参数类型
  • ALIYUN::OOS::SecretParameter::Value 表示加密参数类型
{
    "Parameters":
    {
        "PemData":
        {
            "Description": "请输入公钥密钥",
            "Label": "公钥信息",
            "Type": "ALIYUN::OOS::Parameter::Value"
        }
    },
    "ROSTemplateFormatVersion": "2015-09-01"
}

用上面模板进入ROS控制台体验效果如下

GetTemplateParameterConstraints 查询模板参数取值

结合上述2个功能,基本所有参数都不用手动去填写了,但是还是有一些资源创建失败的场景。

Resource CREATE failed: ResponseException: resources.Database: The resource is out of usage. Code: OperationDenied RequestId: E5AAC333-XXXXXX-27605816C0C0

ResponseException: resources.EcsInstance: The resource is out of stock in the specified zone. Please try other types, or choose other regions and zones. Code: OperationDenied.NoStock RequestId: EEC76BD4-XXXXXX-04BB4D1C150C

看到上述报错,真是头都大了。而且资源编排主要是多产品组合购买,某些参数是需要更加苛刻的条件。

我希望购买的ECS、RDS、Redis等实例都在同一个可用区,而特定规格的实例通常只是在特定的可用区有售卖,要选择三个产品共同都适用的可用区,AssociationPropertyAssociationPropertyMetadata 就无能为力了。

参数查询就能很方便的解决此问题,而且不需要在模板中添加额外的字段。把下面的模板复制到ROS控制台体验一下吧。

{
    "Metadata":
    {
        "ALIYUN::ROS::Interface":
        {
            "ParameterGroups":
            [
                {
                    "Parameters":
                    [
                        "ZoneInfo",
                        "ECSInstanceType",
                        "RDSInstanceClass",
                        "RedisInstanceClass"
                    ]
                }
            ]
        }
    },
    "Parameters":
    {
        "ECSInstanceType":
        {
            "Type": "String"
        },
        "RDSInstanceClass":
        {
            "Type": "String"
        },
        "RedisInstanceClass":
        {
            "Type": "String"
        },
        "ZoneInfo":
        {
            "Type": "String"
        }
    },
    "ROSTemplateFormatVersion": "2015-09-01",
    "Resources":
    {
        "ECS":
        {
            "Properties":
            {
                "InstanceType":
                {
                    "Ref": "ECSInstanceType"
                },
                "ZoneId":
                {
                    "Ref": "ZoneInfo"
                },
                "ImageId": "centos_7_8_x64_20G_alibase_20211028.vhd",
                "SystemDiskCategory": "cloud_essd"
            },
            "Type": "ALIYUN::ECS::Instance"
        },
        "RDS":
        {
            "Properties":
            {
                "Category": "HighAvailability",
                "DBInstanceClass":
                {
                    "Ref": "RDSInstanceClass"
                },
                "Engine": "MySQL",
                "EngineVersion": "5.6",
                "ZoneId":
                {
                    "Ref": "ZoneInfo"
                }
            },
            "Type": "ALIYUN::RDS::DBInstance"
        },
        "Redis":
        {
            "Properties":
            {
                "EngineVersion": "4.0",
                "InstanceClass":
                {
                    "Ref": "RedisInstanceClass"
                },
                "ZoneId":
                {
                    "Ref": "ZoneInfo"
                }
            },
            "Type": "ALIYUN::REDIS::Instance"
        }
    }
}

注:上述模板无法直接创建资源,仅做参数选填演示


ZoneInfo 参数是分布根据ECS、RDS、Redis三个资源的其他属性来分布查询,然后取交集所得,而 ECSInstanceType, RDSInstanceClass, RedisInstanceClass 等参数,又会根据选择的地域信息来动态查询。

More and more

个人认为,用户交互比较好的体验是 Common Buy 的购买页面,拥有统一的样式与风格,毕竟是经过各自产品各种内部接口不断打磨后的结果。但如果要是多个产品组合,完成一个功能的时候,common buy这种方式显得力不从心。ROS 模板中的参数,能直接解析成类似产品购买页面的表单,那购买多产品组合形态,购买一个解决方案就和购买单个产品一样丝滑了。

相关实践学习
使用ROS创建VPC和VSwitch
本场景主要介绍如何利用阿里云资源编排服务,定义资源编排模板,实现自动化创建阿里云专有网络和交换机。
阿里云资源编排ROS使用教程
资源编排(Resource Orchestration)是一种简单易用的云计算资源管理和自动化运维服务。用户通过模板描述多个云计算资源的依赖关系、配置等,并自动完成所有资源的创建和配置,以达到自动化部署、运维等目的。编排模板同时也是一种标准化的资源和应用交付方式,并且可以随时编辑修改,使基础设施即代码(Infrastructure as Code)成为可能。 产品详情:https://www.aliyun.com/product/ros/
目录
相关文章
|
存储 缓存 算法
【ROS】如何让ROS中节点获取数据 III --参数服务器通信及ros常用工具指令介绍
相较于之前的通信模型,参数服务器是最为简单的。在之前的模型中,ROSMASTER都是扮演一个帮二者连接在一起的桥梁。
304 0
|
1月前
|
弹性计算 JSON 关系型数据库
使用ROS模板基于ECS和RDS创建WordPress环境
使用ROS模板基于ECS和RDS创建WordPress环境
|
3月前
|
存储 机器人
ROS2教程 07 参数Param
本文是关于ROS2(机器人操作系统2)中参数(Parameter)机制的教程,介绍了ROS2中参数的使用和管理,包括列出、获取、设置、删除参数,以及如何通过命令行和launch文件在启动节点时配置参数,并通过示例代码展示了如何在ROS2节点中声明和使用参数。
104 0
|
5月前
|
弹性计算 关系型数据库 持续交付
ROS 模板指南
资源编排服务ROS(Resource Orchestration Service)是阿里云提供的一项简化云计算资源管理和采用基础设施即代码(IaC)设计理念的自动化部署服务。开发者和管理员可以编写模板,在模板中定义所需的阿里云资源(例如:ECS实例、RDS数据库实例)、资源间的依赖关系等。ROS的编排引擎将根据模板自动完成所有资源的创建和配置,从而实现云上资源的自动化部署。
1179 4
ROS 模板指南
|
6月前
|
持续交付 数据安全/隐私保护
ROS伪参数教程:通过ALIYUN::ResourceGroupId配置栈内资源的资源组
阿里云资源编排服务(ROS)的新伪参数 ALIYUN::ResourceGroupId 提供了一种简化资源组管理的机制。此参数让用户在编写资源栈模板时能够直接指定资源应该属于的资源组,无需事先知晓资源组ID。这项功能简化了自动化部署过程中的管理流程,提高了部署的准确性,并增强了模板的可复用性。利用此伪参数,可以实现资源更精确的分区管理和访问控制,提升资源部署与整合的效率。
120 0
ROS伪参数教程:通过ALIYUN::ResourceGroupId配置栈内资源的资源组
|
6月前
|
弹性计算 运维 数据处理
资源编排ROS之模块:实现模板代码复用(进阶篇)
资源编排ROS模块能够实现模板代码复用。支持输入输出、公共模块、版本管理、共享模块等功能。在使用场景上,除了对基础设施模块化外,还可作为配置、数据处理工具或资源包装器。
518 6
|
6月前
|
弹性计算 运维 安全
资源编排ROS之模块:实现模板代码复用(基础篇)
ROS是阿里云的资源管理服务,通过模板定义和编排引擎自动化部署云资源。模块是可预测、重用、追溯和管理的资源集合,分为公共和自定义类型。它们简化了复杂配置,如安全组,可在多个模板和账号中复用。创建模块后,可在资源栈中引用,实现标准化部署。
135 1
|
存储 API 容器
[ROS通信机制] --- 参数服务器
[ROS通信机制] --- 参数服务器
192 0
[ROS通信机制] --- 参数服务器
|
弹性计算 数据安全/隐私保护 开发者
ROS -使用模板参数|学习笔记
快速学习 ROS -使用模板参数
ROS -使用模板参数|学习笔记
|
监控 开发者
ROS-使用样例模板部署应用|学习笔记
快速学习 ROS-使用样例模板部署应用
ROS-使用样例模板部署应用|学习笔记

推荐镜像

更多