Identifying and handling personally identifiable information (PII) ด้วย AWS Glue DataBrew
Tags: aws, awsthai, bigdata, datascience
Published: 2021-11-20 06:33:26

โพสต์นี้เราจะทดสอบการใช้ AWS Glue DataBrew ในการ handling sensitive data ที่อาจอยู่ในระบบบน AWS เช่น Amazon S3 ซึ่งกระบวนการนี้หลักการคือให้เนื้อข้อมูลไม่อยู่ในรูปปัจจุบันบางคนเรียกว่า Hasing, Encryption, or Masking/Redact ในโพสน์นี้เราจะทำการ Redact ข้อมูลแบบ One-way (เอาคืนกลับไม่ได้) และ Two-way (เราสามารถเรียกข้อมูลที่เป็น Orginal value ได้ อาจจะใช้กับปลายทางทีหลัง)

สำหรับที่ใครไม่รู้จักที่ข้างบนคืออะไรสามารถอ่านได้ตามลิ้งนี้
[AWS Glue Databrew คืออะไร?]
(https://aws.amazon.com/glue/features/databrew/)
[Common Technique มีอยู่กี่วิธี?]
(https://docs.aws.amazon.com/databrew/latest/dg/personal-information-protection.html)



## Table Of Contents
* [Architecture Diagram] (#arc)
* [Pre-requisites] (#pre)
* [Preparing dataset] (#load)
* [Build Transformation Receipt] (#build)
* [Obfuscation reversible] (#reverse)
* [Create Transformation job] (#job)
* [Query Result with Amazon Athena] (#athena)
* [Conclusion] (#conclusion)



### Architecture Diagram <a name="arc"></a>
![arc](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/19vskeq8n464w2x6oa0z.png)



### Pre-requisites <a name="pre"></a>
* AWS Account❗ 
* Data ที่จะใช้ ที่ใช้ทั้งหมดโหลดจาก [ที่นี่] (https://synthetichealth.github.io/synthea-sample-data/downloads/10k_synthea_covid19_csv.zip)
* พอ Download ข้อมูลเสร็จให้ unzip แล้วเอาเฉพาะ file patient.csv upload ขึ้น Amazon S3 ก่อนนะ




### Preparing dataset <a name="load"></a>
เราจะเข้าไปที่ AWS Glue Databrew console [ที่นี่](https://console.aws.amazon.com/databrew/home?region=us-east-1#landing)

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/wyfcw6a1cjysiamnkpkq.png)

ด้านซ้ายมือกด [Datasets](https://console.aws.amazon.com/databrew/home?region=us-east-1#datasets) เพื่อจะสร้าง Dataset สำหรับ Glue Databrew ก่อน 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/tlukia8aa3cgs4e9e087.png)

กด [Create new dataset](https://console.aws.amazon.com/databrew/home?region=us-east-1#create-dataset)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/s60ps64thufsqa2tawbd.png)

เลือก csv file มะกี้ที่ upload ไปซึ่งตัวอย่างข้อมูลอยู่ใน Amazon S3 แต่อาจเอาข้อมูลมาจาก Glue data catalog, Amazon Redshift, Appflow, or Snowflake ก็ได้ จากนั้นกด Create dataset
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6fao7lcm7d5lm592lvqu.png)


### Build Transformation Receipt <a name="build"></a>
ในหน้า Glue Databrew console กด [Create project](https://console.aws.amazon.com/databrew/home?region=us-east-1#create-project)

ตั้งชื่อ Project แล้วเลือก Dataset ที่เราสร้างเมื่อกี้แล้วกด Create project
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/e5o86gmuz4q0fb9gbze3.png)

เราสามารถกำหนดจำนวน Row sampling ได้ และเราต้องกำหนด IAM role เพื่อให้ Data brew สำหรับเข้าถึง Datastore นั้นๆได้เช่น Amazon S3
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/35xl2wtcvqngf4ztw25j.png)

AWS จะ provision Glue databrew node สำหรับในการสร้าง Receipt (Transformation step ที่จะใช้ Handling PII data)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/pwbnw2kd95pp3kbt78be.png)

เราจะมาลองทดสอบการใช้ Redaction function (Oneway ในการ masking ข้อมูลโดยที่เราจะไม่สามารถเอา orginal กลับมาได้) เราเลือก Data masking แล้วเลือก Technique Redaction 
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/qi3k843wyy750xfwot0s.png)

เราเลือก SSN column มาทดสอบในการทำ Redaction เรากำหนดได้ว่าจะ Redact กี่ค่าเช่น First N, Last N ในที่นี่เราเลือกเป็น full character
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/a83d4k5a6egrylevcswj.png)

เลือกเป็น Full string value, และ Apply กับทุก Rows
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1xt6oy7btx80xd1eafyr.png)

Glue DataBrew สามารถให้เราเข้าใจข้อมูลที่จะเปลี่ยนไปเทียบกับ Original value จริงผ่าน Preview feature (Nice!!)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6yotvzcpqb5vi3rq51h6.png)

หลังจาก Ok แล้วให้กด Apply สิ! เราจะเห็น receipt อยู่ด้านขวาก็คือชุด Transformation ที่ AWS Glue databrew จะรันให้เรานั่นเอง
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/gfzz4qfpix9nv8ey7m2o.png)

ทีนี้เรามาทดสอบการทำ obfuscation reversible ในบางกรณีแทนที่จะ masking. เราอาจต้องการแค่ encrypt column values เมื่อไหร่ก็ต้องที่เราอาจจะใช้ข้อมูลนั้น เราสามารถ decrypt เพื่อนำ orginal data กลับมา เราจะใช้ Deterministic encryption ในการทำการ encrypt columns first_name, last_name
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xuxi5c8ett55m0qvrnzo.png)


เลือก FIRST, LAST columns สำหรับ encryption
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/4cxwxz9zmpqge8w6rzb9.png)

เลือก Secret key สำหรับการทำ encryption โดย default เราจะมี databrew!default ใน secret manager เราสามารถใช้ของเราเองก็ได้ ในที่นี้จะใช้ค่า default
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/vqa9vr1hux3s4sr4akax.png)

เลือก Apply all rows, และ Full string
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xdr26koq5m33ndjp3rnn.png)

เราสามารถ Preview ได้ก่อนเพื่อเปรียบเทียบ
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/1iq5sx9kdbgqf7osh450.png)

