Cloud Storage にアップロードされたデータの分類の自動化

このチュートリアルでは、Cloud Storage などの Google Cloud Platform(GCP)プロダクトを使用してデータの自動隔離と分類を行う方法について説明します。このチュートリアルは、読者が GCP と基本的な shell プログラミングに精通していることを前提としています。

あらゆる組織において、データ保護責任者は、常時増え続ける、適切な保護や扱いが必要なデータに対応します。特に 1 日に数百、数千のファイルに対応する場合、そのデータの隔離と分類は複雑で時間がかかる場合があります。

各ファイルを取得し隔離場所にアップロードして、ファイルの分類を自動的に行い、その分類結果に基づいて適切な場所にファイルを自動的に移動することはできないものでしょうか。このチュートリアルでは、Cloud FunctionsCloud StorageCloud Data Loss Prevention(DLP)を使用して、そのようなシステムを実装する方法を説明します。

目標

  • 隔離と分類のパイプラインの一部として使用する Cloud Storage バケットを作成する。
  • ファイル処理の完了を通知するために、Cloud Pub/Sub トピックとサブスクリプションを作成する。
  • ファイルをアップロードするときに DLP API を呼び出す簡単な Cloud Functions を作成する。
  • いくつかのサンプル ファイルを隔離バケットにアップロードして、Cloud Functions を起動する。Functions は DLP API を使用してファイルの検査と分類を行い、ファイルを適切なバケットに移動します。

料金

このチュートリアルでは、以下を含む GCP の課金対象コンポーネントを使用しています。

  • Cloud Storage
  • Cloud Functions
  • Cloud Data Loss Prevention

料金計算ツールを使用すると、予想使用量に基づいて費用の見積もりを作成できます。

始める前に

  1. Google アカウントにログインします。

    Google アカウントをまだお持ちでない場合は、新しいアカウントを登録します。

  2. GCP プロジェクトを選択または作成します。

    [リソースの管理] ページに移動

  3. プロジェクトに対して課金が有効になっていることを確認します。

    課金を有効にする方法について

  4. Cloud Functions、Cloud Storage、Cloud Data Loss Prevention API を有効にします。

    APIを有効にする

サービス アカウントへの権限の付与

まず、Cloud Functions サービス アカウントと Cloud DLP サービス アカウントに権限を付与します。

App Engine のデフォルトのサービス アカウントに権限を付与する

  1. GCP Console で [IAM と管理] ページを開き、作成したプロジェクトを選択します。

    [IAM と管理] ページに移動

  2. App Engine のサービス アカウントを見つけます。このアカウントの形式は [PROJECT_ID]@appspot.gserviceaccount.com です。ここで、[PROJECT_ID] は使用するプロジェクト ID に置き換えてください。

  3. サービス アカウントの横にある編集アイコンを選択します。

  4. 次の役割を追加します。

    • Project > オーナー
    • Cloud DLP > DLP 管理者
    • サービス管理 > Cloud DLP サービス エージェント
  5. [保存] をクリックします。

DLP サービス アカウントに権限を付与する

  1. GCP Console で [IAM と管理] ページを開き、作成したプロジェクトを選択します。

    [IAM と管理] ページに移動

  2. Cloud DLP サービス エージェントのサービス アカウントを見つけます。このアカウントの形式は service-[PROJECT_NUMBER]@dlp-api.iam.gserviceaccount.com です。ここで、[PROJECT_NUMBER] は使用するプロジェクト番号に置き換えてください。

  3. サービス アカウントの横にある編集アイコンを選択します。

  4. [Project] > [閲覧者] 役割を追加し、[保存] をクリックします。

隔離と分類のパイプラインを作成する

このセクションでは、次の図に示す隔離と分類のパイプラインを作成します。

隔離と分類のワークフロー

上のパイプラインの番号は、次のステップに対応しています。

  1. ファイルを Cloud Storage にアップロードします。
  2. Cloud Functions を起動します。
  3. Cloud DLP がデータを検査、分類します。
  4. ファイルが適切なバケットに移動します。

