IBM Cloud Docs
管理标记

管理标记

您可以通过控制台、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 命令。

附加操作的结果是在资源已有标签的基础上再添加标签。 在某些情况下,您需要用一组新的标签替换资源上现有的标签。

To replace all resource's tags with a new set of tags, use the ibmcloud resource tag-attach command with the --replace option. 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 命令。 The following is an example to detach a user tag called MyTag from a resource named MyResource:

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'

The following is an example to detach an access management tag called project:myproject from a resource named MyResource:

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

更多信息,请参阅 "ibmcloud resource 命令参考。 从资源中分离访问管理标记时,任何相关的访问策略也会从该资源中分离。

使用应用程序接口为资源添加标记

如以下请求示例所示,您可以通过调用 全局搜索和标记 - 标记 API以编程方式附加标记。 The allowed values for the tag_type query parameter are: user for user tags and access for access management tags. 下面的示例显示了如何将名为 "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,只需在附加 API 调用中添加 "update=true 查询参数即可。 有关使用 "update 查询参数的更多信息,请参阅 全局搜索和标记 - 标记 API

用一组新标记替换资源的所有标记

附加操作的结果是在资源已有标签的基础上再添加标签。 在某些情况下,您需要用一组新的标签替换资源上现有的标签。 为此,请使用 "replace 布尔查询参数。 因此,要使用一组新标签替换资源上的所有标签,只需在附件 API 调用中添加 "replace=true 查询参数即可。 有关使用 "replace 查询参数的更多信息,请参阅 全局搜索和标记 - 标记 API

使用应用程序接口从资源中分离标签

如以下请求示例所示,您可以通过调用 全局搜索和标记 - 标记 API以编程方式分离标记。 The allowed values for the tag_type query parameter are: user for user tags and access for access management tags. 下面的示例展示了如何从服务实例中分离名为 "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_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提供商插件。提供商插件。 更多信息,请参阅 IBM Cloud®上的 Terraform 入门 教程。 该插件抽象了用于完成此任务的IBM CloudAPI。用于完成此任务的 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 添加标记

The allowed values for the tag_type query parameter are: user for user tags and access for access management tags. 下面的示例显示了如何将名为 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 的访问。

使用应用程序接口分离服务 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 的访问。

删除账户中未使用的标记

在删除标签前,必须先将其从所有资源和服务ID中移除。 如果您仍然无法删除它,则可能是因为该标签附加在您无权查看的资源上,或者该资源已被回收。 同一账单账户中的不同用户可以为多个资源和服务ID添加相同的标签。

如果回收的资源阻止了标记的删除,可以完全删除该回收的资源,或者在删除后 7 天内恢复该资源。 并非所有资源都能恢复。 您可以使用IBM Cloud®CLI 管理特定资源的回收过程。CLI 来管理特定资源的回收流程。 更多信息,请参阅 使用资源重新分配

从账户中删除访问管理标签时,任何相关的 IAM 策略也会随之删除。

在控制台中删除未使用的标记

  1. 要查看您帐户中的完整标签列表,请前往 IBM Cloud® 控制台中的管理 > 帐户,然后选择标签
  2. 单击未使用标签旁边的操作图标操作图标>删除

使用 CLI 删除未使用的标记

登录 IBM Cloud®CLI 并选择您的账户,运行 "ibmcloud resource tag-delete 命令,只删除一个或全部未使用的标记。

  • 下面的示例删除了 "MyTag 用户标记:

    ibmcloud resource tag-delete --tag-name MyTag
    

使用应用程序接口删除未使用的标记

如以下请求示例所示,您可以通过调用 全局搜索和标记 - 标记 API来删除标记。 The allowed values for the tag_type query parameter are: user for user tags and access for access management tags.

删除标记

从账户中删除名为 "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))