本篇是使用OpenApi管理云服务器的管理篇第5篇。在这一篇中,主要是利用TAG进行资源分组,只有清晰的分组才可以方便的进行未来的运维和管理。
本篇主要涉及到下面的几个关键API:
TAG资源分组
很多的用户在使用云服务器的时候都通过云服务器的名称和描述信息来进行资源分组,这里的弊端是一个云资源只支持一个名称和描述。批量管理云服务器的时候一个重要的任务就是资源分组。为了方便的资源管理,云服务器有一个重要的概念就是TAG。TAG有下面几个约定:
- TAG和传统的TAG不太一样,TAG支持的是Key-Value的模式,可以同时指定。
- TAG支持 ECS 的实例、磁盘、快照、镜像、安全组上。
- 每个资源最多可以绑定 10 个 Tag。
- 如果要绑定 Tag 的 Key 在指定的资源上已经存在,则覆盖 Value。
为了体验TAG的功能,您可以在ECS控制台试用体验下。通过OpenApi可以方便的进行TAG的创建和变更。
绑定TAG到云资源上
绑定Tag到资源上,需要指定资源的Id和资源类型,目前支持的image、instance、snapshot、disk、securitygroup。
def add_tag_to_resource(resource_id, resource_type, tag_key, tag_value):
request = AddTagsRequest()
request.set_ResourceId(resource_id)
request.set_ResourceType(resource_type)
request.set_Tag1Key(tag_key)
request.set_Tag1Value(tag_value)
_send_request(request)
如下面的操作就在一个ECS实例上做了两个TAG分组,一个是ecs-console
, 一个是 ecs-console-pre
.
instance_id = 'i-1111'
tag_key = 'ecs-console'
tag_value = 'product'
resource_type = 'instance'
add_tag_to_resource(instance_id, resource_type, tag_key, tag_value)
add_tag_to_resource(instance_id, resource_type, tag_key + '-pre', tag_value)
对于同一个key,如果设置了两个value,第二个就会覆盖第一个。下面的操作就只会添加成功一组key value。
instance_id = 'i-1111'
tag_key = 'ecs-console'
tag_value = 'product'
resource_type = 'instance'
add_tag_to_resource(instance_id, resource_type, tag_key, tag_value)
add_tag_to_resource(instance_id, resource_type, tag_key, tag_value + '-pre')
查询绑定的TAG
TAG的查询可以直接完成。例如对ECS的实例可以通过查询实例列表来实现。
def describe_instance_tags(instance_id):
request = DescribeInstancesRequest()
request.set_InstanceIds(json.dumps([instance_id]))
response = _send_request(request)
if response is not None:
instance_list = response.get('Instances').get('Instance')
if len(instance_list) > 0:
instance_detail = instance_list[0]
if instance_detail.get('Tags') is not None:
return instance_detail.get('Tags').get('Tag')
通过直接查询Tags可以快速的查询出多个组合维度的资源。可以通过给组合的TAG完成您的应用的高度定制。例如预发环境加上pre
的标签,生产环境使用product
等等来方便的管理资源。
我们也提供了查询标签的功能方便的进行多维度的搜索。
def describe_tags(tag_key=None, tag_value=None, resource_type=None, resource_id=None):
request = DescribeTagsRequest()
if resource_type is not None:
request.set_ResourceType(resource_type)
if resource_id is not None:
request.set_ResourceId(resource_id)
if tag_key is not None:
request.set_Tag1Key(tag_key)
if tag_value is not None:
request.set_Tag1Value(tag_value)
response = _send_request(request)
return response.get('Tags').get('Tag')
查询返回的内容如下:
[{u'TagKey': u'ecs-console-pre', u'TagValue': u'product'}, {u'TagKey': u'ecs-console', u'TagValue': u'product'}]
删除绑定的TAG
除了可以覆盖TAG之外,也可以方便的删除TAG。删除TAG需要指定资源id,资源类型。可以指定TAG,直接删除TAG下面的所有Values。也可以只删除一组的Key,Value.
def remove_tag_from_resource(resource_id, resource_type, tag_key, tag_value=None):
request = RemoveTagsRequest()
request.set_ResourceId(resource_id)
request.set_Tag1Key(tag_key)
request.set_ResourceType(resource_type)
if tag_value is not None:
request.set_Tag1Value(tag_value)
_send_request(request)
总结
灵活的使用TAG,您可以方便的完成应用分组。通过TAG来区分您的测试、预发、生产、压测以及弹性环境的区分。方便的进行批量的资源操作。
完整代码如下
# coding=utf-8
# if the python sdk is not install using 'sudo pip install aliyun-python-sdk-ecs'
# if the python sdk is install using 'sudo pip install --upgrade aliyun-python-sdk-ecs'
# make sure the sdk version is 2.1.2, you can use command 'pip show aliyun-python-sdk-ecs' to check
import json
import logging
from aliyunsdkcore import client
from aliyunsdkecs.request.v20140526.AddTagsRequest import AddTagsRequest
from aliyunsdkecs.request.v20140526.DescribeInstancesRequest import DescribeInstancesRequest
from aliyunsdkecs.request.v20140526.DescribeTagsRequest import DescribeTagsRequest
from aliyunsdkecs.request.v20140526.RemoveTagsRequest import RemoveTagsRequest
# configuration the log output formatter, if you want to save the output to file,
# append ",filename='ecs_invoke.log'" after datefmt.
logging.basicConfig(level=logging.INFO,
format='%(asctime)s %(filename)s[line:%(lineno)d] %(levelname)s %(message)s',
datefmt='%a, %d %b %Y %H:%M:%S')
clt = client.AcsClient('Your Access Key Id', 'Your Access Key Secrect', 'cn-beijing')
def add_tag_to_resource(resource_id, resource_type, tag_key, tag_value):
'''
add tag to resource
:param resource_id: it can be instance id ,disk id
:param resource_type: support image、instance、snapshot、disk、securitygroup
:param tag_key: tag's key
:param tag_value: tag's value
:return:
'''
'''
:param resource_id:
:param resource_type:
:param tag_key:
:param tag_value:
:return:
'''
request = AddTagsRequest()
request.set_ResourceId(resource_id)
request.set_ResourceType(resource_type)
request.set_Tag1Key(tag_key)
request.set_Tag1Value(tag_value)
_send_request(request)
def remove_tag_from_resource(resource_id, resource_type, tag_key, tag_value=None):
'''
remove tag from resource
:param resource_id: required. it can be instance id ,disk id.
:param resource_type: support image、instance、snapshot、disk、securitygroup
:param tag_key: tag key to remove
:param tag_value: tag value to remove
:return:
'''
request = RemoveTagsRequest()
request.set_ResourceId(resource_id)
request.set_Tag1Key(tag_key)
request.set_ResourceType(resource_type)
if tag_value is not None:
request.set_Tag1Value(tag_value)
_send_request(request)
def describe_tags(tag_key=None, tag_value=None, resource_type=None, resource_id=None):
'''
describe resource group according tag query condition.
:param tag_key:
:param tag_value:
:param resource_type:
:param resource_id:
:return:
'''
request = DescribeTagsRequest()
if resource_type is not None:
request.set_ResourceType(resource_type)
if resource_id is not None:
request.set_ResourceId(resource_id)
if tag_key is not None:
request.set_Tag1Key(tag_key)
if tag_value is not None:
request.set_Tag1Value(tag_value)
response = _send_request(request)
return response.get('Tags').get('Tag')
def describe_instance_tags(instance_id):
request = DescribeInstancesRequest()
request.set_InstanceIds(json.dumps([instance_id]))
response = _send_request(request)
if response is not None:
instance_list = response.get('Instances').get('Instance')
if len(instance_list) > 0:
instance_detail = instance_list[0]
if instance_detail.get('Tags') is not None:
return instance_detail.get('Tags').get('Tag')
# send open api request
def _send_request(request):
request.set_accept_format('json')
try:
response_str = clt.do_action(request)
logging.info(response_str)
response_detail = json.loads(response_str)
return response_detail
except Exception as e:
logging.error(e)
if __name__ == '__main__':
logging.info("Manager ECS by OpenApi!")
instance_id = 'i-1111'
tag_key = 'ecs-console'
tag_value = 'product'
resource_type = 'instance'
add_tag_to_resource(instance_id, resource_type, tag_key, tag_value)
add_tag_to_resource(instance_id, resource_type, tag_key + '-pre', tag_value)
logging.info(describe_instance_tags(instance_id))
remove_tag_from_resource(instance_id, resource_type, tag_key)
logging.info(describe_instance_tags(instance_id))
describe_tags(resource_id=instance_id)