Cloud Storage バケットを作成する

バケットとオブジェクトの命名ガイドラインのガイダンスに沿って、このチュートリアルで使用する一意の名前付きバケットを 3 つ作成します。

  • バケット 1: [YOUR_QUARANTINE_BUCKET] を一意の名前に置き換えます。
  • バケット 2: [YOUR_SENSITIVE_DATA_BUCKET] を一意の名前に置き換えます。
  • バケット 3: [YOUR_NON_SENSITIVE_DATA_BUCKET] を一意の名前に置き換えます。

Console

  1. GCP Console で、Cloud Storage ブラウザを開きます。

    Cloud Storage ブラウザに移動

  2. [バケットを作成] をクリックします。

  3. バケット名テキスト ボックスに [YOUR_QUARANTINE_BUCKET] に選択した名前を入力して、[作成] をクリックします。

  4. [YOUR_SENSITIVE_DATA_BUCKET] バケットと [YOUR_NON_SENSITIVE_DATA_BUCKET] バケットに対して同じ操作を繰り返します。

gcloud

  1. Cloud Shell を開きます。

    Cloud Shell に移動

  2. 次のコマンドを実行して、3 つのバケットを作成します。

    gsutil mb gs://[YOUR_QUARANTINE_BUCKET]
    gsutil mb gs://[YOUR_SENSITIVE_DATA_BUCKET]
    gsutil mb gs://[YOUR_NON_SENSITIVE_DATA_BUCKET]
    

Cloud Pub/Sub トピックとサブスクリプションを作成する

Console

  1. [Cloud Pub/Sub トピック] ページに移動します。

    [Cloud Pub/Sub トピック] に移動

  2. [トピックを作成] をクリックします。

  3. PROJECTS/[YOUR_PROJECT_NAME]/TOPICS/ という形式のエントリを持つテキスト ボックスに、次のようにトピック名を付加します。

    PROJECTS/[YOUR_PROJECT_NAME]/TOPICS/[PUB/SUB_TOPIC]
  4. [作成] をクリックします。

  5. 新しく作成したトピックを選択し、トピック名の後に続く 3 つのドット(...)をクリックして、[新しい登録] を選択します。

  6. PROJECTS/[YOUR_PROJECT_NAME]/TOPICS/[PUB/SUB_TOPIC] という形式のエントリを持つテキスト ボックスに、次のようにサブスクリプション名を付加します。

    PROJECTS/[YOUR_PROJECT_NAME]/TOPICS/[PUB/SUB_TOPIC]/[PUB/SUB_SUBSCRIPTION]
  7. [作成] をクリックします。

gcloud

  1. Cloud Shell を開きます。

    Cloud Shell に移動

  2. トピックを作成します。[PUB/SUB_TOPIC] は任意の名前で置き換えます。

    gcloud pubsub topics create [PUB/SUB_TOPIC]
  3. サブスクリプションを作成します。[PUB/SUB_SUBSCRIPTION] は任意の名前で置き換えます。

    gcloud pubsub subscriptions create [PUB/SUB_SUBSCRIPTION] --topic [PUB/SUB_TOPIC]

Cloud Functions を作成する

このセクションでは、次の 2 つの Cloud Functions 関数を含む Python スクリプトをデプロイする方法について説明します。

  • オブジェクトが Cloud Storage にアップロードされたときに呼び出される関数。
  • Cloud Pub/Sub キューでメッセージを受信したときに呼び出される関数。

1 つ目の関数の作成

