ECS TAG功能详解

摘要: Tag(标签),阿里云提供的一种标记资源的方式,对资源添加标签能够方便地对资源进行标记,从而方便的进行资源的批量管理,如今ECS可使用Tag标记的资源主要有如下几种:实例、磁盘、镜像、快照、安全组。 ### Tag基础 每一个Tag是由两个部分组成,Key和Value。html

Tag简述python

Tag(标签),阿里云提供的一种标记资源的方式,对资源添加标签能够方便地对资源进行标记,从而方便的进行资源的批量管理,如今ECS可使用Tag标记的资源主要有如下几种:实例、磁盘、镜像、快照、安全组。api

Tag基础安全

每一个Tag是由两个部分组成,Key和Value。Tag是很开放的配置,Tag的Key和Value能够取值几乎任意字符串。所以,Tag是一个能够方便对资源进行标记、分类的工具。运维

Tag使用限制工具

为了更合理使用,Tag在功能上有几个限制。学习

首先,一个资源上面已有的Tag不能超过10个,标签太多会致使标签自己难以管理 
一个资源上Tag key不能相同,若是添加一个已有key的Tag,会使用新的Tag覆盖老的Tag测试

相同Tag相同类型的资源数量不建议超过500,相同Tag的资源数量太大,会弱化Tag的资源分类功能阿里云

Tag经典场景code

标签划分

对于通常的资源管理需求,都是针对一个用户下数量较多的状况,当实例等数量较多时,对实例进行运维管理等操做就会变得比较困难,有时候甚至须要采起拆分帐号的方式管理不一样部门或者不一样用途的资源。若是采用Tag进行资源的分类管理,会大大简化这个问题。

首先,咱们能够针对实例的使用场景进行分类,在通常的开发场景中,机器通常有多个分类:开发测试环境、打包环境、生产环境等。这些机器的运维管理是绝对隔绝的,所以要在Tag上对其进行区分,在开发测试机器上,能够增长标签(增长方式详见下一节)key为env、value为test;在生产机器上,能够增长标签key为env、value为product。造成以下图的机器分类。

图片描述

以后再考虑按照使用人员进行的资源分类。对于资源保有多的,一我的进行资源的所有管理也是很困难的,因此须要进行基于人员的资源划分,咱们能够在资源上,增长表示部门的标签,表明这些资源隶属于不一样的部门。在增长了部门分类以后,机器分类如图:

图片描述

权限控制

只使用标签的资源分类,只能作到对资源进行标记、划分,没法进行实质的资源管控隔离,若是须要作到资源真正的使用者隔离,就须要同时结合RAM实现。

简单介绍下RAM,每一个阿里云帐号均可以建立多个子帐号,这些子帐号能够被受权管理阿里云帐号的某些资源,这个受权操做是阿里云帐号来管理的,相关文档见:https://help.aliyun.com/product/28625.html

咱们这里就是使用子帐号结合标签对资源进行不一样分类的隔离,咱们为每一个部门建立一个管理员(子帐号),即dep manager,而后受权每一个子帐号只能操做带有本身部门标签的资源。这样咱们就把实例资源彻底分给两个部门进行管理,同时,实例上也带有相关环境的标识。

图片描述

使用Tag的方式

接下来,详细描述下上述操做的具体步骤。

API操做

从API操做资源能够更清晰看到资源的变化过程,所以推荐使用API进行资源操做,相关文档在这里:https://help.aliyun.com/product/52507.html 
对于接下来的操做,只须要安装python SDK,须要安装的包以下(ECS外的操做如RAM等经过控制台操做)

aliyun-python-sdk-core
aliyun-python-sdk-ecs

添加标签 页面操做

添加标签,须要的参数主要是资源id、资源类型、标签,注意region不要填错。下面是为资源添加标签的代码示例,一次调用最多可添加5个标签。

# common codes, 下次再也不添加
# coding=utf-8
import logging
from aliyunsdkcore import client
from aliyunsdkcore.acs_exception.exceptions import ServerException, ClientException
from aliyunsdkecs.request.v20140526.AddTagsRequest import AddTagsRequest

clint = client.AcsClient('AK', 'SK', 'cn-qingdao')  # region 按实际填写
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')


def _get_response(request):
    try:
        ret = clint.do_action_with_exception(request)
        logging.info(ret)
    except ServerException, e:
        logging.error(e)
    except ClientException, e:
        logging.error(e)

# common codes end

def add_tag(resource_id, resource_type, tag1, tag2):
    request = AddTagsRequest()
    request.set_ResourceId(resource_id)
    request.set_ResourceType(resource_type)
    request.set_Tag1Key(tag1.get('key'))
    request.set_Tag1Value(tag1.get('value'))
    request.set_Tag2Key(tag2.get('key'))
    request.set_Tag2Value(tag2.get('value'))

    _get_response(request)

