资源编排

在服务商创建计算巢服务的过程中,需要录入模板。服务商需要先通过完成模板编写,再将模板复制到计算巢控制台的模板框中或将模板文件上传完成录入。本文以创建VPC为例,介绍如何使用JSON/YAML模板语法来编写模板并在ROS控制台验证模板。

背景信息

计算巢中的模板本质上是ROS模板。您可以遵循ROS定义的模板规范编写资源栈模板,在模板中定义所需的云计算资源(例如:ECS实例、RDS数据库实例)、资源间的依赖关系等。ROS的编排引擎将根据模板自动完成所有资源的创建和配置,实现自动化部署及运维。资源编排服务是阿里云提供的一项简化云计算资源管理的服务。更多信息,请参见什么是资源编排服务

模板编写

ROS支持JSON/YAML和Terraform两种模板语法。编写模板时可以基于模板示例进行修改,也可以直接编写模板。

  • 针对常见的场景,ROS提供了模板示例,您可以在ROS控制台的模板示例中选择适用的参考模板进行修改。其中应用场景ISV软件部署类别的模板为计算巢场景常用模板,在模板描述中给出了基于该示例的修改步骤。

    如果您采用了模板示例且改动简单,我们建议您直接进入到在ROS控制台验证模板的步骤,在创建资源栈的过程中选择模板示例并修改。

  • 针对复杂的场景,需要您自己编写模板时,您可以使用任何文本编辑工具来编写模板。

    针对JSON/YAML模板,我们推荐您在VSCode或者IntelliJ IDEA上安装插件Alibaba Cloud Toolkit来编写模板,以便获得语法自动提示。下载及使用方法请参考使用Alibaba Cloud Toolkit管理模板及资源栈(Visual Studio Code)

本文以创建ECS的YAML模板为例,介绍创建模板的操作:

ROSTemplateFormatVersion: '2015-09-01'
# 参数配置
Parameters:
  PayType:
    Type: String
    Label:
      en: ECS Instance Charge Type
      zh-cn: 付费类型
    Default: PostPaid
    AllowedValues:
      - PostPaid
      - PrePaid
    AssociationProperty: ChargeType
    AssociationPropertyMetadata:
      LocaleKey: InstanceChargeType
  PayPeriodUnit:
    Type: String
    Label:
      en: Pay Period Unit
      zh-cn: 购买资源时长周期
    Default: Month
    AllowedValues:
      - Month
      - Year
    AssociationProperty: PayPeriodUnit
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  PayPeriod:
    Type: Number
    Description:
      en: When the resource purchase duration is Month, the value of Period ranges from 1 to 9, 12, 24, 36, 48, or 60. <br><b><font color='red'> When ECS instance types are PrePaid valid </b></font>
      zh-cn: 当购买资源时长为Month时,Period取值:1~9 <br><b><font color='red'>当ECS实例类型为PrePaid有效</b></font>
    Label:
      en: Period
      zh-cn: 购买资源时长
    Default: 1
    AllowedValues:
      - 1
      - 2
      - 3
      - 4
      - 5
      - 6
      - 7
      - 8
      - 9
    AssociationProperty: PayPeriod
    AssociationPropertyMetadata:
      Visible:
        Condition:
          Fn::Not:
            Fn::Equals:
              - ${PayType}
              - PostPaid
  EcsInstanceType:
    Type: String
    Label:
      en: Instance Type
      zh-cn: 实例类型
    AssociationProperty: ALIYUN::ECS::Instance::InstanceType
    AssociationPropertyMetadata:
      ZoneId: ${ZoneId}
      InstanceChargeType: ${InstanceChargeType}
  InstancePassword:
    NoEcho: true
    Type: String
    Description:
      en: Server login password, Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ Special symbol in)
      zh-cn: 服务器登录密码,长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)
    Label:
      en: Instance Password
      zh-cn: 实例密码
    ConstraintDescription:
      en: Length 8-30, must contain three(Capital letters, lowercase letters, numbers, ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ Special symbol in)
      zh-cn: 长度8-30,必须包含三项(大写字母、小写字母、数字、 ()`~!@#$%^&*_-+=|{}[]:;<>,.?/ 中的特殊符号)
    AssociationProperty: ALIYUN::ECS::Instance::Password
    AllowedPattern: '^[a-zA-Z0-9-\(\)\`\~\!\@\#\$\%\^\&\*\_\-\+\=\|\{\}\[\]\:\;\<\>\,\.\?\/]*$'
    MinLength: 8
    MaxLength: 30
  ZoneId:
    Type: String
    AssociationProperty: ALIYUN::ECS::Instance::ZoneId
    Label:
      en: VSwitch Availability Zone
      zh-cn: 交换机可用区
  VpcId:
    AssociationProperty: ALIYUN::ECS::VPC::VPCId
    Type: String
    Description:
      en: Please search the ID starting with (vpc-xxx) from console-Virtual Private Cloud
      zh-cn: 现有虚拟专有网络的实例ID
    Label:
      en: VPC ID
      zh-cn: 专有网络VPC实例ID
  VSwitchId:
    AssociationProperty: ALIYUN::ECS::VSwitch::VSwitchId
    AssociationPropertyMetadata:
      VpcId: ${VpcId}
      ZoneId: ${ZoneId}
    Type: String
    Description:
      en: Instance ID of existing business network switches, console-Virtual Private Cloud-VSwitches under query
      zh-cn: 现有业务网络交换机的实例ID
    Label:
      en: VSwitch ID
      zh-cn: 交换机实例ID
# 资源配置
Resources:
  EcsSecurityGroup:
    Type: ALIYUN::ECS::SecurityGroup
    Properties:
      SecurityGroupName:
        Ref: ALIYUN::StackName
      VpcId:
        Ref: VpcId
      # 安全组入端口
      SecurityGroupIngress:
        - PortRange: 80/80
          Priority: 1
          SourceCidrIp: 0.0.0.0/0
          IpProtocol: tcp
          NicType: internet
  EcsInstanceGroup:
    Type: ALIYUN::ECS::InstanceGroup
    Properties:
      # 实例名
      InstanceName:
        Fn::Join:
          - '-'
          - - Ref: ALIYUN::StackName
            - '[1,4]'
      IoOptimized: optimized
      # 付费类型
      InstanceChargeType:
        Ref: PayType
      PeriodUnit:
        Ref: PayPeriodUnit
      Period:
        Ref: PayPeriod
      # 网络配置
      VpcId:
        Ref: VpcId
      ZoneId:
        Ref: ZoneId
      VSwitchId:
        Ref: VSwitchId
      SecurityGroupId:
        Ref: EcsSecurityGroup
      # 磁盘类型和大小
      SystemDiskCategory: cloud_essd
      SystemDiskSize: 200
      MaxAmount: 1
      # 镜像
      ImageId: centos_7
      # 实例类型
      InstanceType:
        Ref: EcsInstanceType
      Password:
        Ref: InstancePassword
      # 公网开启
      AllocatePublicIP: true
      # 公网带宽
      InternetMaxBandwidthOut: 1
  ECSRunCommand:
    Type: ALIYUN::ECS::RunCommand
    Properties:
      InstanceIds:
        Fn::GetAtt:
          - EcsInstanceGroup
          - InstanceIds
      Type: RunShellScript
      Sync: true
      Timeout: 3600
      CommandContent: |-
        #!/bin/bash

# 定义输出
Outputs:
  # 将公网ip做为http返回的地址显示在控制台
  Endpoint:
    Description:
      zh-cn: 对外暴露的公网IP地址
      en: Public IP Addresses
    Value:
      Fn::Sub:
        - http://${ServerAddress}
        - ServerAddress:
            Fn::Select:
              - 0
              - Fn::GetAtt:
                 - EcsInstanceGroup
                 - PublicIps
Metadata:
  ALIYUN::ROS::Interface:
    # 分组信息
    ParameterGroups:
      - Parameters:
          - PayType
          - PayPeriodUnit
          - PayPeriod
        Label:
          default:
            en: PayType Configuration
            zh-cn: 付费类型配置
      - Parameters:
          - EcsInstanceType
          - InstancePassword
        Label:
          default:
            en: ECS Instance Configuration
            zh-cn: ECS实例配置
      - Parameters:
          - ZoneId
          - VpcId
          - VSwitchId
        Label:
          default:
            zh-cn: 选择已有基础资源
            en: Choose existing Infrastructure

模板中主要定义了参数(Parameters)、资源(Resources)、输出(Outputs)以及元数据(Metadata):

Parameters

参数(Parameters)定义了用户在创建服务实例时,需要设置的参数。本文示例中,Parameters中包含以下参数:

参数名称

参数描述

PayType

付费类型

PayPeriodUnit

购买资源时长周期

PayPeriod

购买资源时长

EcsInstanceType

实例类型

InstancePassword

实例密码

ZoneId

交换机可用区

VpcId

专有网络VPC实例ID

VSwitchId

交换机实例ID

Resources

资源(Resources)定义了需要创建的资源,以及每一个资源包含的TypeProperties。本文示例中,Resources中包含的资源如下表所示。

ROS中定义的资源类型

资源说明

ALIYUN::ECS::SecurityGroup

创建ECS安全组

ALIYUN::ECS::InstanceGroup

创建ECS实例

ALIYUN::ECS::RunCommand

在ECS实例中执行Shell脚本

说明

针对每一种阿里云的资源类型,您都可以在资源类型索引处查找其语法、属性和返回值(即输出参数),用于编写模板时的参考,以申明对于资源的具体要求。

Outputs

输出(Outputs)定义了用户创建服务完毕后,需要输出的信息。本文示例中,Outputs以Endpoint(http://PublicIp) 作为输出。用户在资源创建完毕后,即可获取访问服务的地址。

Metadata

元数据(Metadata)不仅支持对Parameters中定义的参数进行分组,还支持对自定义参数进行隐藏,您可以在资源编排控制台的配置参数页面查看效果。本文示例中,参数分组如下:

分组名称

参数名称

PayType Configuration

PayType

PayPeriodUnit

PayPeriod

ECS Instance Configuration

EcsInstanceType

InstancePassword

Choose existing Infrastructure

ZoneId

VpcId

VSwitchId

您还可以使用进阶功能Mappings、Conditions,进阶功能的详细信息,请参见模板结构说明

您还可以使用Terraform创建模板,详细操作请参见创建Terraform类型模板

在ROS控制台验证模板

完成模板编写后,您可以通过ROS控制台创建资源栈进行验证。

  1. 登录ROS控制台

  2. 在左侧导航栏中,单击资源栈

  3. 在页面左上角,选择创建资源栈>使用ROS2024-03-22_14-19-59.png

  4. 创建资源栈页面,完成页面信息配置。

    1. 指定模板框中,可以选择选择已有模板,将之前编写完成的模板复制到模板内容中;也可以选择使用示例模板,选择示例模板呈现在模板内容中后进行修改。2024-03-22_14-24-35.png

    2. 单击下一步,进入配置参数页面,检查参数的正确性。并通过预览模板资源功能验证资源设置是否正确。image

    3. 可选:单击下一步,进入合规预检(可选)页面。完成页面信息配置。

    4. 可选:单击下一步,进入检查并确认(可选)页面,确认配置信息。

    5. 单击创建

    说明

    配置资源栈(可选)检查并确认(可选)为可选步骤,可根据实际规划选择是否需要执行这两步。

创建资源栈成功即校验模板成功,如果创建失败,请查看失败原因,并调整模板。