Console

  1. Cloud Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. Cloud Functions を有効にしたプロジェクトを選択します。

  3. [関数を作成] をクリックします。

  4. [名前] ボックスで、デフォルトの名前を「create_DLP_job」に置き換えます。

  5. [トリガー] フィールドで、[Cloud Storage] を選択します。

  6. [バケット] フィールドで [参照] をクリックします。プルダウン リストでバケットをハイライト表示して隔離バケットを選択し、[選択] をクリックします。

  7. [ランタイム] で [Python 3.7] を選択します。

  8. [ソースコード] で [インライン エディタ] チェックボックスをオンにします。

  9. [main.py] ボックスに次のコードを貼り付けて既存のテキストを置き換えます。

    """ Copyright 2018, Google, Inc.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
      http://www.apache.org/licenses/LICENSE-2.0
    
    Unless  required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    
    Authors: Yuhan Guo, Zhaoyuan Sun, Fengyi Huang, Weimu Song.
    Date:    October 2018
    
    """
    
    from google.cloud import dlp
    from google.cloud import storage
    from google.cloud import pubsub
    import os
    
    # ----------------------------
    #  User-configurable Constants
    
    PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
    """The bucket the to-be-scanned files are uploaded to."""
    STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
    """The bucket to move "sensitive" files to."""
    SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
    """The bucket to move "non sensitive" files to."""
    NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'
    """ Pub/Sub topic to notify once the  DLP job completes."""
    PUB_SUB_TOPIC = '[PUB/SUB_TOPIC]'
    """The minimum_likelihood (Enum) required before returning a match"""
    """For more info visit: https://cloud.google.com/dlp/docs/likelihood"""
    MIN_LIKELIHOOD = 'POSSIBLE'
    """The maximum number of findings to report (0 = server maximum)"""
    MAX_FINDINGS = 0
    """The infoTypes of information to match"""
    """For more info visit: https://cloud.google.com/dlp/docs/concepts-infotypes"""
    INFO_TYPES = [
        'FIRST_NAME', 'PHONE_NUMBER', 'EMAIL_ADDRESS', 'US_SOCIAL_SECURITY_NUMBER'
    ]
    
    # End of User-configurable Constants
    # ----------------------------------
    
    # Initialize the Google Cloud client libraries
    dlp = dlp.DlpServiceClient()
    storage_client = storage.Client()
    publisher = pubsub.PublisherClient()
    subscriber = pubsub.SubscriberClient()
    
    def create_DLP_job(data, done):
      """This function is triggered by new files uploaded to the designated Cloud Storage quarantine/staging bucket.
    
           It creates a dlp job for the uploaded file.
        Arg:
           data: The Cloud Storage Event
        Returns:
            None. Debug information is printed to the log.
        """
      # Get the targeted file in the quarantine bucket
      file_name = data['name']
      print('Function triggered for file [{}]'.format(file_name))
    
      # Prepare info_types by converting the list of strings (INFO_TYPES) into a list of dictionaries
      info_types = [{'name': info_type} for info_type in INFO_TYPES]
    
      # Convert the project id into a full resource id.
      parent = dlp.project_path(PROJECT_ID)
    
      # Construct the configuration dictionary.
      inspect_job = {
          'inspect_config': {
              'info_types': info_types,
              'min_likelihood': MIN_LIKELIHOOD,
              'limits': {
                  'max_findings_per_request': MAX_FINDINGS
              },
          },
          'storage_config': {
              'cloud_storage_options': {
                  'file_set': {
                      'url':
                          'gs://{bucket_name}/{file_name}'.format(
                              bucket_name=STAGING_BUCKET, file_name=file_name)
                  }
              }
          },
          'actions': [{
              'pub_sub': {
                  'topic':
                      'projects/{project_id}/topics/{topic_id}'.format(
                          project_id=PROJECT_ID, topic_id=PUB_SUB_TOPIC)
              }
          }]
      }
    
      # Create the DLP job and let the DLP api processes it.
      try:
        dlp.create_dlp_job(parent, inspect_job)
        print('Job created by create_DLP_job')
      except Exception as e:
        print(e)
    
    def resolve_DLP(data, context):
      """This function listens to the pub/sub notification from function above.
    
        As soon as it gets pub/sub notification, it picks up results from the
        DLP job and moves the file to sensitive bucket or nonsensitive bucket
        accordingly.
        Args:
            data: The Cloud Pub/Sub event
    
        Returns:
            None. Debug information is printed to the log.
        """
      # Get the targeted DLP job name that is created by the create_DLP_job function
      job_name = data['attributes']['DlpJobName']
      print('Received pub/sub notification from DLP job: {}'.format(job_name))
    
      # Get the DLP job details by the job_name
      job = dlp.get_dlp_job(job_name)
      print('Job Name:{name}\nStatus:{status}'.format(
          name=job.name, status=job.state))
    
      # Fetching Filename in Cloud Storage from the original dlpJob config.
      # See defintion of "JSON Output' in Limiting Cloud Storage Scans':
      # https://cloud.google.com/dlp/docs/inspecting-storage
    
      file_path = (
          job.inspect_details.requested_options.job_config.storage_config
          .cloud_storage_options.file_set.url)
      file_name = os.path.basename(file_path)
    
      info_type_stats = job.inspect_details.result.info_type_stats
      source_bucket = storage_client.get_bucket(STAGING_BUCKET)
      source_blob = source_bucket.blob(file_name)
      if (len(info_type_stats) > 0):
        # Found at least one sensitive data
        for stat in info_type_stats:
          print('Found {stat_cnt} instances of {stat_type_name}.'.format(
              stat_cnt=stat.count, stat_type_name=stat.info_type.name))
        print('Moving item to sensitive bucket')
        destination_bucket = storage_client.get_bucket(SENSITIVE_BUCKET)
        source_bucket.copy_blob(source_blob, destination_bucket,
                                file_name)  # copy the item to the sensitive bucket
        source_blob.delete()  # delete item from the quarantine bucket
    
      else:
        # No sensitive data found
        print('Moving item to non-sensitive bucket')
        destination_bucket = storage_client.get_bucket(NONSENSITIVE_BUCKET)
        source_bucket.copy_blob(
            source_blob, destination_bucket,
            file_name)  # copy the item to the non-sensitive bucket
        source_blob.delete()  # delete item from the quarantine bucket
      print('{} Finished'.format(file_name))
    
  10. [main.py] ボックスに貼り付けたコードの以下の行を修正し、それぞれの変数を、プロジェクトのプロジェクト ID、対応するバケット、作成した Cloud Pub/Sub トピックとサブスクリプションの名前に置き換えます。

    [YOUR_QUARANTINE_BUCKET]
    [YOUR_SENSITIVE_DATA_BUCKET]
    [YOUR_NON_SENSITIVE_DATA_BUCKET]
    [PROJECT_ID_HOSTING_STAGING_BUCKET]
    [PUB/SUB_TOPIC]
    
  11. [実行する関数] テキスト ボックスで hello_gcscreate_DLP_job に置き換えます。

  12. 既存のテキストを置き換えて、次のコードを [requirements.txt] テキスト ボックスに貼り付けます。

    google-cloud-dlp
    google-cloud-pubsub
    google-cloud-storage
    
    
  13. [保存] をクリックします。

    関数の横にある緑のチェックマークは、デプロイが成功したことを示しています。

    デプロイに成功

