Hello, 资源编排

资源编排通过一个JSON模板来定义您的需要创建的阿里云的资源组合,依据您的配置来完成您的资源配置,创建和一键销毁,快速方便的构建您的应用。更多的信息您可以通过资源编排的帮助中心获取。

目前资源编排正在公测期间,所以您需要首先申请下公测,我们会尽快通过,通过之后您就可以开始您的ROS之旅了。我们有一个技术支持的旺旺群,1496006086。在这里您可以得到最及时的反馈。

今天为了在阿里云上创建一台ECS虚拟机,您需要首先创建一个安全组(Security Group),您可以通过ECS控制台来生成安全组的定义,您也可以通过资源编排来更加便利的实现。我们从一个安全组开始您的资源编排之旅。

创建一个安全组

创建一个安全组,首先我们需要定义一个JSON模板。从模板之中,我们看到这个模板有两部分构成:

  • 一个是ROSTemplateFormatVersion版本号,目前的Stack都使用这个版本。
  • Resources部分定义创建的资源, 在这个里面我们定义一个资源叫SecurityGroup, 这里的名字可以自己定义,每个Resource有两个关键的属性,

    • Type: 目前ROS支持的资源类型可以通过ROS控制台中的资源类型来查看。
    • Properties:每个资源类型,有哪些属性是必填、选填、约束等等也可以在ROS控制台资源类型来查看。
{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Resources": {
    "SecurityGroup": {
      "Properties": {},
      "Type": "ALIYUN::ECS::SecurityGroup"
    }
  }
}

我们将下面的模板拷贝到ROS控制台中,选择一个Region,然后提供一个模板名称hello_ros, 点击创建您就完成了自己的第一个Stack。

创建Stack的关键属性

每个Stack有几个关键的属性,这些属性是创建Stack的必要参数

  • 名称: 不可修改的stack标示,1-64个字符,名称不可重复。
  • 超时时间,公测期间的范围为10-180分钟
  • 失败回滚,当整个堆栈没有创建成功之后,如果这个选项设置为True,则开始启动回滚操作,将会把创建的相关资源支持释放的释放掉
  • Region,当前堆栈支持在哪个region进行操作。

Stack的几个重要的输出构成:

  • 概览:提供这个Stack的基本信息,例如创建时间状态,返回的数据类型,这个模板在运行时的入参等等
  • 资源:Stack在创建的过程中生成的物理资源或者重要的关联资源信息
  • 事件:每个资源在创建的时候都会有状态,例如创建开始,创建完成,创建失败,回滚开始,回滚完成,删除开始,删除完成。
  • 模板:创建模板是提供的Template

安全组创建进阶

只创建一个安全组的话,这个安全组默认是没有配置安全组的出规则和入规则的话,使用这个安全组创建出的虚拟机是没有办法正常的和外部进行通讯,所以需要制定出人规则,可以通过一步步的在ECS控制台来实现,但是通过ROS来创建这个就非常的方便。

相比上面的模板, 这次的模板多出了一个部分为Parameters, 这里声明了一个新的属性定义了一个安全组的优先级,通过控制台中我们可以看到创建模板就会多一个参数需要填写,有一个默认值1。更多的参数定义请参考帮助文档。

Properties 中同样多了更多的属性,多了安全组的名称、描述、以及出入规则的定义。关于安全组的更多属性可以参考安全组资源定义

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "SecurityGroupPriority": {
      "Default": 1,
      "Description": "生成的安全组的优先级,优先级可选范围为1-100,默认值为1,即最高优先级。",
      "Type": "Number",
      "MinValue": 1,
      "MaxValue": 100
    }
  },
  "Resources": {
    "DefaultSecurityGroup": {
      "Properties": {
        "Description": "生成经典网络安全组默认开通外网的所有出网和入网访问权限",
        "SecurityGroupEgress": [
          {
            "DestCidrIp": "0.0.0.0/0",
            "IpProtocol": "all",
            "NicType": "internet",
            "PortRange": "-1/-1",
            "Priority": {
              "Ref": "SecurityGroupPriority"
            }
          }
        ],
        "SecurityGroupIngress": [
          {
            "IpProtocol": "all",
            "NicType": "internet",
            "PortRange": "-1/-1",
            "Priority": {
              "Ref": "SecurityGroupPriority"
            },
            "SourceCidrIp": "0.0.0.0/0"
          }
        ],
        "SecurityGroupName": "CreateByROS"
      },
      "Type": "ALIYUN::ECS::SecurityGroup"
    }
  }  
}

相比传统的JSON,这里有一个属性非常特殊叫"Ref",它指向了Parameters的参数定义,这样就可以引用这里的定义进行赋值。

Actions

  • 尝试着将安全组的名称也提取到Parameters中,而不是Hard Code。需要怎么做呢?

Stack的输出

上面的模板创建出来的Stack可以定制的属性较少,您可以在堆栈的概述中查看Stack的输出。只需要添加一个Outputs部分即可。

Outputs中,定义了一个输出参数为SecurityGroupId, 会返回生成的Stack的安全组的Id,使用到了一个函数Fn::GetAtt, 它的属性为一个数组,第一个参数为在Resources中定义的资源名称,第二个属性为ALIYUN::ECS::SecurityGroup支持的返回属性, 我们可以发现安全组只支持一个属性SecurityGroupId

{
  "ROSTemplateFormatVersion": "2015-09-01",
  "Parameters": {
    "SecurityGroupPriority": {
      "Default": 1,
      "Description": "生成的安全组的优先级,优先级可选范围为1-100,默认值为1,即最高优先级。",
      "Type": "Number",
      "MinValue": 1,
      "MaxValue": 100
    }
  },
  "Resources": {
    "DefaultSecurityGroup": {
      "Properties": {
        "Description": "生成经典网络安全组默认开通外网的所有出网和入网访问权限",
        "SecurityGroupEgress": [
          {
            "DestCidrIp": "0.0.0.0/0",
            "IpProtocol": "all",
            "NicType": "internet",
            "PortRange": "-1/-1",
            "Priority": {
              "Ref": "SecurityGroupPriority"
            }
          }
        ],
        "SecurityGroupIngress": [
          {
            "IpProtocol": "all",
            "NicType": "internet",
            "PortRange": "-1/-1",
            "Priority": {
              "Ref": "SecurityGroupPriority"
            },
            "SourceCidrIp": "0.0.0.0/0"
          }
        ],
        "SecurityGroupName": "CreateByROS"
      },
      "Type": "ALIYUN::ECS::SecurityGroup"
    }
  },
  "Outputs": {
    "SecurityGroupId": {
      "Value": {
        "Fn::GetAtt": [
          "DefaultSecurityGroup",
          "SecurityGroupId"
        ]
      }
    }
  }  
}

Stack的删除

当一个Stack需要被删除的时候,可以根据需要来选择,有两个选项:

  • 删除堆栈同时删除Stack创建的资源
  • 删除堆栈的时候保留Stack创建的相关资源

下一节,我们将着重介绍资源编排的重要构成部分模板

上一篇:《Web安全之机器学习入门》一 1.3 国内外网络安全形势


下一篇:KUBERNETES02_集群安装逻辑、前置环境、搭建一主两从、部署dashboard访问页面(四)