管理標籤

您可以透過控制台、CLI 或 API 在資源或服務 ID 上附加和分離標籤。 若要在資源或服務 ID 上附加或分離標籤,必須為使用者指派適當的權限。 如需相關資訊,請參閱授與使用者對標籤資源的存取權。

一個資源最多可以有 1000 個使用者標籤、1000 個服務標籤和 250 個存取標籤。

在控制台中附加和分離資源上的標籤

  1. 在IBM Cloud®控制台中,點擊導航選單圖示導覽選單圖示>資源清單以查看資源清單。

  2. 在清單中找到特定資源。

  3. 若要將標籤附加到資源,請按一下操作圖示操作圖示>新增標籤。

  4. 輸入標籤的名稱,然後按一下 「儲存」。

  5. 若要將標籤與資源分離,請按一下資源清單中標籤旁的編輯圖示編輯圖示。

    當您從資源中分離存取管理標籤時,任何關聯的存取策略也會從該資源中分離。

使用 CLI 將標籤附加到資源

登入 IBM Cloud® CLI 並選擇您的帳戶以執行對應的 CLI 命令。

若要將標籤附加到資源,請使用 ibmcloud resource tag-attach 命令。 tag-type 的允許值為使用者標籤的 user 和存取管理標籤的 access。 預設值為 user。 以下範例示範如何將名為 MyTag 的使用者標籤附加到名為 MyResource 的資源:

ibmcloud resource tag-attach --tag-names MyTag --resource-name  'MyResource'

將名為 project:myproject 的存取管理標籤附加到名為 MyResource 的資源的範例:

ibmcloud resource tag-attach --tag-names project:myproject --resource-name  'MyResource' --tag-type access

使用 CLI 更新資源的 key:value 標籤

登入 IBM Cloud® CLI 並選擇您的帳戶以執行對應的 CLI 命令。

如果您以 key:value 格式管理標籤,則可以自動更新 value,而無需先分開 key:old-value 並附加新的 key:new-value。

若要更新格式為 key:value 標記的值,請使用帶有 --update 選項的 ibmcloud resource tag-attach 命令。 tag-type 的允許值為使用者標籤的 user 和存取管理標籤的 access。 預設值為 user。 以下範例示範如何將名為 MyResource 資源上的 env 使用者標記的值更新為 production:

ibmcloud resource tag-attach --tag-names 'env:production' --resource-name 'MyResource' --update

將 tag-type 選項新增至上一個命令以更新存取管理標籤:

ibmcloud resource tag-attach --tag-names 'env:production' --resource-name 'MyResource' --update --tag-type access

使用 CLI 將資源的所有標籤替換為一組新標籤

登入 IBM Cloud® CLI 並選擇您的帳戶以執行對應的 CLI 命令。

附加操作會導致在資源可能已有的標籤之外新增標籤。 在某些情況下,您需要將附加到資源的現有標籤替換為新標籤集。

若要將所有資源的標籤替換為一組新標籤,請使用帶有 --replace 選項的 ibmcloud resource tag-attach 命令。 tag-type 的允許值為使用者標籤的 user 和存取管理標籤的 access。 預設值為 user。 以下範例示範如何在名為 MyResource 的資源上設定標籤 tag1、tag2 和 tag3,並刪除它可能已具有的所有標籤:

ibmcloud resource tag-attach --tag-names 'tag1,tag2,tag3' --resource-name 'MyResource' --replace

將 tag-type 選項新增至上一個命令以設定存取管理標籤。 例如,要將所有存取管理標籤替換為 compliance:hipaa:

ibmcloud resource tag-attach --tag-names 'compliance:hipaa' --resource-name 'MyResource' --replace --tag-type access

使用 CLI 從資源分離標籤

若要將標籤與資源分離,請使用 ibmcloud resource tag-detach 命令。 以下是從名為 MyResource 資源中分離名為 MyTag 的使用者標籤的範例:

ibmcloud resource tag-detach --tag-names MyTag —resource-name 'MyResource'

您可以使用 * 通配符來分離標籤,這對於分離 key:value 格式的標籤以及分離所有標籤非常有用。 例如,如果您想要將 env 標記與 MyResource 分離,無論其值為何,您可以執行下列命令:

ibmcloud resource tag-detach --tag-names 'env:*' —resource-name 'MyResource'

要從 MyResource 分離所有標籤,您可以使用以下命令:

ibmcloud resource tag-detach --tag-names '*' —resource-name 'MyResource'

以下是從名為 MyResource 資源中分離名為 project:myproject 的存取管理標籤的範例:

ibmcloud resource tag-detach --tag-names project:myproject —resource-name 'MyResource' --tag-type access