gcloud

  1. Cloud Shell セッションを開き、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. リポジトリをクローニングしたフォルダのディレクトリに移動します。

    cd gcs-dlp-classification-python/
  3. [main.py] ボックスのコードの以下の行を修正し、次のバケット変数を作成済みの対応するバケットに置き換えます。Cloud Pub/Sub トピックとサブスクリプション変数を選択した名前に置き換えます。

    [YOUR_QUARANTINE_BUCKET]
    [YOUR_SENSITIVE_DATA_BUCKET]
    [YOUR_NON_SENSITIVE_DATA_BUCKET]
    [PROJECT_ID_HOSTING_STAGING_BUCKET]
    [PUB/SUB_TOPIC]
    
  4. 関数をデプロイします。[YOUR_QUARANTINE_BUCKET] はバケット名で置き換えます。

    gcloud functions deploy create_DLP_job --runtime python37 \
        --trigger-resource [YOUR_QUARANTINE_BUCKET] \
        --trigger-event google.storage.object.finalize
    
  5. 関数が正常にデプロイされたことを確認します。

    gcloud functions describe create_DLP_job

    デプロイに成功すると、次のような ready ステータスが表示されます。

    status:  READY
    timeout:  60s
    

1 つ目の Cloud Functions の関数が正常にデプロイされたら、次のセクションに進んで 2 つ目の Cloud Functions の関数を作成します。

