ECS TAG功能详解

本文涉及的产品
云服务器 ECS,每月免费额度280元 3个月
云服务器ECS,u1 2核4GB 1个月
简介: Tag(标签),阿里云提供的一种标记资源的方式,对资源添加标签可以方便地对资源进行标记,从而方便的进行资源的批量管理,现在ECS可以使用Tag标记的资源主要有以下几种:实例、磁盘、镜像、快照、安全组。 ### Tag基础 每个Tag是由两个部分组成,Key和Value。

Tag简述

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

Tag基础

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

Tag使用限制

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

  • 首先,一个资源上面已有的Tag不能超过10个,标签太多会导致标签本身难以管理
  • 一个资源上Tag key不能相同,如果添加一个已有key的Tag,会使用新的Tag覆盖老的Tag
  • 相同Tag相同类型的资源数量不建议超过500,相同Tag的资源数量太大,会弱化Tag的资源分类功能

Tag经典场景

标签划分

对于一般的资源管理需求,都是针对一个用户下数量较多的情况,当实例等数量较多时,对实例进行运维管理等操作就会变得比较困难,有时候甚至需要采取拆分账号的方式管理不同部门或者不同用途的资源。如果采用Tag进行资源的分类管理,会大大简化这个问题。

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


1b261b3f77c6682ce44609c3eb194388.png

之后再考虑按照使用人员进行的资源分类。对于资源保有多的,一个人进行资源的全部管理也是很困难的,所以需要进行基于人员的资源划分,我们可以在资源上,增加表示部门的标签,代表这些资源隶属于不同的部门。在增加了部门分类之后,机器分类如图:


5a5f42074585c95614e18c6428cb3e32.png

权限控制

只使用标签的资源分类,只能做到对资源进行标记、划分,无法进行实质的资源管控隔离,如果需要做到资源真正的使用者隔离,就需要同时结合RAM实现。

简单介绍下RAM,每个阿里云账号都可以创建多个子账号,这些子账号可以被授权管理阿里云账号的某些资源,这个授权操作是阿里云账号来管理的,相关文档见:https://help.aliyun.com/product/28625.html

我们这里就是使用子账号结合标签对资源进行不同分类的隔离,我们为每个部门创建一个管理员(子账号),即dep manager,然后授权每个子账号只能操作带有自己部门标签的资源。这样我们就把实例资源完全分给两个部门进行管理,同时,实例上也带有相关环境的标识。


679ffde01d07e2a3350c0e59aa19682f.png

使用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

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


876347808e9b4da984ae9c8aa96b187f.png


5421746c24697d02c7ecdf2a99af2d2c.png

查询标签送我学习API

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

删除标签送我学习API

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


27bed7a43a4f2c44c1cb204f0e6c6511.png

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

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


bfcdee6f4acb2b6ec2bdd14819311105.png

在第四步的分组配置中,可以添加此次创建资源的标签

011568ad421b2618d7a2988a6af4e3d2.png

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

992982f07fe7a1e24a81e739f356380b.png

基于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,否则子用户没有权限创建。

相关实践学习
一小时快速掌握 SQL 语法
本实验带您学习SQL的基础语法,快速入门SQL。
7天玩转云服务器
云服务器ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,可降低 IT 成本,提升运维效率。本课程手把手带你了解ECS、掌握基本操作、动手实操快照管理、镜像管理等。了解产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
1月前
|
NoSQL 关系型数据库 MySQL
多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
业务诉求:考虑到数据库数据日渐增多,导出会有全量数据的导出,多人同时导出可以会对服务性能造成影响,导出涉及到mysql查询的io操作,还涉及文件输入、输出流的io操作,所以对服务器的性能会影响的比较大;结合以上原因,对导出操作进行排队; 刚开始拿到这个需求,第一时间想到就是需要维护一个FIFO先进先出的队列,给定队列一个固定size,在队列里面的人进行排队进行数据导出,导出完成后立马出队列,下一个排队的人进行操作;还考虑到异步,可能还需要建个文件导出表,主要记录文件的导出情况,文件的存放地址,用户根据文件列表情况下载导出文件。
多人同时导出 Excel 干崩服务器?怎样实现一个简单排队导出功能!
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(四)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(二)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(一)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
9月前
|
存储 弹性计算 运维
阿里云弹性裸金属服务器功能特性配置优势详解
阿里云弹性裸金属服务器功能特性配置优势详解
107 0
|
6月前
|
弹性计算 负载均衡 NoSQL
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)(三)
【红包雨功能的】环境部署(弹性伸缩、负载均衡、Redis读写分离、云服务器部署)
|
3月前
|
缓存 负载均衡 中间件
代理服务器的原理是什么?它有什么主要功能?
随着科技的进步和互联网的发展,越来越多的企业在业务上都需要用到代理,那么代理服务器的原理是什么?它有什么主要功能?那么小编接下来就跟大家介绍一下:
60 0
代理服务器的原理是什么?它有什么主要功能?
|
8月前
|
弹性计算 固态存储 数据可视化
阿里云服务器是什么?2023年阿里云服务器价格、产品优势、功能、应用场景介绍
阿里云服务器是什么?云服务器ECS(Elastic Compute Service)是阿里云提供的性能卓越、稳定可靠、弹性扩展的IaaS(Infrastructure as a Service)级别云计算服务。云服务器ECS免去了您采购IT硬件的前期准备,让您像使用水、电、天然气等公共资源一样便捷、高效地使用服务器,实现计算资源的即开即用和弹性伸缩。阿里云ECS持续提供创新型服务器,解决多种业务需求,助力您的业务发展。 为什么选择阿里云服务器。选择云服务器ECS,您可以轻松构建具有以下优势的计算资源: 无需自建机房,无需采购以及配置硬件设施。 分钟级交付,快速部署,缩短应用上线周期。
|
8月前
阿里云最新产品手册——云基础产品与基础设施——计算——弹性裸金属服务器——产品功能
阿里云最新产品手册——云基础产品与基础设施——计算——弹性裸金属服务器——产品功能自制脑图
118 1
|
7月前
|
缓存 API 数据库
Angular 服务器端渲染应用的开箱即用的缓存功能问题
Angular 服务器端渲染应用的开箱即用的缓存功能问题
37 0

相关产品

  • 云服务器 ECS