有關詳細信息,請參閱 ibmcloud resource 命令參考。 當您從資源中分離存取管理標籤時,任何關聯的存取策略也會從該資源中分離。

使用 API 將標籤附加到資源

您可以透過呼叫 全域搜尋和標記 - 標記 API以程式設計方式附加標記,如以下範例請求所示。 tag_type 查詢參數的允許值為:user (針對使用者標籤)和 access (針對存取管理標籤)。 以下範例示範如何將名為 project:myproject 的存取管理標記附加到服務實例。

  1. 透過呼叫以下命令來尋找資源的唯一識別碼:

    curl -v -X POST -k --header 'Content-Type: application/json'
    --header 'Accept: application/json'
    --header 'Authorization: bearer  <your IAM token>'
    -d '{"query": "name:myresource"}' 'https://api.global-search-tagging.cloud.ibm.com/v3/resources/search'
    
    SearchOptions searchOptions = new SearchOptions.Builder()
     .query("GST-sdk-*")
     .fields(new java.util.ArrayList<String>(java.util.Arrays.asList("crn")))
     .searchCursor(searchCursor)
     .build();
    Response<ScanResult> response = service.search(searchOptions).execute();
    ScanResult scanResult = response.getResult();
    System.out.println(scanResult);
    
    const params = {
    query: 'GST-sdk-*',
    fields: ['crn'],
    searchCursor: searchCursor,
    };
    globalSearchService.search(params)
    .then(res => {
     console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
     console.warn(err)
    });
    
    response = global_search_service.search(query='GST-sdk-*',
                       fields=['crn'])
    scan_result = response.get_result()
    print(json.dumps(scan_result, indent=2))
    
    searchOptions := globalSearchService.NewSearchOptions()
    searchOptions.SetLimit(10)
    searchOptions.SetQuery("GST-sdk-*")
    searchOptions.SetFields([]string{"crn"})
    scanResult, response, err := globalSearchService.Search(searchOptions)
    if err != nil {
     panic(err)
    }
    b, _ := json.MarshalIndent(scanResult, "", "  ")
    fmt.Println(string(b))
    
  2. 從回應中提取 CRN 欄位的值。

       {
       "items": [
         {
           "crn": "crn:v1:bluemix:public:cf:au-syd:a/000af2ea12345aabb1234567801fffab::cf-organization:aaaf4100-0011-2233-1111-11aaffee0011"
         }
       ],
       "limit": 1,
       "search_cursor": "e34535305339jg0rntt39nt3nu5tt9yn3u5ntt329nutt92u4ntt92u4t9u5gt2u5gt92u4n5g982458hg2t45hg9u42rg9t2u49gh285ght28h5t2835th85ht318h4tg9138h4tg91u3hgt931hg45918h34tg18h43hgt31hgt3rng0fnefvodnfvpojdpbojarfdbpojeafrbeafbjeqpnrqngrpqgrhbHNlIiwiY2FuVGFnIjoiZmFsc2UiLCJsdfshfksdhfkshfdkshfdkhkhewrkfehrkhkwhfkwrhkfhrgk3h5k3h45k3hk45hgk3hgk3hfk3h4k3hfkrfh3rkgh3krghk3rgh3kghk3hgk3hgk3rhgdWJsaWM6Y2Y6YXUtwriretoeiroteito4i5ot4i5oyti45ito4tio45ito45io5ogno5iogn5oin5oingoi5o5ngogo4ngo4ngro3jrong3gor3g3gno3jrgo3jrngo3ngro3g32ODQiXX0t"
     }
    
  3. 調用以下命令:

    curl -X POST -H "Authorization: {iam_token}" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{ "resources": [{ "resource_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/59bcbfa6ea2f006b4ed7094c1a08dcdd:1a0ec336-f391-4091-a6fb-5e084a4c56f4::" }], "tag_names": ["project:myproject"] }' \
    "https://tags.global-search-tagging.cloud.ibm.com/v3/tags/attach?tag_type=access"
    
    Resource resourceModel = new Resource.Builder().resourceId(resourceCRN).build();
    AttachTagOptions attachTagOptions = new AttachTagOptions.Builder()
    .addResources(resourceModel)
    .addTagNames("project:myproject")
    .tagType("access")
    .build();
    Response<TagResults> response = service.attachTag(attachTagOptions).execute();
    TagResults tagResults = response.getResult();
    System.out.println(tagResults.toString());
    
    const resourceModel = {
    resource_id: resourceCrn,
    };
    const params = {
    resources: [resourceModel],
    tagNames: ["project:myproject"],
    tagType: 'access',
    };
    globalTaggingService.attachTag(params)
    .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
    console.warn(err)
    });
    
    resource_model = {'resource_id': resource_crn}
    tag_results = global_tagging_service.attach_tag(
    resources=[resource_model],
    tag_names=['project:myproject'],
    tag_type='access').get_result()
    print(json.dumps(tag_results, indent=2))
    
    resourceModel := &globaltaggingv1.Resource{
    ResourceID: &resourceCRN,
    }
    attachTagOptions := globalTaggingService.NewAttachTagOptions(
    []globaltaggingv1.Resource{*resourceModel},
    )
    attachTagOptions.SetTagNames([]string{"project:myproject"})
    attachTagOptions.SetTagType("access")
    tagResults, response, err := globalTaggingService.AttachTag(attachTagOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(tagResults, "", "  ")
    fmt.Println(string(b))
    

更新資源的 key:value 標籤

如果您以 key:value 格式管理標籤,則可以自動更新值,而無需先分離 key:old-value 並附加新的 key:new-value。 為此,請使用 update 布林查詢參數。 因此,要將資源上的標籤 env 更新為值 env:qa_test,只需將 update=true 查詢參數新增至附加 API 呼叫即可。 有關使用 update 查詢參數的更多信息,請參閱 全域搜尋和標記 - 標記 API。

使用一組新標籤取代資源的所有標籤

附加操作會導致在資源可能已有的標籤之外新增標籤。 在某些情況下,您需要將附加到資源的現有標籤替換為新標籤集。 為此,請使用 replace 布林查詢參數。 因此,要將資源上的所有標籤替換為一組新標籤,只需將 replace=true 查詢參數新增至附加 API 呼叫即可。 有關使用 replace 查詢參數的更多信息,請參閱 全域搜尋和標記 - 標記 API。

使用 API 從資源中分離標籤

您可以透過呼叫 全域搜尋和標記 - 標記 API以程式設計方式分離標記,如下列範例請求所示。 tag_type 查詢參數的允許值為:user (針對使用者標籤)和 access (針對存取管理標籤)。 以下範例示範如何從服務實例中分離名為 project:myproject 的存取管理標籤:

  1. 透過呼叫以下命令來尋找資源的唯一識別碼:

    curl -v -X POST -k --header 'Content-Type: application/json'
    --header 'Accept: application/json'
    --header 'Authorization: bearer  <your IAM token>'
    -d '{"query": "name:myresource"}' 'https://api.global-search-tagging.cloud.ibm.com/v3/resources/search'
    
    SearchOptions searchOptions = new SearchOptions.Builder()
     .query("GST-sdk-*")
     .fields(new java.util.ArrayList<String>(java.util.Arrays.asList("crn")))
     .searchCursor(searchCursor)
     .build();
    Response<ScanResult> response = service.search(searchOptions).execute();
    ScanResult scanResult = response.getResult();
    System.out.println(scanResult);
    
    const params = {
    query: 'GST-sdk-*',
    fields: ['crn'],
    searchCursor: searchCursor,
    };
    globalSearchService.search(params)
    .then(res => {
     console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
     console.warn(err)
    });
    
    response = global_search_service.search(query='GST-sdk-*',
                       fields=['crn'])
    scan_result = response.get_result()
    print(json.dumps(scan_result, indent=2))
    
    searchOptions := globalSearchService.NewSearchOptions()
    searchOptions.SetLimit(10)
    searchOptions.SetQuery("GST-sdk-*")
    searchOptions.SetFields([]string{"crn"})
    scanResult, response, err := globalSearchService.Search(searchOptions)
    if err != nil {
     panic(err)
    }
    b, _ := json.MarshalIndent(scanResult, "", "  ")
    fmt.Println(string(b))
    
  2. 從回應中提取 CRN 欄位的值。

       {
       "items": [
         {
           "crn": "crn:v1:bluemix:public:cf:au-syd:a/000af2ea12345aabb1234567801fffab::cf-organization:aaaf4100-0011-2233-1111-11aaffee0011"
         }
       ],
       "limit": 1,
       "search_cursor": "e34535305339jg0rntt39nt3nu5tt9yn3u5ntt329nutt92u4ntt92u4t9u5gt2u5gt92u4n5g982458hg2t45hg9u42rg9t2u49gh285ght28h5t2835th85ht318h4tg9138h4tg91u3hgt931hg45918h34tg18h43hgt31hgt3rng0fnefvodnfvpojdpbojarfdbpojeafrbeafbjeqpnrqngrpqgrhbHNlIiwiY2FuVGFnIjoiZmFsc2UiLCJsdfshfksdhfkshfdkshfdkhkhewrkfehrkhkwhfkwrhkfhrgk3h5k3h45k3hk45hgk3hgk3hfk3h4k3hfkrfh3rkgh3krghk3rgh3kghk3hgk3hgk3rhgdWJsaWM6Y2Y6YXUtwriretoeiroteito4i5ot4i5oyti45ito4tio45ito45io5ogno5iogn5oin5oingoi5o5ngogo4ngo4ngro3jrong3gor3g3gno3jrgo3jrngo3ngro3g32ODQiXX0t"
     }
    
  3. 調用以下命令:

    curl -X POST -H "Authorization: {iam_token}" \
    -H "Accept: application/json" \
    -H "Content-Type: application/json" \
    -d '{ "resources": [{ "resource_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/59bcbfa6ea2f006b4ed7094c1a08dcdd:1a0ec336-f391-4091-a6fb-5e084a4c56f4::" }], "tag_names": ["project:myproject"] }' \
    "https://tags.global-search-tagging.cloud.ibm.com/v3/tags/detach?tag_type=access"
    
    Resource resourceModel = new Resource.Builder().resourceId(resourceCRN).build();
    DetachTagOptions detachTagOptions = new DetachTagOptions.Builder()
    .addResources(resourceModel)
    .addTagNames("project:myproject")
    .tagType("access")
    .build();
    Response<TagResults> response = service.detachTag(detachTagOptions).execute();
    TagResults tagResults = response.getResult();
    System.out.println(tagResults.toString());
    
    const resourceModel = {
    resource_id: resourceCrn,
    };
    const params = {
    resources: [resourceModel],
    tagNames: ["project:myproject"],
    tagType: 'access',
    };
    globalTaggingService.detachTag(params)
    .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
    console.warn(err)
    });
    
    resource_model = {'resource_id': resource_crn}
    tag_results = global_tagging_service.detach_tag(
    resources=[resource_model],
    tag_names=['project:myproject'],
    tag_type='access').get_result()
    print(json.dumps(tag_results, indent=2))
    
    resourceModel := &globaltaggingv1.Resource{
    ResourceID: &resourceCRN,
    }
    detachTagOptions := globalTaggingService.NewDetachTagOptions(
    []globaltaggingv1.Resource{*resourceModel},
    )
    detachTagOptions.SetTagNames([]string{"project:myproject"})
    detachTagOptions.SetTagType("access")
    tagResults, response, err := globalTaggingService.DetachTag(detachTagOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(tagResults, "", "  ")
    fmt.Println(string(b))
    

    當您從資源中分離存取管理標籤時,任何關聯的存取策略也會從該資源中分離。

分離所有標籤和按鍵分離標籤

您可以使用 * 通配符來分離標籤,這對於分離 key:value 格式的標籤以及分離所有標籤非常有用。 例如,如果您想要從給定資源中分離 env 標籤,無論其值為何,您可以執行下列命令:

curl -X POST -H "Authorization: {iam_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "resources": [{ "resource_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/59bcbfa6ea2f006b4ed7094c1a08dcdd:1a0ec336-f391-4091-a6fb-5e084a4c56f4::" }], "tag_names": ["env:*"] }' \
"https://tags.global-search-tagging.cloud.ibm.com/v3/tags/detach?tag_type=access"

如果您想要分離所有標籤,只需使用 * 作為 tag_name 或作為 tag_names 陣列中的唯一元素,如以下命令所示:

curl -X POST -H "Authorization: {iam_token}" \
-H "Accept: application/json" \
-H "Content-Type: application/json" \
-d '{ "resources": [{ "resource_id": "crn:v1:bluemix:public:cloud-object-storage:global:a/59bcbfa6ea2f006b4ed7094c1a08dcdd:1a0ec336-f391-4091-a6fb-5e084a4c56f4::" }], "tag_names": ["*"] }' \
"https://tags.global-search-tagging.cloud.ibm.com/v3/tags/detach?tag_type=access"

使用 Terraform 將標籤附加到資源

在使用 Terraform 將標籤附加到資源之前,請確保您已完成以下操作:

  • 安裝 Terraform CLI 並為 Terraform 配置IBM Cloud Provider 外掛程式。 有關更多信息,請參閱 IBM Cloud®上的 Terraform 入門 教程。 該插件抽象化了用於完成此任務的IBM Cloud API。

  • 建立名為 main.tf 的 Terraform 配置檔案。 在此文件中,您使用HashiCorp配置語言定義資源。 有關更多信息,請參閱 Terraform 文件。

使用 Terraform 依照以下步驟將標籤附加到資源:

  1. 依照 ibm_resource_tag {: external}中記錄的範例,準備 Terraform 設定檔(例如main.tf ),將使用者標籤附加到我們帳戶中的現有資源。

  2. 建置完設定檔後,初始化 Terraform CLI。 有關詳細信息,請參閱 初始化工作目錄。

    terraform init
    
  3. 從 main.tf 檔案設定資源。 有關更多信息,請參閱 使用 Terraform 配置基礎設施。

    1. 執行 terraform plan 以產生 Terraform 執行計劃以預覽建議的操作。

      terraform plan
      
    2. 執行 terraform apply 以建立計劃中定義的資源。

      terraform apply
      

在控制台中將標籤附加到服務 ID

若要為服務 ID 新增標籤,請完成下列步驟:

  1. 選擇附加存取管理標籤或使用者標籤。
    • 如果要附加存取管理標籤,則必須先建立該標籤。 有關更多信息,請參閱 建立標籤。
    • 如果您想要附加使用者標籤,則無需建立使用者標籤即可將其附加到資源或服務 ID。 附加標籤也會創建它。
  2. 前往管理>存取 (IAM) >服務 ID。
  3. 選取您要標記的服務 ID。
  4. 點擊新增標籤編輯圖示。
  5. 輸入標籤的名稱,然後按 Enter。
  6. 按一下儲存。

當您標記服務 ID 時,所有具有您的存取管理標記範圍內的資源的策略都包含對此服務 ID 的存取權限。

使用 CLI 將標籤附加到服務 ID

tag_type 查詢參數的允許值為:user (針對使用者標籤)和 access (針對存取管理標籤)。 以下範例示範如何將名為 project:myproject 的存取管理標籤附加到服務 ID。 若要為服務 ID 新增標籤,請完成下列步驟:

  1. 選擇附加存取管理標籤或使用者標籤。

    • 如果要附加存取管理標籤,則必須先建立該標籤。 有關更多信息,請參閱 建立標籤。
    • 如果您想要附加使用者標籤,則無需建立使用者標籤即可將其附加到資源或服務 ID。 附加標籤也會創建它。
  2. 若要將標籤附加到您的服務 ID,請使用 tag-attach 命令。 有關詳細信息,請參閱 CLI 命令參考。

    ibmcloud resource tag-attach --tag-names project:myproject --resource-name 'ServiceIdName' --tag-type access
    

當您標記服務 ID 時,所有具有您的存取管理標記範圍內的資源的策略都包含對此服務 ID 的存取權限。

使用 API 將標籤附加到服務 ID

若要為服務 ID 新增標籤,請完成下列步驟:

  1. 選擇附加存取管理標籤或使用者標籤。

    • 如果要附加存取管理標籤,則必須先建立該標籤。 有關更多信息,請參閱 建立標籤。
    • 如果您想要附加使用者標籤,則無需建立使用者標籤即可將其附加到資源或服務 ID。 附加標籤也會創建它。
  2. 透過使用以下命令呼叫 IAM 身分服務 來尋找您的服務 ID 的唯一識別碼:

    curl -X GET 'https://iam.cloud.ibm.com/v1/serviceids?account_id=ACCOUNT_ID&name=My-serviceID' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json'
    
    ListServiceIdsOptions listServiceIdsOptions = new ListServiceIdsOptions.Builder()
       .accountId(accountId)
       .name(serviceIdName)
       .build();
    Response<ServiceIdList> response = service.listServiceIds(listServiceIdsOptions).execute();
    ServiceIdList serviceIdList = response.getResult();
    System.out.println(serviceIdList);
    
    const params = {
    accountId: accountId,
    name: serviceIdName,
    };
    try {
    const res = await iamIdentityService.listServiceIds(params)
    console.log(JSON.stringify(res.result, null, 2));
    } catch (err) {
    console.warn(err);
    }
    
    service_id_list = iam_identity_service.list_service_ids(
    account_id=account_id,
    name=serviceid_name
    ).get_result()
    print(json.dumps(service_id_list, indent=2))
    
    listServiceIdsOptions := iamIdentityService.NewListServiceIdsOptions()
    listServiceIdsOptions.SetAccountID(accountID)
    listServiceIdsOptions.SetName(serviceIDName)
    serviceIDList, response, err := iamIdentityService.ListServiceIds(listServiceIdsOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(serviceIDList, "", "  ")
    fmt.Println(string(b))
    
  3. 從回應中提取 crn 欄位的值。

       {
    "offset": 0,
    "limit": 1,
    "first": {
       "href": "https://iam.cloud.ibm.com/v1/serviceids?account_id=accountId"
    },
    "next": {
       "href": "https://iam.cloud.ibm.com/v1/serviceids?pagetoken=pageToken"
    },
    "serviceids": {
       "id": "ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "iam_id": "iam-ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "entity_tag": "3-c46d2fd21b701adf7eb67cfd1a498fde",
       "crn": "crn:v1:bluemix:public:iam-identity::a/100abcde100a41abc100aza678abc0zz::serviceid:ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "locked": false,
       "created_at": "2020-10-16T10:36+0000",
       "modified_at": "2020-10-16T10:36+0000",
       "account_id": "100abcde100a41abc100aza678abc0zz",
       "name": "serviceId-test",
       "description": "serviceId-test",
       "unique_instance_crns": []
    }
    }
    
  4. 若要將標籤附加到您的服務 ID,請使用下列命令呼叫 全域搜尋和標記 - 標記 API。

    將 {SERVICEID_CRN} 替換為您在上一步中提取的值。

    將 (serviceidCRN) 替換為您在上一步中提取的值。

    將 serviceidCrn 替換為您在上一步中提取的值。

    將 serviceid_crn 替換為您在上一步中提取的值。

    將 &serviceidCRN 替換為您在上一步中提取的值。

    curl -X POST --header "Authorization: Bearer {iam_token}" --header "Accept: application/json" --header "Content-Type: application/json" -d '{ "resources": [{ "resource_id": "{SERVICEID_CRN}" }], "tag_names": ["tag_test_1", "tag_test_2"] }' "{base_url}/v3/tags/attach?tag_type=user"
    
    Resource resourceModel = new Resource.Builder().resourceId(serviceidCRN).build();
    AttachTagOptions attachTagOptions = new AttachTagOptions.Builder()
       .addResources(resourceModel)
       .addTagNames("tag_test_1")
       .addTagNames("tag_test_2")
       .build();
    Response<TagResults> response = service.attachTag(attachTagOptions).execute();
    TagResults tagResults = response.getResult();
    System.out.println(tagResults.toString());
    
    const resourceModel = {
    resource_id: serviceidCrn,
    };
    const params = {
    resources: [resourceModel],
    tagNames: ["tag_test_1", "tag_test_2"],
    tagType: 'user',
    };
    globalTaggingService.attachTag(params)
    .then(res => {
       console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
       console.warn(err)
    });
    
    resource_model = {'resource_id': serviceid_crn}
    tag_results = global_tagging_service.attach_tag(
    resources=[resource_model],
    tag_names=['tag_test_1', 'tag_test_2'],
    tag_type='user').get_result()
    print(json.dumps(tag_results, indent=2))
    
    resourceModel := &globaltaggingv1.Resource{
    ResourceID: &serviceidCRN,
    }
    attachTagOptions := globalTaggingService.NewAttachTagOptions(
    []globaltaggingv1.Resource{*resourceModel},
    )
    attachTagOptions.SetTagNames([]string{"tag_test_1", "tag_test_2"})
    attachTagOptions.SetTagType("user")
    tagResults, response, err := globalTaggingService.AttachTag(attachTagOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(tagResults, "", "  ")
    fmt.Println(string(b))
    

當您標記服務 ID 時,所有具有您的存取管理標記範圍內的資源的策略都包含對此服務 ID 的存取權限。

在控制台中分離服務 ID 上的標籤

若要從服務 ID 拆下標籤,請完成下列步驟:

  1. 前往管理>存取 (IAM) >服務 ID。
  2. 點選編輯圖示編輯圖示。
  3. 點擊要從服務 ID 分離的標籤上的刪除圖示刪除圖示。
  4. 按一下儲存。

當您將存取管理標籤與服務 ID 分開時,任何作用於該標籤的策略都不再包含對該服務 ID 的存取。

當您取下使用者標籤時,如果不再附加到任何資源,該標籤會自動從帳戶中刪除。

使用 CLI 分離服務 ID 上的標籤

若要分離服務 ID 上的標籤,請使用 tag-detach 指令。 有關詳細信息,請參閱 CLI 命令參考。

ibmcloud resource tag-detach --tag-names project:myproject --resource-id  'ServiceIdName' --tag-type access

當您將存取管理標籤與服務 ID 分開時,該標籤範圍內的任何策略都不再包含存取該服務 ID。

使用 API 分離服務 ID 上的標籤

若要從服務 ID 拆下標籤,請完成下列步驟:

  1. 透過使用以下命令呼叫 IAM 身分服務 來尋找您的服務 ID 的唯一識別碼:

    curl -X GET 'https://iam.cloud.ibm.com/v1/serviceids?account_id=ACCOUNT_ID&name=My-serviceID' -H 'Authorization: Bearer TOKEN' -H 'Content-Type: application/json'
    
    ListServiceIdsOptions listServiceIdsOptions = new ListServiceIdsOptions.Builder()
       .accountId(accountId)
       .name(serviceIdName)
       .build();
    Response<ServiceIdList> response = service.listServiceIds(listServiceIdsOptions).execute();
    ServiceIdList serviceIdList = response.getResult();
    System.out.println(serviceIdList);
    
    const params = {
    accountId: accountId,
    name: serviceIdName,
    };
    try {
    const res = await iamIdentityService.listServiceIds(params)
    console.log(JSON.stringify(res.result, null, 2));
    } catch (err) {
    console.warn(err);
    }
    
    service_id_list = iam_identity_service.list_service_ids(
    account_id=account_id,
    name=serviceid_name
    ).get_result()
    print(json.dumps(service_id_list, indent=2))
    
    listServiceIdsOptions := iamIdentityService.NewListServiceIdsOptions()
    listServiceIdsOptions.SetAccountID(accountID)
    listServiceIdsOptions.SetName(serviceIDName)
    serviceIDList, response, err := iamIdentityService.ListServiceIds(listServiceIdsOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(serviceIDList, "", "  ")
    fmt.Println(string(b))
    
  2. 從回應中提取 crn 欄位的值。

       {
    "offset": 0,
    "limit": 1,
    "first": {
       "href": "https://iam.cloud.ibm.com/v1/serviceids?account_id=accountId"
    },
    "next": {
       "href": "https://iam.cloud.ibm.com/v1/serviceids?pagetoken=pageToken"
    },
    "serviceids": {
       "id": "ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "iam_id": "iam-ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "entity_tag": "3-c46d2fd21b701adf7eb67cfd1a498fde",
       "crn": "crn:v1:bluemix:public:iam-identity::a/100abcde100a41abc100aza678abc0zz::serviceid:ServiceId-ee1103f8-e03b-4d02-a977-e540ebdffb16",
       "locked": false,
       "created_at": "2020-10-16T10:36+0000",
       "modified_at": "2020-10-16T10:36+0000",
       "account_id": "100abcde100a41abc100aza678abc0zz",
       "name": "serviceId-test",
       "description": "serviceId-test",
       "unique_instance_crns": []
    }
    }
    
  3. 若要分離服務 ID 上的標籤,請使用下列命令呼叫 全域搜尋和標記 - 標記 API。

    將 {SERVICEID_CRN} 替換為您在上一步中提取的值。

    將 (serviceidCRN) 替換為您在上一步中提取的值。

    將 serviceidCrn 替換為您在上一步中提取的值。

    將 serviceid_crn 替換為您在上一步中提取的值。

    將 &serviceidCRN 替換為您在上一步中提取的值。

    curl -X POST --header "Authorization: Bearer {iam_token}" --header "Accept: application/json" --header "Content-Type: application/json" -d '{ "resources": [{ "resource_id": "{SERVICEID_CRN}" }], "tag_names": ["tag_test_1", "tag_test_2"] }' "{base_url}/v3/tags/detach?tag_type=user"
    
    Resource resourceModel = new Resource.Builder().resourceId(serviceidCRN).build();
    DetachTagOptions detachTagOptions = new DetachTagOptions.Builder()
       .addResources(resourceModel)
       .addTagNames("tag_test_1")
       .addTagNames("tag_test_2")
       .tagType("user")
       .build();
    Response<TagResults> response = service.detachTag(detachTagOptions).execute();
    TagResults tagResults = response.getResult();
    System.out.println(tagResults.toString());
    
    const resourceModel = {
    resource_id: serviceidCrn,
    };
    const params = {
    resources: [resourceModel],
    tagNames: ["tag_test_1", "tag_test_2"],
    tagType: 'user',
    };
    globalTaggingService.detachTag(params)
    .then(res => {
       console.log(JSON.stringify(res.result, null, 2));
    })
    .catch(err => {
       console.warn(err)
    });
    
    resource_model = {'resource_id': serviceid_crn}
    tag_results = global_tagging_service.detach_tag(
    resources=[resource_model],
    tag_names=['tag_test_1', 'tag_test_2'],
    tag_type='user').get_result()
    print(json.dumps(tag_results, indent=2))
    
    resourceModel := &globaltaggingv1.Resource{
    ResourceID: &serviceidCRN,
    }
    detachTagOptions := globalTaggingService.NewDetachTagOptions(
    []globaltaggingv1.Resource{*resourceModel},
    )
    detachTagOptions.SetTagNames([]string{"tag_test_1", "tag_test_2"})
    detachTagOptions.SetTagType("user")
    tagResults, response, err := globalTaggingService.DetachTag(detachTagOptions)
    if err != nil {
    panic(err)
    }
    b, _ := json.MarshalIndent(tagResults, "", "  ")
    fmt.Println(string(b))
    

當您將存取管理標籤與服務 ID 分開時,任何作用於該標籤的策略都不再包含對該服務 ID 的存取。

從帳戶中刪除未使用的標籤

user 標籤不再與任何資源相關時會自動刪除,因此您應該不需要手動執行。 但是,您應該為 access management 標籤這樣做。

在刪除標記之前,必須先從所有資源和服務 ID 中移除標記。 如果仍無法刪除,則標籤可能附在您無權檢視的資源上,或已被回收。 同一個帳單帳戶中的不同使用者可以將同一個標籤附加到數個資源和服務 ID 上。

如果回收的資源阻止標記刪除,您可以完全刪除該回收的資源,也可以在刪除後 7 天內恢復它。 並非所有資源都可以恢復。 您可以使用IBM Cloud® CLI 來管理特定資源的回收過程。 有關詳細信息,請參閱 使用資源回收。

當您從帳戶中刪除存取管理標籤時,任何關聯的 IAM 策略也會隨之刪除。

在控制台中刪除未使用的標籤

  1. 若要查看帳戶中標籤的完整清單,請移至 IBM Cloud® 主控台的「管理」>「帳戶」,然後選取「標籤」。
  2. 點選未使用標籤旁的操作圖示操作圖示>刪除。

使用 CLI 刪除未使用的標籤

登入 IBM Cloud® CLI 並選擇您的帳戶來執行 ibmcloud resource tag-delete 命令以僅刪除一個或全部未使用的標籤。

  • 以下範例刪除 MyTag 用戶標籤:

    ibmcloud resource tag-delete --tag-name MyTag
    

使用 API 刪除未使用的標籤

您可以透過呼叫 全域搜尋和標記 - 標記 API來刪除標記,如以下範例請求所示。 tag_type 查詢參數的允許值為:user (針對使用者標籤)和 access (針對存取管理標籤)。

刪除標籤

從帳戶中刪除名為 project:myproject 的存取管理標籤:

curl -X DELETE -H "Authorization: {iam_token}" \
-H "Accept: application/json" \
"https://tags.global-search-tagging.cloud.ibm.com/v3/tags/project:myproject?tag_type=access"
DeleteTagOptions deleteTagOptions = new DeleteTagOptions.Builder()
    .tagName("env:example-access-tag")
    .tagType("access")
    .build();

Response<DeleteTagResults> response = service.deleteTag(deleteTagOptions).execute();
DeleteTagResults deleteTagResults = response.getResult();
System.out.println(deleteTagResults.toString());
const params = {
  tagName: 'env:example-access-tag',
  tagType: 'access',
};

globalTaggingService.deleteTag(params)
  .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
delete_tag_results = global_tagging_service.delete_tag(
  tag_name='env:example-access-tag',
  tag_type='access').get_result()

print(json.dumps(delete_tag_results, indent=2))
deleteTagOptions := globalTaggingService.NewDeleteTagOptions("env:example-access-tag")
deleteTagOptions.SetTagType("access")

deleteTagResults, response, err := globalTaggingService.DeleteTag(deleteTagOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(deleteTagResults, "", "  ")
fmt.Println(string(b))

刪除所有未使用的標籤

從帳戶中刪除所有未使用的存取管理標籤:

curl -X DELETE -H "Authorization: {iam_token}" \
-H "Accept: application/json" \
"https://tags.global-search-tagging.cloud.ibm.com//v3/tags?tag_type=access"
DeleteTagAllOptions deleteTagAllOptions = new DeleteTagAllOptions.Builder()
    .tagType("user")
    .build();

Response<DeleteTagsResult> response = service.deleteTagAll(deleteTagAllOptions).execute();
DeleteTagsResult deleteTagsResult = response.getResult();

System.out.println(deleteTagsResult.toString());
const params = {
  tagType: 'access',
};

globalTaggingService.deleteTagAll(params)
  .then(res => {
    console.log(JSON.stringify(res.result, null, 2));
  })
  .catch(err => {
    console.warn(err)
  });
delete_tags_result = global_tagging_service.delete_tag_all(
  tag_type='user').get_result()

print(json.dumps(delete_tags_result, indent=2))
deleteTagAllOptions := globalTaggingService.NewDeleteTagAllOptions()
deleteTagAllOptions.SetTagType("user")

deleteTagsResult, response, err := globalTaggingService.DeleteTagAll(deleteTagAllOptions)
if err != nil {
  panic(err)
}
b, _ := json.MarshalIndent(deleteTagsResult, "", "  ")
fmt.Println(string(b))