2 つ目の関数の作成

Console

  1. Cloud Functions の概要ページを開きます。

    Cloud Functions の概要ページに移動

  2. Cloud Functions を有効にしたプロジェクトを選択します。

  3. [関数を作成] をクリックします。

  4. [名前] ボックスで、デフォルトの名前を resolve_DLP に置き換えます。

  5. [トリガー] フィールドで [Cloud Pub/Sub] を選択します。

  6. [トピック] フィールドに [PUB/SUB_TOPIC] と入力します。

  7. [ソースコード] で [インライン エディタ] チェックボックスをオンにします。

  8. [ランタイム] で [Python 3.7] を選択します。

  9. [main.py] ボックスに次のコードを貼り付けて既存のテキストを置き換えます。

    """ Copyright 2018, Google, Inc.
    
    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at
    
      http://www.apache.org/licenses/LICENSE-2.0
    
    Unless  required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.
    
    Authors: Yuhan Guo, Zhaoyuan Sun, Fengyi Huang, Weimu Song.
    Date:    October 2018
    
    """
    
    from google.cloud import dlp
    from google.cloud import storage
    from google.cloud import pubsub
    import os
    
    # ----------------------------
    #  User-configurable Constants
    
    PROJECT_ID = '[PROJECT_ID_HOSTING_STAGING_BUCKET]'
    """The bucket the to-be-scanned files are uploaded to."""
    STAGING_BUCKET = '[YOUR_QUARANTINE_BUCKET]'
    """The bucket to move "sensitive" files to."""
    SENSITIVE_BUCKET = '[YOUR_SENSITIVE_DATA_BUCKET]'
    """The bucket to move "non sensitive" files to."""
    NONSENSITIVE_BUCKET = '[YOUR_NON_SENSITIVE_DATA_BUCKET]'
    """ Pub/Sub topic to notify once the  DLP job completes."""
    PUB_SUB_TOPIC = '[PUB/SUB_TOPIC]'
    """The minimum_likelihood (Enum) required before returning a match"""
    """For more info visit: https://cloud.google.com/dlp/docs/likelihood"""
    MIN_LIKELIHOOD = 'POSSIBLE'
    """The maximum number of findings to report (0 = server maximum)"""
    MAX_FINDINGS = 0
    """The infoTypes of information to match"""
    """For more info visit: https://cloud.google.com/dlp/docs/concepts-infotypes"""
    INFO_TYPES = [
        'FIRST_NAME', 'PHONE_NUMBER', 'EMAIL_ADDRESS', 'US_SOCIAL_SECURITY_NUMBER'
    ]
    
    # End of User-configurable Constants
    # ----------------------------------
    
    # Initialize the Google Cloud client libraries
    dlp = dlp.DlpServiceClient()
    storage_client = storage.Client()
    publisher = pubsub.PublisherClient()
    subscriber = pubsub.SubscriberClient()
    
    def create_DLP_job(data, done):
      """This function is triggered by new files uploaded to the designated Cloud Storage quarantine/staging bucket.
    
           It creates a dlp job for the uploaded file.
        Arg:
           data: The Cloud Storage Event
        Returns:
            None. Debug information is printed to the log.
        """
      # Get the targeted file in the quarantine bucket
      file_name = data['name']
      print('Function triggered for file [{}]'.format(file_name))
    
      # Prepare info_types by converting the list of strings (INFO_TYPES) into a list of dictionaries
      info_types = [{'name': info_type} for info_type in INFO_TYPES]
    
      # Convert the project id into a full resource id.
      parent = dlp.project_path(PROJECT_ID)
    
      # Construct the configuration dictionary.
      inspect_job = {
          'inspect_config': {
              'info_types': info_types,
              'min_likelihood': MIN_LIKELIHOOD,
              'limits': {
                  'max_findings_per_request': MAX_FINDINGS
              },
          },
          'storage_config': {
              'cloud_storage_options': {
                  'file_set': {
                      'url':
                          'gs://{bucket_name}/{file_name}'.format(
                              bucket_name=STAGING_BUCKET, file_name=file_name)
                  }
              }
          },
          'actions': [{
              'pub_sub': {
                  'topic':
                      'projects/{project_id}/topics/{topic_id}'.format(
                          project_id=PROJECT_ID, topic_id=PUB_SUB_TOPIC)
              }
          }]
      }
    
      # Create the DLP job and let the DLP api processes it.
      try:
        dlp.create_dlp_job(parent, inspect_job)
        print('Job created by create_DLP_job')
      except Exception as e:
        print(e)
    
    def resolve_DLP(data, context):
      """This function listens to the pub/sub notification from function above.
    
        As soon as it gets pub/sub notification, it picks up results from the
        DLP job and moves the file to sensitive bucket or nonsensitive bucket
        accordingly.
        Args:
            data: The Cloud Pub/Sub event
    
        Returns:
            None. Debug information is printed to the log.
        """
      # Get the targeted DLP job name that is created by the create_DLP_job function
      job_name = data['attributes']['DlpJobName']
      print('Received pub/sub notification from DLP job: {}'.format(job_name))
    
      # Get the DLP job details by the job_name
      job = dlp.get_dlp_job(job_name)
      print('Job Name:{name}\nStatus:{status}'.format(
          name=job.name, status=job.state))
    
      # Fetching Filename in Cloud Storage from the original dlpJob config.
      # See defintion of "JSON Output' in Limiting Cloud Storage Scans':
      # https://cloud.google.com/dlp/docs/inspecting-storage
    
      file_path = (
          job.inspect_details.requested_options.job_config.storage_config
          .cloud_storage_options.file_set.url)
      file_name = os.path.basename(file_path)
    
      info_type_stats = job.inspect_details.result.info_type_stats
      source_bucket = storage_client.get_bucket(STAGING_BUCKET)
      source_blob = source_bucket.blob(file_name)
      if (len(info_type_stats) > 0):
        # Found at least one sensitive data
        for stat in info_type_stats:
          print('Found {stat_cnt} instances of {stat_type_name}.'.format(
              stat_cnt=stat.count, stat_type_name=stat.info_type.name))
        print('Moving item to sensitive bucket')
        destination_bucket = storage_client.get_bucket(SENSITIVE_BUCKET)
        source_bucket.copy_blob(source_blob, destination_bucket,
                                file_name)  # copy the item to the sensitive bucket
        source_blob.delete()  # delete item from the quarantine bucket
    
      else:
        # No sensitive data found
        print('Moving item to non-sensitive bucket')
        destination_bucket = storage_client.get_bucket(NONSENSITIVE_BUCKET)
        source_bucket.copy_blob(
            source_blob, destination_bucket,
            file_name)  # copy the item to the non-sensitive bucket
        source_blob.delete()  # delete item from the quarantine bucket
      print('{} Finished'.format(file_name))
    
  10. [main.py] ボックスに貼り付けたコードの以下の行を修正し、それぞれの変数を、プロジェクトのプロジェクト ID、対応するバケット、作成した Cloud Pub/Sub トピックとサブスクリプションの名前に置き換えます。

    [YOUR_QUARANTINE_BUCKET]
    [YOUR_SENSITIVE_DATA_BUCKET]
    [YOUR_NON_SENSITIVE_DATA_BUCKET]
    [PROJECT_ID_HOSTING_STAGING_BUCKET]
    [PUB/SUB_TOPIC]
    
  11. [実行する関数] テキスト ボックスで helloPubSubresolve_DLP に置き換えます。

  12. [requirements.txt] テキスト ボックスに次のコードを貼り付けて既存のテキストを置き換えます。

    google-cloud-dlp
    google-cloud-pubsub
    google-cloud-storage
    
    
  13. [保存] をクリックします。

    関数の横にある緑のチェックマークは、デプロイが成功したことを示しています。

    デプロイに成功

