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是一個能夠方便對資源進行標記、分類的工具。bash

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。造成以下圖的機器分類。

圖片描述

以後再考慮按照使用人員進行的資源分類。對於資源保有多的,一我的進行資源的所有管理也是很困難的,因此須要進行基於人員的資源劃分,咱們能夠在資源上,增長表示部門的標籤,表明這些資源隸屬於不一樣的部門。在增長了部門分類以後,機器分類如圖:

圖片描述

權限控制

只使用標籤的資源分類,只能作到對資源進行標記、劃分,沒法進行實質的資源管控隔離,若是須要作到資源真正的使用者隔離,就須要同時結合RAM實現。

簡單介紹下RAM,每一個阿里雲帳號均可以建立多個子帳號,這些子帳號能夠被受權管理阿里雲帳號的某些資源,這個受權操做是阿里雲帳號來管理的,相關文檔見:help.aliyun.com/product/286…

咱們這裏就是使用子帳號結合標籤對資源進行不一樣分類的隔離,咱們爲每一個部門建立一個管理員(子帳號),即dep manager,而後受權每一個子帳號只能操做帶有本身部門標籤的資源。這樣咱們就把實例資源徹底分給兩個部門進行管理,同時,實例上也帶有相關環境的標識。

圖片描述

使用Tag的方式

接下來,詳細描述下上述操做的具體步驟。

API操做

從API操做資源能夠更清晰看到資源的變化過程,所以推薦使用API進行資源操做,相關文檔在這裏:help.aliyun.com/product/525…
對於接下來的操做,只須要安裝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,不然子用戶沒有權限建立。

原文連接
閱讀更多幹貨好文,請關注掃描如下二維碼:

圖片描述

相關文章
相關標籤/搜索