阿里云资源编排服务(ROS)为我们维护云计算资源提供了一个低成本、可靠、标准化的方案。基于ROS提供的能力,我们只要编写和维护资源模板文件,就可以达到维护云计算资源的目的,而不再需要花费很多的时间通过控制台来人肉配置。ROS为一些场景下的资源维护提供了不同的思路和可能性,比如很多需要大量临时计算资源的场景,使用ROS将使整个资源申请、应用构建、资源释放过程非常简单。
ROS同时提供RESTful API和SDK,这使得我们可以很容易的把ROS对于资源的操作能力集成到我们的应用中。下面我们通过示例介绍一下,如何使用ROS的Python SDK来使用ROS的资源编排功能。
注: 示例中的命令行都使用Linux的shell,Windows/DOS用户需要根据情况修改。
1. 安装Python SDK
ROS Python SDK依赖Python 2.7以上版本。首先,使用pip安装aliyun-python-sdk-core:
pip install aliyun-python-sdk-core
aliyun-python-sdk-core是所有阿里云官方Python SDK的公共组件。如果安装过程提示权限错误,可能是因为当前用户没有Python安装路径的写权限,上面的命令可以改成下面这样,后面的例子类似:
sudo pip install aliyun-python-sdk-core
接下来,安装ROS SDK:
pip install aliyun-python-sdk-ros
2. 初始化SDK
我们首先创建一个文件来存放我们的示例代码:
touch ros_sdk_sample.py
import必要的库:
from aliyunsdkcore.client import AcsClient
from aliyunsdkros.request.v20150901 import DescribeRegionsRequest, CreateStacksRequest
import json
初始化SDK客户端对象:
client = AcsClient('你的AccessKeyId', '你的AccessKeySecret', 'cn-beijing')
- 其中AccessKeyId和AccessKeySecure是用户访问阿里云Open API时的认证信息,可以登陆阿里云官方站后获得: https://ak-console.aliyun.com/
- 第三个参数是用户访问的资源所在的默认Region,此处为了演示,选择cn-beijing
3. 基本请求过程
我们通过一个简单的列出Region列表的请求来说明ROS请求的基本过程:
3.1 构造请求对象
构造一个表示列出Region列表的请求对象:
req = DescribeRegionsRequest.DescribeRegionsRequest()
3.2 发起请求
status, headers, body = client.get_response(req)
- status表示请求的返回状态,与HTTP状态码对应,一般2xx表示成功,4xx和5xx表示出错。
- header表示请求的返回头信息,与HTTP头对应
- body表示请求的返回内容,与HTTP请求返回的body对应
3.3 处理请求结果
ROS API返回的内容为JSON格式,所以我们把内容通过JSON反序列化后直接打印到屏幕:
if status == 200:
regions = json.loads(body)
print(regions)
else:
print('Unexpected errors: status=%d, error=%s' % (status, body))
当请求成功执行时,会在屏幕上打印支持ROS的Region列表,当请求出错时,屏幕上会打印出错的状态代码和出错信息。
4. 创建资源栈
接下来,我们用一个更有用的例子来说明如何通过ROS的SDK创建一个包含ECS实例的资源栈。
4.1 模板
我们使用下面的模板来创建资源栈:
template = '''
{
"ROSTemplateFormatVersion": "2015-09-01",
"Resources": {
"My_ECS_Instance": {
"Type": "ALIYUN::ECS::Instance",
"Description": "Create a ECS instance for demo.",
"Properties": {
"ImageId": "m-25qoptbjn",
"InstanceType": "ecs.s2.large",
"InternetChargeType": "PayByTraffic",
"IoOptimized": "none",
"SystemDisk_Category": "cloud",
"SecurityGroupId": {
"Fn::GetAtt": [
"mySecurityGroup",
"SecurityGroupId"
]
}
}
},
"mySecurityGroup": {
"Type": "ALIYUN::ECS::SecurityGroup",
"Properties": {
"SecurityGroupName": "mySecurityGroup"
}
}
}
}
'''
模板中定义了一个ECS实例和一个安全组,ECS实例使用自定义镜像m-25qoptbjn初始化。
4.2 构造请求
创建请求对象
req = CreateStacksRequest.CreateStacksRequest()
通过HTTP头设置资源栈所在的Region:
req.set_headers({'x-acs-region-id': 'cn-beijing'})
构造请求的消息体内容:
create_stack_body = '''
{
"Name": "%s",
"TimeoutMins": %d,
"Template": %s
}
''' % ('my_demo_stack', 60, template)
- Name是我们将要创建的资源栈的命名,每个用户空间下的资源栈名称不能重复
- TimeoutMins是指创建过程如果在指定的时间后不能完成则超时失败,单位分钟
- Template表示创建的资源栈使用的模板内容
req.set_content(create_stack_body);
4.3 提交请求
status, headers, body = client.get_response(req)
if status == 201:
result = json.loads(body)
print(result)
else:
print('Unexpected errors: status=%d, error=%s' % (status, body))
- 创建资源栈的请求根据RESTful的习惯使用HTTP POST方式提交,当成功时返回状态为201
5. 资源栈
当创建资源栈的请求成功时,返回的body中包含被创建资源栈的的ID, Name,如下:
{u'Id': u'61167738-e128-4840-9a37-e568f70aa894', u'Name': u'my_demo_stack'}
创建资源栈的请求会同步返回,但资源栈内的资源创建是由资源编排服务在后台异步执行的。所以到创建请求返回,并不表示所有资源已经创建完成。我们可以通过ROS的web控制台或者API来查询堆栈的创建状态、创建过程中的事件等等。
5.1 使用控制台管理资源栈
登陆ROS控制台(https://ros.console.aliyun.com) 我们可以看到刚刚通过python代码提交创建的资源栈:
资源栈的状态为创建中,表示我们的ECS实例还没有创建完成。我们可以查看事件列表来监控资源栈创建过程:
如图所示,ROS首先创建了ECS依赖的安全组,然后创建了ECS实例,ROS会妥善的安排资源间的依赖关系。
最后,资源栈创建完成,我们可以在资源列表中看到所有资源:
5.2 使用SDK管理资源栈
通过前面对SDK使用的介绍,我们已经熟悉向发送ROS请求和处理返回的细节。同时,ROS的Open API和SDK提供完整的资源栈生命周期管理功能,用户可以通过API和SDK使用ROS提供的所有功能,这些功能包括:
Action | 说明 |
---|---|
AbandonStackRequest | 废弃资源栈 |
CreateStacksRequest | 创建资源栈 |
DeleteStackRequest | 删除资源栈 |
DescribeEventsRequest | 查询事件列表 |
DescribeRegionsRequest | 查询Region列表 |
DescribeResourceDetailRequest | 查询资源详情 |
DescribeResourceTypeDetailRequest | 查询资源类型详情 |
DescribeResourceTypeTemplateRequest | 查询资源模板示例 |
DescribeResourceTypesRequest | 查询资源类型列表 |
DescribeResourcesRequest | 查询资源列表 |
DescribeStackDetailRequest | 查询资源栈详情 |
DescribeStacksRequest | 查询资源栈列表 |
DescribeTemplateRequest | 查询模板 |
ValidateTemplateRequest | 验证模板合法性 |
ROS的功能还在不断增加中
本文示例代码可在附件中下载。