gcloud

  1. Cloud Shell セッションを開くか再開し、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. Python コードが格納されているフォルダのディレクトリに移動します。

    cd gcs-dlp-classification-python
  3. [main.py] ボックスのコードの以下の行を修正し、次のバケット変数を、作成済みの対応するバケットに置き換えます。Cloud Pub/Sub トピックとサブスクリプション変数を選択した名前に置き換えます。

    [YOUR_QUARANTINE_BUCKET]
    [YOUR_SENSITIVE_DATA_BUCKET]
    [YOUR_NON_SENSITIVE_DATA_BUCKET]
    [PROJECT_ID_HOSTING_STAGING_BUCKET]
    [PUB/SUB_TOPIC]
    
  4. 関数をデプロイします。[PUB/SUB_TOPIC] は Cloud Pub/Sub トピックで置き換えます。

    gcloud functions deploy resolve_DLP --runtime python37 --trigger-topic [PUB/SUB_TOPIC]
  5. 関数が正常にデプロイされたことを確認します。

    gcloud functions describe resolve_DLP

    デプロイに成功すると、次のような ready ステータスが表示されます。

    status:  READY
    timeout:  60s
    

Cloud Functions が正常にデプロイされたら、次のセクションに進みます。

隔離バケットにサンプル ファイルをアップロードする

