처리 위치 지정

Sensitive Data Protection 작업을 수행할 리전을 지정하여 민감할 수 있는 정보를 처리하는 위치를 제어할 수 있습니다. 이 문서에서는 민감한 정보 보호 처리 위치의 개념을 설명하고 리전을 지정하는 방법을 보여줍니다.

지원되는 리전 및 멀티 리전 목록을 보려면 민감한 정보 보호 위치를 참고하세요.

리전 및 멀티 리전 정보

리전은 미국 서부 나 동아시아와 같은 특정 지리적 장소입니다. 멀티 리전 위치(또는 멀티 리전)는 둘 이상의 지리적 리전을 포함하는 유럽 연합과 같은 큰 지리적 영역입니다.

위치 고려사항

바람직한 위치는 지연 시간, 가용성, 대역폭 비용이 균형 잡힌 위치입니다.

  • 리전을 사용하여 지연 시간과 네트워크 대역폭을 최적화합니다.

  • Google 네트워크 외부에서 데이터를 처리하여 대규모 지역에 분산하거나 리전 중복성을 통해 제공되는 고가용성을 원하는 경우 멀티 리전을 사용하세요.

  • 일반적으로 데이터의 사용자 대부분이 포함된 편리한 위치에서 데이터를 처리해야 합니다.

  • 조직에서 전송 중인 데이터를 지정된 리전 내에 유지해야 하는 경우 리전 엔드포인트(REP)를 지원하는 리전만 사용하세요. 이 경우 Google Cloud 콘솔에서 Sensitive Data Protection의 지역 엔드포인트를 사용할 수 없으므로 Cloud Data Loss Prevention API를 사용해야 합니다.

리전 지정

처리 리전을 지정하는 방법은 요청을 전송하는 엔드포인트 유형(전역 엔드포인트 또는 리전 엔드포인트)에 따라 다릅니다. 선택하는 엔드포인트 유형은 전송 중인 데이터를 지정된 리전 내에 유지해야 하는지에 따라 다릅니다. 자세한 내용은 민감한 정보 보호의 전 세계 및 지역 엔드포인트를 참고하세요.

전역 엔드포인트 요청에 리전 지정

콘솔

Sensitive Data Protection 작업을 설정할 때 리전을 선택합니다.

예를 들어 작업 트리거를 만들 때 다음과 같이 리소스 위치 메뉴에서 위치를 선택합니다.

처리 위치가 문제가 되지 않는 경우 전역 리전을 사용하여 Google에서 처리를 수행해야 할 위치를 선택합니다. Global이 기본 리전 선택 옵션입니다.

REST

요청 엔드포인트 URL에 리전 정보를 입력합니다. 처리 위치가 문제가 되지 않는 경우 global 리전을 사용하면 Google에서 처리를 수행해야 할 위치를 선택합니다. global 리전을 지정하는 요청으로 생성된 모든 리소스는 global 리전에 저장됩니다.

다음은 글로벌 엔드포인트에 대한 몇 가지 요청 예시입니다.

전역 리전 사용

다음 두 요청은 동일한 효과를 가집니다. 리전을 포함하지 않는 것은 locations/global/을 지정하는 것과 동일합니다.

POST https://www.googleapis.com/dlp/v2/projects/PROJECT_ID/locations/global/content:inspect
POST https://www.googleapis.com/dlp/v2/projects/PROJECT_ID/content:inspect

특정 리전 사용

처리할 리전을 지정하려면 리소스 URL 내에 locations/을 삽입하고 리전 이름을 삽입합니다.

POST https://www.googleapis.com/dlp/v2/projects/PROJECT_ID/locations/us-west2/content:inspect

리전 엔드포인트 요청에 리전 지정

콘솔

민감한 정보 보호의 경우 Google Cloud 콘솔에서 지역별 엔드포인트를 사용할 수 없습니다.

C#

민감한 정보 보호의 클라이언트 라이브러리를 설치하고 사용하는 방법은 민감한 정보 보호 클라이언트 라이브러리를 참조하세요.

Sensitive Data Protection에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


using System;
using System.Collections.Generic;
using System.Linq;
using Google.Api.Gax.ResourceNames;
using Google.Cloud.Dlp.V2;
using static Google.Cloud.Dlp.V2.InspectConfig.Types;

public class InspectStringRep
{
    public static InspectContentResponse Inspect(
        string projectId,
        string repLocation,
        string dataValue,
        string minLikelihood,
        int maxFindings,
        bool includeQuote,
        IEnumerable<InfoType> infoTypes,
        IEnumerable<CustomInfoType> customInfoTypes)
    {
        var inspectConfig = new InspectConfig
        {
            MinLikelihood = (Likelihood)Enum.Parse(typeof(Likelihood), minLikelihood, true),
            Limits = new FindingLimits
            {
                MaxFindingsPerRequest = maxFindings
            },
            IncludeQuote = includeQuote,
            InfoTypes = { infoTypes },
            CustomInfoTypes = { customInfoTypes }
        };
        var request = new InspectContentRequest
        {
            Parent = new LocationName(projectId, repLocation).ToString(),
            Item = new ContentItem
            {
                Value = dataValue
            },
            InspectConfig = inspectConfig
        };

        var dlp = new DlpServiceClientBuilder
        {
            Endpoint = $"dlp.{repLocation}.rep.googleapis.com"
        }.Build();

        var response = dlp.InspectContent(request);

        PrintResponse(includeQuote, response);

        return response;
    }