กด Apply เราก็จะได้ผลลัพธ์ตามนี้
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/y6bos4dm2r7s5s1l9aks.png)

หลังจากนั้นให้เรากด Publish Receipt
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/8an6tlc5yzbvmxr6s3y9.png)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/g4a8sr2r9vu1xf69b9ls.png)



### Obfuscation reversible <a name="reverse"></a>
ในทางกลับกันถ้าเราต้องการ Decrypt ข้อมูลกลับไปใน Orginal format เราก็ใช้  Deterministic decryption โดยเลือก Secret key ตัวเดิมดังรูป เราจะได้ค่า FIRST กลับมาที่ Original format (Field ที่ highlight สีเหลือง)
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/q5aom48883tk9h1b0pjp.png)


### Create Transformation job <a name="job"></a>
ถัดมาเราจะสร้าง Transformation job จาก Databrew receipt กดสร้าง [Create job](https://console.aws.amazon.com/databrew/home?region=us-east-1#create-job?type=recipe)

ตั้งชื่อ Job และเลือก Receipt ที่สร้างมะกี้
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/yh9phwjc6bboy6jkws7f.png)

เลือก Output to Amazon S3 กด Create and Run job
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/xy97ofc9h5k415hw39so.png)

เราจะเห็น Glue DataBrew job running
![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/lvykzeujbvaxcg1onf73.png)

ไปสร้าง Table ใน [Athena](https://aws.amazon.com/athena/?nc1=h_ls&whats-new-cards.sort-by=item.additionalFields.postDateTime&whats-new-cards.sort-order=desc) รอเลย!


### Query Result with Amazon Athena <a name="athena"></a>

สร้าง Athena table แล้วทดสอบ Query
```sql
CREATE EXTERNAL TABLE patient_masked_encrypted_data (
   `id` string, 
  `birthdate` date, 
  `deathdate` date, 
  `ssn` string, 
  `drivers` string, 
  `passport` string, 
  `prefix` string, 
  `first` string, 
  `last` string, 
  `suffix` string, 
  `maiden` string, 
  `marital` string, 
  `race` string, 
  `ethnicity` string, 
  `gender` string, 
  `birthplace` string, 
  `address` string, 
  `city` string, 
  `state` string, 
  `county` string, 
  `zip` int, 
  `lat` double, 
  `lon` double, 
  `healthcare_expenses` double, 
  `healthcare_coverage` double 
)
STORED AS PARQUET
LOCATION 's3://<YOUR_S3_BUCKET>/cleaned_data_output/'
```

![Image description](https://dev-to-uploads.s3.amazonaws.com/uploads/articles/6z31ca0l597zvls98677.png)

ข้อมูลถูก masking, or encryption จาก Athena query เรียบร้อย


### ✅ Conclusion  <a name="conclusion"></a>
จบแล้ว! AWS Glue DataBrew สามารถ integrated ร่วมกับ AWS Services ตัวอืื่นในการทำ automation pipelines ได้ในการทำ obfuscate the PII data เช่น AWS Managed Apache Airflow หรือ Step function เยี่ยม! AWS Glue DataBrew เป็น serverless no code data prep เราสามารถ Scale out ตามขนาดข้อมูลที่เราต้องการได้แล้วอีกอย่างคือ [Pay per use model](https://aws.amazon.com/glue/pricing/?nc1=h_ls) จ่ายเท่าที่ใช้ Technical blog [สำหรับภาคภาษาอังกฤษอ่านได้ที่นี่](https://aws.amazon.com/blogs/big-data/introducing-pii-data-identification-and-handling-using-aws-glue-databrew/)

![good_stuff](https://i.pinimg.com/originals/88/71/3c/88713c217a98cac0d46781b38f11c019.gif)