资源编排通过一个JSON模板来定义您的需要创建的阿里云的资源组合,依据您的配置来完成您的资源配置,创建和一键销毁,快速方便的构建您的应用。更多的信息您可以通过资源编排的帮助中心获取。
目前资源编排正在公测期间,所以您需要首先申请下公测,我们会尽快通过,通过之后您就可以开始您的ROS之旅了。我们有一个技术支持的旺旺群,1496006086。在这里您可以得到最及时的反馈。
今天为了在阿里云上创建一台ECS虚拟机,您需要首先创建一个安全组(Security Group),您可以通过ECS控制台来生成安全组的定义,您也可以通过资源编排来更加便利的实现。我们从一个安全组开始您的资源编排之旅。
创建一个安全组
创建一个安全组,首先我们需要定义一个JSON模板。从模板之中,我们看到这个模板有两部分构成:
- 一个是
ROSTemplateFormatVersion
版本号,目前的Stack都使用这个版本。 -
Resources
部分定义创建的资源, 在这个里面我们定义一个资源叫SecurityGroup
, 这里的名字可以自己定义,每个Resource有两个关键的属性,- Type: 目前ROS支持的资源类型可以通过ROS控制台中的
资源类型
来查看。 - Properties:每个资源类型,有哪些属性是必填、选填、约束等等也可以在ROS控制台
资源类型
来查看。
- Type: 目前ROS支持的资源类型可以通过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创建的相关资源
下一节,我们将着重介绍资源编排的重要构成部分模板
。