    private static void PrintResponse(bool includeQuote, InspectContentResponse response)
    {
        var findings = response.Result.Findings;
        if (findings.Any())
        {
            Console.WriteLine("Findings:");
            foreach (var finding in findings)
            {
                if (includeQuote)
                {
                    Console.WriteLine($"  Quote: {finding.Quote}");
                }
                Console.WriteLine($"  InfoType: {finding.InfoType}");
                Console.WriteLine($"  Likelihood: {finding.Likelihood}");
            }
        }
        else
        {
            Console.WriteLine("No findings.");
        }
    }
}

Go

민감한 정보 보호의 클라이언트 라이브러리를 설치하고 사용하는 방법은 민감한 정보 보호 클라이언트 라이브러리를 참조하세요.

Sensitive Data Protection에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.

import (
	"context"
	"fmt"
	"io"

	dlp "cloud.google.com/go/dlp/apiv2"
	"cloud.google.com/go/dlp/apiv2/dlppb"
	"google.golang.org/api/option"
)

// inspectString inspects the a given string, and prints results.
func inspectStringRep(w io.Writer, projectID, repLocation, textToInspect string) error {
	// projectID := "my-project-id"
	// textToInspect := "My name is Gary and my email is gary@example.com"
	ctx := context.Background()

	// Assemble the regional endpoint url using provided rep location
	repEndpoint := fmt.Sprintf("dlp.%s.rep.googleapis.com:443", repLocation)

	// Initialize client.
	client, err := dlp.NewClient(ctx, option.WithEndpoint(repEndpoint))
	if err != nil {
		return err
	}
	defer client.Close() // Closing the client safely cleans up background resources.

	// Create and send the request.
	req := &dlppb.InspectContentRequest{
		Parent: fmt.Sprintf("projects/%s/locations/%s", projectID, repLocation),
		Item: &dlppb.ContentItem{
			DataItem: &dlppb.ContentItem_Value{
				Value: textToInspect,
			},
		},
		InspectConfig: &dlppb.InspectConfig{
			InfoTypes: []*dlppb.InfoType{
				{Name: "PHONE_NUMBER"},
				{Name: "EMAIL_ADDRESS"},
				{Name: "CREDIT_CARD_NUMBER"},
			},
			IncludeQuote: true,
		},
	}
	resp, err := client.InspectContent(ctx, req)
	if err != nil {
		return err
	}

	// Process the results.
	result := resp.Result
	fmt.Fprintf(w, "Findings: %d\n", len(result.Findings))
	for _, f := range result.Findings {
		fmt.Fprintf(w, "\tQuote: %s\n", f.Quote)
		fmt.Fprintf(w, "\tInfo type: %s\n", f.InfoType.Name)
		fmt.Fprintf(w, "\tLikelihood: %s\n", f.Likelihood)
	}
	return nil
}

Java

민감한 정보 보호의 클라이언트 라이브러리를 설치하고 사용하는 방법은 민감한 정보 보호 클라이언트 라이브러리를 참조하세요.

Sensitive Data Protection에 인증하려면 애플리케이션 기본 사용자 인증 정보를 설정합니다. 자세한 내용은 로컬 개발 환경의 인증 설정을 참조하세요.


import com.google.cloud.dlp.v2.DlpServiceClient;
import com.google.cloud.dlp.v2.DlpServiceSettings;
import com.google.privacy.dlp.v2.ByteContentItem;
import com.google.privacy.dlp.v2.ByteContentItem.BytesType;
import com.google.privacy.dlp.v2.ContentItem;
import com.google.privacy.dlp.v2.Finding;
import com.google.privacy.dlp.v2.InfoType;
import com.google.privacy.dlp.v2.InspectConfig;
import com.google.privacy.dlp.v2.InspectContentRequest;
import com.google.privacy.dlp.v2.InspectContentResponse;
import com.google.privacy.dlp.v2.LocationName;
import com.google.protobuf.ByteString;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

public class InspectStringRep {

  public static void main(String[] args) throws Exception {
    // TODO(developer): Replace these variables before running the sample.
    String projectId = "your-project-id";
    String repLocation = "regional-endpoint-location-to-use";
    String textToInspect = "My name is Gary and my email is gary@example.com";
    inspectString(projectId, repLocation, textToInspect);
  }