この記事に関連する GitHub リポジトリには、サンプル データファイルが含まれています。このフォルダには、機密データを含むいくつかのファイルと機密データを含まないファイルが含まれています。機密データは、次の INFO_TYPES 値の 1 つ以上を含むものとして分類されます。

US_SOCIAL_SECURITY_NUMBER
EMAIL_ADDRESS
PERSON_NAME
LOCATION
PHONE_NUMBER

サンプル ファイルの分類に使用されるデータ型は、main.py ファイルの INFO_TYPES 定数で定義されます。この定数は、最初は [‘PHONE_NUMBER', ‘EMAIL_ADDRESS'] に設定されています。

  1. リポジトリがまだクローニングされていない場合は、Cloud Shell を開き、コードといくつかのサンプル データファイルを含む GitHub リポジトリをクローニングします。

    Cloud Shell で開く

  2. サンプル データファイルが格納されているフォルダに移動します。

    cd ~/dlp-cloud-functions-tutorials/sample_data/
  3. gsutil コマンドを使用して、サンプル データファイルを隔離バケットにコピーします。[YOUR_QUARANTINE_BUCKET] は隔離バケットの名前で置き換えます。

    gsutil -m  cp * gs://[YOUR_QUARANTINE_BUCKET]/

    Cloud DLP は、隔離バケットにアップロードされた各ファイルを検査、分類し、その分類に基づいて適切なターゲット バケットに移動します。

  4. Cloud Storage Console で、Storage ブラウザページを開きます。

    Cloud Storage ブラウザに移動

  5. 作成したターゲット バケットのうちの 1 つを選択して、アップロードされたファイルを確認します。また、作成した他のバケットも確認します。

クリーンアップ

現在のチュートリアルが終了したら、GCP で作成したリソースをクリーンアップして、今後料金が発生しないようにします。次のセクションで、このようなリソースを削除または無効にする方法を説明します。

プロジェクトの削除

  1. GCP Console で [プロジェクト] ページに移動します。

    プロジェクト ページに移動

  2. プロジェクト リストで、削除するプロジェクトを選択し、[削除] をクリックします。
  3. ダイアログでプロジェクト ID を入力し、[シャットダウン] をクリックしてプロジェクトを削除します。

次のステップ

このページは役立ちましたか?評価をお願いいたします。

フィードバックを送信...