0
0

More than 1 year has passed since last update.

AWS Glue DataBrewで個人を特定できる情報 (PII) の検出と変換処理を試す

Last updated at Posted at 2022-10-16

GUIでデータプレパレーションができるサービス AWS Glue DataBrew を使って、個人を特定できる情報 (PII) の検出とデータマスキング変換をできます。

GitHubのaws-samplesに、S3にデータセットをアップロードすると自動的に個人を特定できる情報 (PII) を検出して、データマスキング変換した結果をS3に出力するCloud Formationsテンプレートが公開されています。
https://github.com/aws-samples/automating-pii-data-detection-and-data-masking-tasks-with-aws-glue-databrew-and-aws-step-functions

ざっくりポイントをメモ

Solution概要

  • INPUTファイルとOUTPUTファイル(変換済み)はS3を利用
  • S3の指定バケットにファイルをULすると、EventBridgeが検知してStep Fnctions(以下SFn)を起動する(イベント駆動)
  • SFnはGlue DataBrewを利用して、PII情報検出と変換処理のワークフローを実行する
    • PII情報検出はプロファイルジョブで実行
    • Lambda関数でプロファイルジョブ結果からPII情報有無を参照する
    • データマスキング変換処理はレシピジョブで実行(PII情報が含まれてた場合のみ)
    • 変換処理はHMAC_SHA256でハッシュ化し、そのためのシークレット値はSecrets Managerで管理する

image.png

各構成要素別ポイントまとめ

image.png

[1] EventBridge でファイル追加を検知

  • CFnでautomate-pii-handling-dat-EventBridgeRuleNewDataAr-XXXXXXというルールが生成される。
  • 指定バケットにオブジェクトが追加されたことを検知するイベントパターンでルールを規定する。
  • 検知したらターゲットにSFnステートマシンを指定してキックさせる。

イベントパターン)

{
  "detail-type": ["Object Created"],
  "source": ["aws.s3"],
  "detail": {
    "bucket": {
      "name": ["gluedatabrew-pii-data-input-45e5c580"]
    }
  }
}

参考)
https://docs.aws.amazon.com/ja_jp/eventbridge/latest/userguide/eb-s3-object-created-tutorial.html

[2] Step Functions

  • CFnでStateMachinePIITask-XXXXXというステートマシンが生成される。
  • 上から順に
    • EventBridgeが検知したファイルを元にGlue DataBrewデータセットを作成
    • Glue DataBrewプロファイルジョブを作成(PII検知処理用)
    • Glue DataBrewプロファイルジョブを実行
    • LambdaでS3に出力されるプロファイルジョブ実行結果(JSON)を参照しPII情報カラムを抽出
    • SFn Choiceステートで、PII情報有無によって条件分岐
      • PII情報なし(Lambdaの返却値がNo PII columns found.なら終了
      • PII情報ありなら、Glue DataBrewの処理継続
    • PII情報マスキングのGlue DataBrewレシピを作成
    • Glue DataBrewプロジェクトを作成
    • Glue DataBrewレシピジョブを実行(PII情報マスキング用)
    • 終了

[3] Glue DataBrew

プロファイルジョブ

  • CFnで[データセット名] + -PII-Detection-Jobという名前のプロファイルジョブが生成される
  • データプロファイルの設定のPII統計設定が下記の通り有効化されていることがわかる
    image.png
  • データ系列的にはこんな感じ
    image.png
  • [データセット] - [データプロファイルの概要]からプロファイルジョブ結果を参照でき、full_namecontact_phone_numberemail_addressregistered_credit_cardの4つがPII情報として識別されたことがわかる。
  • spoken_languageはPII列の統計が17%となっており、CFnのパラメータで指定したThreshold(PII判定のための閾値)に満たないため対象外になっている。ちなみにデフォルトでは80%。
    image.png

プロジェクトとレシピジョブ

  • CFnで[データセット名] + -PII-Projectという名前のプロジェクトが生成される
    image.png
  • レシピをyamlで確認するとこんな感じ↓
- Action:
    Operation: CRYPTOGRAPHIC_HASH
    Parameters:
      secretId: >-
        arn:aws:secretsmanager:us-east-1:248933603227:secret:GlueDataBrewPIITaskSecret-TcCV4h
      sourceColumns: >-
        ["full_name","contact_phone_number","email_address","registered_credit_card"]

[4] Lambda

  • CFnでautomate-pii-handling-dat-FunctionGlueDataBrewProf-XXXXXという名前で生成される
  • Glue DataBrewのプロファイルジョブが出力したJSONファイルをチェックし、PII検知数がThresholdを超えたカラムをPII情報を含むカラムとしてリストで返却。もしなければNo PII columns found.を返却。
import json
import boto3
import os

def lambda_handler(event, context):

  s3Bucket = event["Outputs"][0]["Location"]["Bucket"]
  s3ObjKey = event["Outputs"][0]["Location"]["Key"]

  s3 =boto3.client('s3')
  glueDataBrewProfileResultFile = s3.get_object(Bucket=s3Bucket, Key=s3ObjKey)
  glueDataBrewProfileResult = json.loads(glueDataBrewProfileResultFile['Body'].read().decode('utf-8'))
  columnsProfiled = glueDataBrewProfileResult["columns"]

  PIIColumnsList = []
  for item in columnsProfiled:
    if "entityTypes" in item["entity"]:
      if (item["entity"]["rowsCount"]/glueDataBrewProfileResult["sampleSize"]) >= int(os.environ.get("threshold"))/100:
        PIIColumnsList.append(item["name"])

  if PIIColumnsList == []:
    return 'No PII columns found.'
  else:
    return PIIColumnsList

実行結果の確認

サンプルデータへの処理結果はS3に出力され、S3 Selectで確認すると以下の通りfull_namecontact_phone_numberemail_addressregistered_credit_cardの4つのPII情報が自動的に識別されハッシュ化されていることがわかる。

image.png

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0