  // Inspects the provided text.
  public static void inspectString(String projectId, String repLocation, String textToInspect)
      throws IOException {
    // Assemble the regional endpoint url using provided rep location
    String repEndpoint = String.format("dlp.%s.rep.googleapis.com:443", repLocation);
    DlpServiceSettings settings = DlpServiceSettings.newBuilder()
        .setEndpoint(repEndpoint)
        .build();
    // Initialize client that will be used to send requests. This client only needs to be created
    // once, and can be reused for multiple requests. After completing all of your requests, call
    // the "close" method on the client to safely clean up any remaining background resources.
    try (DlpServiceClient dlp = DlpServiceClient.create(settings)) {
      // Specify the type and content to be inspected.
      ByteContentItem byteItem =
          ByteContentItem.newBuilder()
              .setType(BytesType.TEXT_UTF8)
              .setData(ByteString.copyFromUtf8(textToInspect))
              .build();
      ContentItem item = ContentItem.newBuilder().setByteItem(byteItem).build();

      // Specify the type of info the inspection will look for.
      List<InfoType> infoTypes = new ArrayList<>();
      // See https://cloud.google.com/dlp/docs/infotypes-reference for complete list of info types
      for (String typeName : new String[] {"PHONE_NUMBER", "EMAIL_ADDRESS", "CREDIT_CARD_NUMBER"}) {
        infoTypes.add(InfoType.newBuilder().setName(typeName).build());
      }

      // Construct the configuration for the Inspect request.
      InspectConfig config =
          InspectConfig.newBuilder().addAllInfoTypes(infoTypes).setIncludeQuote(true).build();

      // Construct the Inspect request to be sent by the client.
      InspectContentRequest request =
          InspectContentRequest.newBuilder()
              .setParent(LocationName.of(projectId, repLocation).toString())
              .setItem(item)
              .setInspectConfig(config)
              .build();

      // Use the client to send the API request.
      InspectContentResponse response = dlp.inspectContent(request);

      // Parse the response and process results
      System.out.println("Findings: " + response.getResult().getFindingsCount());
      for (Finding f : response.getResult().getFindingsList()) {
        System.out.println("\tQuote: " + f.getQuote());
        System.out.println("\tInfo type: " + f.getInfoType().getName());
        System.out.println("\tLikelihood: " + f.getLikelihood());
      }
    }
  }
}

REST

다음 예에서는 리전 엔드포인트에 content.inspect 요청을 전송합니다. 이 요청에 연결된 모든 데이터는 전송, 사용, 저장 중에도 지정된 리전에 유지됩니다.

요청 데이터를 사용하기 전에 다음을 바꿉니다.

  • REP_REGION: 민감한 정보 보호를 위한 리전 엔드포인트(REP)를 사용할 수 있는 리전입니다(예: us-west2). 리전의 전체 목록은 민감한 정보 보호 위치를 참고하세요.
  • PROJECT_ID: Google Cloud 프로젝트 ID입니다. 프로젝트 ID는 example-project 같은 영숫자 문자열입니다.

HTTP 메서드 및 URL:

POST https://dlp.REP_REGION.rep.googleapis.com/v2/projects/PROJECT_ID/locations/REP_REGION/content:inspect

JSON 요청 본문:

{
  "inspectConfig": {
    "infoTypes": [
      {
        "name": "CREDIT_CARD_NUMBER"
      }
    ]
  },
  "item": {
    "value": "hi, my ccn is 4111111111111111"
  }
}

요청을 보내려면 다음 옵션 중 하나를 펼칩니다.

다음과 비슷한 JSON 응답이 표시됩니다.

{
  "result": {
    "findings": [
      {
        "infoType": {
          "name": "CREDIT_CARD_NUMBER",
          "sensitivityScore": {
            "score": "SENSITIVITY_HIGH"
          }
        },
        "likelihood": "LIKELY",
        "location": {
          "byteRange": {
            "start": "14",
            "end": "30"
          },
          "codepointRange": {
            "start": "14",
            "end": "30"
          }
        },
        "createTime": "2024-08-09T19:54:13.348Z",
        "findingId": "2024-08-09T19:54:13.352163Z4747901452516738787"
      }
    ]
  }
}

위치 공유 고려사항

Cloud Storage 또는 BigQuery와 같은 스토리지 저장소를 스캔하는 경우 Sensitive Data Protection 요청의 위치를 스캔한 저장소 위치와 동일하게 지정해야 합니다. 예를 들어 BigQuery 데이터 세트가 유럽 연합 멀티 리전 위치에 있는 경우 Sensitive Data Protection 작업을 구성할 때 유럽 연합 멀티 리전(europe)을 지정합니다.

Sensitive Data Protection 요청을 스캔하는 스토리지 저장소와 같은 위치에 있지 않으면 요청 처리가 데이터 위치와 요청에 지정된 위치 사이에서 분할될 수 있습니다.

다음 단계