참고
세분화된 동작은 AWS Glue 3.0 및 4.0에서만 사용할 수 있습니다. 여기에는 AWS Glue Studio 경험도 포함됩니다. 2.0에서는 영구 감사 로그 변경도 사용할 수 없습니다.
모든 AWS Glue Studio 3.0 및 4.0 비주얼 작업에는 세분화된 작업 API를 자동으로 사용하는 스크립트가 생성됩니다.
민감 데이터 탐지 변환은 사용자가 정의하거나 AWS Glue에서 사전 정의한 엔터티를 탐지, 마스크 또는 제거하는 기능을 제공합니다. 또한 세분화된 액션을 통해 엔터티별로 특정 액션을 적용할 수 있습니다. 추가 혜택은 다음과 같습니다.
-
데이터가 감지되는 즉시 조치가 적용되므로 성능이 개선되었습니다.
-
특정 열을 포함하거나 제외하는 옵션.
-
부분 마스킹을 사용할 수 있습니다. 이렇게 하면 전체 문자열을 마스킹하는 대신 감지된 민감한 데이터 엔터티를 부분적으로 마스킹할 수 있습니다. 오프셋과 정규식이 있는 단순 매개 변수가 모두 지원됩니다.
다음은 다음 섹션에서 참조할 샘플 작업에 사용되는 민감한 데이터 탐지 API와 세분화된 조치의 코드 스니펫입니다.
Detect API- 세분화된 작업에는 새 detectionParameters
파라미터가 사용됩니다.
def detect(
frame: DynamicFrame,
detectionParameters: JsonOptions,
outputColumnName: String = "DetectedEntities",
detectionSensitivity: String = "LOW"
): DynamicFrame = {}
민감한 데이터 탐지 API와 세밀한 조치 사용
detect를 사용하는 민감한 데이터 탐지 API는 제공된 데이터를 분석하고, 행 또는 열이 민감한 데이터 항목 유형인지 확인하고 각 엔터티 유형에 대해 사용자가 지정한 작업을 실행합니다.
탐지 API를 사용하여 세부적인 조치를 취하십시오
detect API를 사용하고 outputColumnName
및
detectionParameters
를 지정합니다.
object GlueApp {
def main(sysArgs: Array[String]) {
val spark: SparkContext = new SparkContext()
val glueContext: GlueContext = new GlueContext(spark)
// @params: [JOB_NAME]
val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
Job.init(args("JOB_NAME"), glueContext, args.asJava)
// Script generated for node S3 bucket. Creates DataFrame from data stored in S3.
val S3bucket_node1 = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ",", "optimizePerformance": false}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://189657479688-ddevansh-pii-test-bucket/tiny_pii.csv"], "recurse": true}"""), transformationContext="S3bucket_node1").getDynamicFrame()
// Script generated for node Detect Sensitive Data. Will run detect API for the DataFrame
// detectionParameter contains information on which EntityType are being detected
// and what actions are being applied to them when detected.
val DetectSensitiveData_node2 = EntityDetector.detect(
frame = S3bucket_node1,
detectionParameters = JsonOptions(
"""
{
"PHONE_NUMBER": [
{
"action": "PARTIAL_REDACT",
"actionOptions": {
"numLeftCharsToExclude": "3",
"numRightCharsToExclude": "4",
"redactChar": "#"
},
"sourceColumnsToExclude": [ "Passport No", "DL NO#" ]
}
],
"USA_PASSPORT_NUMBER": [
{
"action": "SHA256_HASH",
"sourceColumns": [ "Passport No" ]
}
],
"USA_DRIVING_LICENSE": [
{
"action": "REDACT",
"actionOptions": {
"redactText": "USA_DL"
},
"sourceColumns": [ "DL NO#" ]
}
]
}
"""
),
outputColumnName = "DetectedEntities"
)
// Script generated for node S3 bucket. Store Results of detect to S3 location
val S3bucket_node3 = glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://189657479688-ddevansh-pii-test-bucket/test-output/", "partitionKeys": []}"""), transformationContext="S3bucket_node3", format="json").writeDynamicFrame(DetectSensitiveData_node2)
Job.commit()
}
위 스크립트는 Amazon S3의 위치에서 DataFrame을 생성한 다음 detect
API를 실행합니다. detect
API는 Glue 객체로 표시되는 필드 detectionParameters
(해당 엔터티에 사용할 모든 작업 설정을 나열하는 엔터티 이름 맵)를 AWS Glue의 JsonOptions
객체로 표시해야 하므로 API의 기능을 확장할 수도 있습니다.
엔터티별로 지정된 각 작업에 대해 엔터티/액션 조합을 적용할 모든 열 이름 목록을 입력합니다. 이렇게 하면 데이터 세트의 모든 열을 감지하도록 항목을 사용자 지정하고 특정 열에 없는 것으로 알려진 항목은 건너뛸 수 있습니다. 또한 이러한 엔터티에 대해 불필요한 탐지 호출을 수행하지 않아도 되므로 작업 성능이 향상되고 각 열과 엔터티 조합에 고유한 작업을 수행할 수 있습니다.
detectionParameters
를 자세히 살펴보면 샘플 작업에는 세 가지 엔터티 유형이 있습니다. Phone Number
, USA_PASSPORT_NUMBER
, USA_DRIVING_LICENSE
입니다. 이 같은 각 개체 유형에 대해 AWS Glue는 PARTIAL_REDACT
, SHA256_HASH
, REDACT
, DETECT
같은 서로 다른 작업을 실행합니다. 각 개체 유형도 sourceColumns
에 적용하거나 탐지된 경우 sourceColumnsToExclude
에 적용해야 합니다.
참고
열당 내부 편집 작업(PARTIAL_REDACT
, SHA256_HASH
, 또는REDACT
) 하나만 사용할 수 있지만 해당 DETECT
작업은 이러한 모든 작업에 사용할 수 있습니다.
detectionParameters
필드 레이아웃은 다음과 같습니다.
ENTITY_NAME -> List[Actions]
{
"ENTITY_NAME": [{
Action, // required
ColumnSpecs,
ActionOptionsMap
}],
"ENTITY_NAME2": [{
...
}]
}
actions
및 actionOptions
의 유형은 다음과 같습니다.
DETECT
{
# Required
"action": "DETECT",
# Optional, depending on action chosen
"actionOptions": {
// There are no actionOptions for DETECT
},
# 1 of below required, both can also used
"sourceColumns": [
"COL_1", "COL_2", ..., "COL_N"
],
"sourceColumnsToExclude": [
"COL_5"
]
}
SHA256_HASH
{
# Required
"action": "SHA256_HASH",
# Required or optional, depending on action chosen
"actionOptions": {
// There are no actionOptions for SHA256_HASH
},
# 1 of below required, both can also used
"sourceColumns": [
"COL_1", "COL_2", ..., "COL_N"
],
"sourceColumnsToExclude": [
"COL_5"
]
}
REDACT
{
# Required
"action": "REDACT",
# Required or optional, depending on action chosen
"actionOptions": {
// The text that is being replaced
"redactText": "USA_DL"
},
# 1 of below required, both can also used
"sourceColumns": [
"COL_1", "COL_2", ..., "COL_N"
],
"sourceColumnsToExclude": [
"COL_5"
]
}
PARTIAL_REDACT
{
# Required
"action": "PARTIAL_REDACT",
# Required or optional, depending on action chosen
"actionOptions": {
// number of characters to not redact from the left side
"numLeftCharsToExclude": "3",
// number of characters to not redact from the right side
"numRightCharsToExclude": "4",
// the partial redact will be made with this redacted character
"redactChar": "#",
// regex pattern for partial redaction
"matchPattern": "[0-9]"
},
# 1 of below required, both can also used
"sourceColumns": [
"COL_1", "COL_2", ..., "COL_N"
],
"sourceColumnsToExclude": [
"COL_5"
]
}
스크립트가 실행되면 결과가 지정된 Amazon S3 위치에 출력됩니다. Amazon S3에서 데이터를 볼 수 있지만 선택한 엔터티 유형은 선택한 작업에 따라 구분됩니다. 이 경우 다음과 같은 행이 있을 것입니다.
{
"Name": "Colby Schuster",
"Address": "39041 Antonietta Vista, South Rodgerside, Nebraska 24151",
"Car Owned": "Fiat",
"Email": "Kitty46@gmail.com",
"Company": "O'Reilly Group",
"Job Title": "Dynamic Functionality Facilitator",
"ITIN": "991-22-2906",
"Username": "Cassandre.Kub43",
"SSN": "914-22-2906",
"DOB": "2020-08-27",
"Phone Number": "1-2#######1718",
"Bank Account No": "69741187",
"Credit Card Number": "6441-6289-6867-2162-2711",
"Passport No": "94f311e93a623c72ccb6fc46cf5f5b0265ccb42c517498a0f27fd4c43b47111e",
"DL NO#": "USA_DL"
}
위 스크립트에서는 Phone Number
를 사용하여 부분적으로 #
으로 수정되었습니다. Passport No
가 SHA256 해시로 변경되었습니다. DL NO#
는 미국 운전면허증 번호로 인식되어 detectionParameters
에 명시된 대로 “USA_DL”로 수정되었습니다.
참고
classifyColumns API는 API의 특성상 세분화된 작업에는 사용할 수 없습니다. 이 API는 열 샘플링(사용자가 조정 가능하지만 기본값 사용)을 수행하여 탐지를 더 빠르게 수행합니다. 이러한 이유로 세밀한 작업을 수행하려면 모든 값을 반복해야 합니다.
영구 감사 로그
세분화된 작업과 함께 도입된 새로운 기능(일반 API를 사용할 때도 사용 가능)은 영구 감사 로그의 존재입니다. 현재 detect API를 실행하면 PII 탐지 메타데이터가 포함된 추가 열(DetectedEntities
가 기본값이지만 outputColumnName
을 통해 사용자 지정 가능) 매개변수가 추가됩니다. 이제 여기에는,DETECT
, PARTIAL_REDACT
, SHA256_HASH
, REDACT
중 하나인 “actionUsed” 메타데이터 키가 있습니다.
"DetectedEntities": {
"Credit Card Number": [
{
"entityType": "CREDIT_CARD",
"actionUsed": "DETECT",
"start": 0,
"end": 19
}
],
"Phone Number": [
{
"entityType": "PHONE_NUMBER",
"actionUsed": "REDACT",
"start": 0,
"end": 14
}
]
}
예를 들어 detect(entityTypesToDetect, outputColumnName)
와 같이 세밀한 조치 없이 API를 사용하는 고객도 결과 데이터 프레임에서 이 영구 감사 로그를 볼 수 있습니다.
세분화된 조치가 포함된 API를 사용하는 고객은 수정 여부에 관계없이 모든 작업을 볼 수 있습니다. 예시
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Credit Card Number | Phone Number | DetectedEntities |
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| 622126741306XXXX | +12#####7890 | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":16}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":12}]}} |
| 6221 2674 1306 XXXX | +12#######7890 | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":19}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":14}]}} |
| 6221-2674-1306-XXXX | 22#######7890 | {"Credit Card Number":[{"entityType":"CREDIT_CARD","actionUsed":"PARTIAL_REDACT","start":0,"end":19}],"Phone Number":[{"entityType":"PHONE_NUMBER","actionUsed":"PARTIAL_REDACT","start":0,"end":14}]}} |
+---------------------+----------------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
DetectedEntities 열을 보지 않으려면 사용자 지정 스크립트에 추가 열을 놓기만 하면 됩니다.