if __name__ == '__main__':
    add_tag('i-xxxxx', 'instance', {'key':'env', 'value':'test'}, {'key':'depart', 'value':'dep1'})

以上示例能够给instance(实例)i-xxxxx添加两个标签,两个标签分别为 env:test 和 depart:dep1 。若是添加Tag时value填写错误,能够改正value以后再调用一次AddTags来“覆盖”一次同key的标签。

查询标签页面操做

查询标签,能够根据资源查询资源上的标签,也能够不填写资源,查询用户名下全部标签。下面是查询一个资源下标签的代码示例

from aliyunsdkecs.request.v20140526.DescribeTagsRequest import DescribeTagsRequest

def describe_tag(resource_id, resource_type):
    request = DescribeTagsRequest()
    request.set_ResourceId(resource_id)
    request.set_ResourceType(resource_type)
    _get_response(request)

if __name__ == '__main__':
    describe_tag('i-xxxxx', 'instance')

删除标签页面操做

删除标签,删除指定资源的标签,本接口如今必须指定资源,能够不指定Tag value,表示删除全部Tag key为某个值的资源上的标签。

from aliyunsdkecs.request.v20140526.RemoveTagsRequest import RemoveTagsRequest

def remove_tag(resource_id, resource_type, tag):
    request = RemoveTagsRequest()
    request.set_ResourceId(resource_id)
    request.set_ResourceType(resource_type)
    request.set_Tag1Key(tag.get('key'))
    request.set_Tag1Value(tag.get('value'))
    _get_response(request)


if __name__ == '__main__':
    remove_tag('i-xxxx', 'instance', {'key':'env', 'value':'test'})

建立资源自带标签页面操做

上述的操做都是针对于已有资源的Tag添加,为了保证标签流程的闭环,在建立资源的时候也是支持标签添加的,在资源的建立接口都是支持直接带Tag的建立,例如建立实例接口:

from aliyunsdkecs.request.v20140526.RunInstancesRequest import RunInstancesRequest

def remove_tag(resource_id, resource_type, tag):
    request = RunInstancesRequest()
    ...
    request.set_Tags({'Key':'env', 'Value':'test'})
    _get_response(request)

这样建立出来的实例将会自然带有env:test标签。

控制台操做

添加标签送我学习API

控制台添加标签,能够直接在实例列表的”更多”选项中选择编辑标签,在弹出框中新建标签便可。

图片描述

图片描述

查询标签送我学习API

标签在实例列表中或者实例详情页中就能够看到。

删除标签送我学习API

与添加标签同样,删除标签也在编辑标签的弹出窗口中操做,选择已有的标签删除掉便可。

图片描述

建立资源自带标签送我学习API

如今的新版buy页面自然支持实例分组(Tag)功能,在新版buy页面须要先填写完前两步中的必填项。

图片描述

在第四步的分组配置中,能够添加这次建立资源的标签

图片描述

在最后确认订单阶段,能够确认标签的选择。

图片描述

基于Tag的权限控制

咱们涉及到的权限控制都指的是在子帐号状况下对子帐号的访问进行控制,首先须要在RAM控制台建立子帐号(用户),而后给子用户授予权限,这个子用户将只有操做、查询受权规则相关的权限。 
对于标签权限,受权语法以下:

{
  "Version": "1",
  "Statement": [
    {
      "Effect": "Allow",
      "Action": "*",
      "Resource": "*",
      "Condition": {
        "StringEquals": {
          "ecs:tag/depart": "dep1"
        }
      }
    }
  ]
}

受权了如上权限的子用户,就只能操做带有depart:dep1标签的资源,注意,在查询时,这个受权不能做为过滤条件,在这个子帐号查询实例的时候,必须带有Tag.1.Key=depart Tag.1.Value=dep1的过滤条件才容许查询。

对于使用Tag受权的资源,对不一样类型的API有不一样的限制表现,具体的限制以下:

操做类接口

对于操做类接口(如StartInstance),是针对某一个资源的操做,子帐号是否有权限彻底依赖这个实例是否带有指定的标签。 
若是实例上带有受权语句中全部规定的标签,则容许子帐号操做。

查询类接口

对于查询类操做,因为全部的鉴权行为都是前置行为(即判断结果只区分是否经过,而不会判断一个集合中有哪些经过),因此不会对结果集合进行“有权限过滤”。使用了标签鉴权的子帐号,必须在查询中带有指定有权限的标签进行查询,才能查到有权限的实例。

建立类接口

对于建立类接口,鉴权时会判断接口中使用的全部资源是否是有权限,同时,也会判断建立出来的资源是否有权限。所以,对于带有标签受权的子帐号,建立实例的时候,建立调用也必须带有相关Tag,不然子用户没有权限建立。

原文连接 
阅读更多干货好文,请关注扫描如下二维码:

图片描述

相关文章
相关标签/搜索