태그 관리

콘솔, 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입니다. 다음 예는 MyResource 라는 리소스에 MyTag 라는 사용자 태그를 첨부하는 방법을 보여줍니다:

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를 사용하여 리소스의 키:값 태그 업데이트하기

IBM Cloud® CLI에 로그인하고 적절한 CLI 명령을 실행하기 위한 계정을 선택하십시오.

key:value 형식으로 태그를 관리하는 경우 key:old-value 을 먼저 분리하고 새 key:new-value 을 첨부하지 않고 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 명령을 실행하기 위한 계정을 선택하십시오.

첨부 작업은 리소스에 이미 있는 태그에 더해 태그를 추가하는 작업입니다. 리소스에 첨부된 기존 태그를 새 세트로 교체해야 하는 경우가 있습니다.

모든 리소스의 태그를 새 태그 집합으로 바꾸려면 ' ibmcloud resource tag-attach 명령어와 ' --replace ' 옵션을 함께 사용하세요. 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. 다음 명령을 호출하여 자원의 고유 ID를 찾으십시오.

    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:old-value '를 분리하고 새 ' key:new-value'을 첨부하지 않고도 값을 원자 단위로 업데이트할 수 있습니다. 이렇게 하려면 ' update 부울 쿼리 매개변수를 사용합니다. 따라서 리소스의 ' env ' 태그를 ' env:qa_test' 값으로 업데이트하려면 첨부 API 호출에 ' update=true ' 쿼리 매개변수를 추가하기만 하면 됩니다. ' update 쿼리 매개변수 사용에 대한 자세한 내용은 글로벌 검색 및 태그 지정 - 태그 지정 API를 참조하세요.

리소스의 모든 태그를 새 태그 집합으로 바꾸기

첨부 작업은 리소스에 이미 있는 태그에 더해 태그를 추가하는 작업입니다. 리소스에 첨부된 기존 태그를 새 세트로 교체해야 하는 경우가 있습니다. 이렇게 하려면 ' replace 부울 쿼리 매개변수를 사용합니다. 따라서 리소스의 모든 태그를 새 태그 집합으로 바꾸려면 첨부 API 호출에 ' replace=true 쿼리 매개변수를 추가하기만 하면 됩니다. ' replace 쿼리 매개변수 사용에 대한 자세한 내용은 글로벌 검색 및 태그 지정 - 태그 지정 API를 참조하세요.

API를 사용하여 리소스에서 태그 분리

다음 샘플 요청에 표시된 것처럼 글로벌 검색 및 태그 지정 - 태그 지정 API를 호출하여 프로그래밍 방식으로 태그를 분리할 수 있습니다. tag_type 조회 매개변수의 허용값은 사용자 태그의 경우 user 및 액세스 관리 태그의 경우 access입니다. 다음 예는 서비스 인스턴스에서 project:myproject 라는 액세스 관리 태그를 분리하는 방법을 보여줍니다:

  1. 다음 명령을 호출하여 자원의 고유 ID를 찾으십시오.

    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를 설치하고 IBM Cloud 구성합니다 제공자 플러그인을 설정합니다. 자세한 내용은 IBM Cloud® Terraform 시작하기 튜토리얼을 참조하세요. 플러그인은 이 태스크를 완료하는 데 사용되는 IBM Cloud API를 요약합니다.

  • 이름이 main.tf인 Terraform 구성 파일을 작성하십시오. 이 파일에서는 HashiCorp 구성 언어를 사용하여 리소스를 정의합니다. 자세한 내용은 테라폼 문서를 참조하세요.

테라폼을 사용하여 리소스에 태그를 첨부하려면 다음 단계를 따르세요:

  1. Ibm_resource_tag ' {: external}에 설명된 예시에 따라 계정의 기존 리소스에 사용자 태그를 첨부하기 위해 Terraform 구성 파일(예: main.tf)을 준비합니다.

  2. 구성 파일 빌드를 완료한 후 Terraform CLI를 초기화합니다. 자세한 내용은 작업 디렉터리 초기화를 참조하세요.

    terraform init
    
  3. ' main.tf ' 파일에서 리소스를 프로비저닝합니다. 자세한 내용은 Terraform으로 인프라 프로비저닝을 참조하세요.

    1. ' terraform plan '을 실행하여 테라폼 실행 계획을 생성하면 제안된 작업을 미리 볼 수 있습니다.

      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입니다. 다음 예는 프로젝트: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 서비스를 호출하여 서비스 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 서비스를 호출하여 서비스 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))