

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 在 AWS Glue Studio 外部使用敏感資料偵測
<a name="aws-glue-api-sensitive-data-example"></a>

 AWS Glue Studio 可讓您偵測敏感資料，但您也可以在 AWS Glue Studio 外部使用敏感資料偵測功能。

 如需受管敏感資料類型的完整清單，請參閱 [Managed data types](https://docs.aws.amazon.com/glue/latest/dg/sensitive-data-managed-data-types.html)。

## 使用 AWS 受管 PII 類型偵測敏感資料
<a name="sensitive-data-managed-pii-types"></a>

 AWS Glue 在 AWS Glue ETL 任務中提供兩個 APIs。它們是 `detect()` 和 `classifyColumns()`：

```
  detect(frame: DynamicFrame, 
      entityTypesToDetect: Seq[String], 
      outputColumnName: String = "DetectedEntities",
      detectionSensitivity: String = "LOW"): DynamicFrame

 detect(frame: DynamicFrame, 
      detectionParameters: JsonOptions,
      outputColumnName: String = "DetectedEntities",
      detectionSensitivity: String = "LOW"): DynamicFrame
      
  classifyColumns(frame: DynamicFrame, 
      entityTypesToDetect: Seq[String], 
      sampleFraction: Double = 0.1, 
      thresholdFraction: Double = 0.1,
      detectionSensitivity: String = "LOW")
```

 您可以使用 `detect()` API 來識別 AWS 受管 PII 類型和自訂實體類型。系統會自動建立包含偵測結果的新欄。該 `classifyColumns()` API 傳回一個映射，其中索引鍵是資料欄名稱，值是偵測到的實體類型的清單。`SampleFraction` 指示掃描 PII 實體時要採樣的資料部分，而 `ThresholdFraction` 指示為了將資料欄標識為 PII 資料而必須滿足的資料部分。

### 資料列層級偵測
<a name="w2aac67c11c24c19b9c11"></a>

 在此範例中，任務正在使用 `detect()` 和 `classifyColumns()` API 執行下列動作：
+  從 儲存 Amazon S3 貯體讀取資料，並將其轉換為 dynamicFrame 
+  偵測 dynamicFrame 中的 "Email" 和 "Credit Card" 執行個體 
+  傳回具有原始值的 dynamicFrame 外加一個資料欄，其中包含每列的偵測結果 
+  在另一個 Amazon S3 路徑中寫入傳回的 dynamicFrame 

```
  import com.amazonaws.services.glue.GlueContext
  import com.amazonaws.services.glue.MappingSpec
  import com.amazonaws.services.glue.errors.CallSite
  import com.amazonaws.services.glue.util.GlueArgParser
  import com.amazonaws.services.glue.util.Job
  import com.amazonaws.services.glue.util.JsonOptions
  import org.apache.spark.SparkContext
  import scala.collection.JavaConverters._
  import com.amazonaws.services.glue.ml.EntityDetector
  
  object GlueApp {
    def main(sysArgs: Array[String]) {
      val spark: SparkContext = new SparkContext()
      val glueContext: GlueContext = new GlueContext(spark)
      val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
      Job.init(args("JOB_NAME"), glueContext, args.asJava)
      val frame= glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node1650160158526").getDynamicFrame()
  
      val frameWithDetectedPII = EntityDetector.detect(frame, Seq("EMAIL", "CREDIT_CARD"))
  
      glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(frameWithDetectedPII)
  
      Job.commit()
    }
  }
```

### 具有微調動作的資料列層級偵測
<a name="w2aac67c11c24c19b9c15"></a>

 在此範例中，任務正在使用 `detect()` API 執行下列動作：
+  從 Amazon S3 儲存貯體中讀取資料，並將其轉換為 DynamicFrame 
+  偵測 DynamicFrame 中的敏感資料類型 “USA\_PTIN”、“ BANK\_ACCOUNT”、“USA\_SSN”、“USA\_PASSPORT\_NUMBER” 及 “PHONE\_NUMBER” 
+  傳回具有修改遮罩值的 dynamicFrame 與一個資料欄，其中包含每列的偵測結果 
+  在其他 Amazon S3 路徑中寫入傳回的 DynamicFrame 

 與上述 `detect()` API 相反，這會針對要偵測的實體類型使用微調動作。如需詳細資訊，請參閱[使用 `detect()` 的偵測參數](#sensitive-data-detect-parameters-fine-grained-actions)。

```
import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import org.apache.spark.SparkContext
import scala.collection.JavaConverters._
import com.amazonaws.services.glue.ml.EntityDetector

object GlueApp {
  def main(sysArgs: Array[String]) {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)
    val frame = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node_source").getDynamicFrame()

    val detectionParameters = JsonOptions(
      """
        {
          "USA_DRIVING_LICENSE": [{
            "action": "PARTIAL_REDACT",
            "sourceColumns": ["Driving License"],
            "actionOptions": {
              "matchPattern": "[0-9]",
              "redactChar": "*"
            }
          }],
          "BANK_ACCOUNT": [{
            "action": "DETECT",
            "sourceColumns": ["*"]
          }],
          "USA_SSN": [{
            "action": "SHA256_HASH",
            "sourceColumns": ["SSN"]
          }],
          "IP_ADDRESS": [{
            "action": "REDACT",
            "sourceColumns": ["IP Address"],
            "actionOptions": {"redactText": "*****"}
          }],
          "PHONE_NUMBER": [{
            "action": "PARTIAL_REDACT",
            "sourceColumns": ["Phone Number"],
            "actionOptions": {
              "numLeftCharsToExclude": 1,
              "numRightCharsToExclude": 0,
              "redactChar": "*"
            }
          }]
        }
      """
    )

    val frameWithDetectedPII = EntityDetector.detect(frame, detectionParameters, "DetectedEntities", "HIGH")

    glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="AmazonS3_node_target", format="json").writeDynamicFrame(frameWithDetectedPII)

    Job.commit()
  }
}
```

### 資料欄層級偵測
<a name="w2aac67c11c24c19b9c19"></a>

 在此範例中，任務正在使用 `classifyColumns()` API 執行下列動作：
+  從 Amazon S3 儲存貯體中讀取資料，並將其轉換為 DynamicFrame 
+  偵測 dynamicFrame 中的 "Email" 和 "Credit Card" 執行個體 
+  設定參數以對資料欄進行 100% 取樣，且如果實體位於 10% 的儲存格中，並設定為 "LOW" 敏感度，則標示為已偵測。
+  傳回一個對應，其中金鑰為資料欄名稱，而值為偵測到的實體類型清單 
+  在其他 Amazon S3 路徑中寫入傳回的 DynamicFrame 

```
import com.amazonaws.services.glue.GlueContext
import com.amazonaws.services.glue.MappingSpec
import com.amazonaws.services.glue.errors.CallSite
import com.amazonaws.services.glue.util.GlueArgParser
import com.amazonaws.services.glue.util.Job
import com.amazonaws.services.glue.util.JsonOptions
import org.apache.spark.SparkContext
import scala.collection.JavaConverters._
import com.amazonaws.services.glue.DynamicFrame
import com.amazonaws.services.glue.ml.EntityDetector

object GlueApp {
  def main(sysArgs: Array[String]) {
    val spark: SparkContext = new SparkContext()
    val glueContext: GlueContext = new GlueContext(spark)
    val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
    Job.init(args("JOB_NAME"), glueContext, args.asJava)
    val frame = glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ",", "optimizePerformance": false}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="frame").getDynamicFrame()
    
    import glueContext.sparkSession.implicits._

    val detectedDataFrame = EntityDetector.classifyColumns(
        frame, 
        entityTypesToDetect = Seq("CREDIT_CARD", "PHONE_NUMBER"), 
        sampleFraction = 1.0, 
        thresholdFraction = 0.1,
        detectionSensitivity = "LOW"
    )
    val detectedDF = (detectedDataFrame).toSeq.toDF("columnName", "entityTypes")
    val DetectSensitiveData_node = DynamicFrame(detectedDF, glueContext)

    glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(DetectSensitiveData_node)

    Job.commit()
  }
}
```

## 使用 AWS CustomEntityType PII 類型偵測敏感資料
<a name="sensitive-data-custom-entity-PII-types"></a>

 您可以透過 AWS Studio 定義自訂實體。不過，若要在 AWS Studio 之外使用此功能，您必須先定義自訂實體類型，然後將定義的自訂實體類型新增至 清單`entityTypesToDetect`。

 如果您的資料中有特定敏感資料類型 (例如「員工識別碼」)，您可以呼叫 `CreateCustomEntityType()` API 來建立自訂實體。下列範例使用請求參數為 `CreateCustomEntityType()` API 定義自訂實體類型 EMPLOYEE\_ID：

```
  { 
      "name": "EMPLOYEE_ID",
      "regexString": "\d{4}-\d{3}",
      "contextWords": ["employee"]
  }
```

 然後，將自訂實體類型 (EMPLOYE\_ID) 新增至 `EntityDetector()` API，來修改任務以使用新的自訂敏感資料類型：

```
  import com.amazonaws.services.glue.GlueContext
  import com.amazonaws.services.glue.MappingSpec
  import com.amazonaws.services.glue.errors.CallSite
  import com.amazonaws.services.glue.util.GlueArgParser
  import com.amazonaws.services.glue.util.Job
  import com.amazonaws.services.glue.util.JsonOptions
  import org.apache.spark.SparkContext
  import scala.collection.JavaConverters._
  import com.amazonaws.services.glue.ml.EntityDetector
  
  object GlueApp {
    def main(sysArgs: Array[String]) {
      val spark: SparkContext = new SparkContext()
      val glueContext: GlueContext = new GlueContext(spark)
      val args = GlueArgParser.getResolvedOptions(sysArgs, Seq("JOB_NAME").toArray)
      Job.init(args("JOB_NAME"), glueContext, args.asJava)
      val frame= glueContext.getSourceWithFormat(formatOptions=JsonOptions("""{"quoteChar": "\"", "withHeader": true, "separator": ","}"""), connectionType="s3", format="csv", options=JsonOptions("""{"paths": ["s3://pathToSource"], "recurse": true}"""), transformationContext="AmazonS3_node1650160158526").getDynamicFrame()
  
      val frameWithDetectedPII = EntityDetector.detect(frame, Seq("EMAIL", "CREDIT_CARD", "EMPLOYEE_ID"))
  
      glueContext.getSinkWithFormat(connectionType="s3", options=JsonOptions("""{"path": "s3://pathToOutput/", "partitionKeys": []}"""), transformationContext="someCtx", format="json").writeDynamicFrame(frameWithDetectedPII)
  
      Job.commit()
    }
  }
```

**注意**  
 如果使用與現有受管實體類型相同的名稱來定義自訂敏感資料類型，則自訂敏感資料類型將優先，並覆寫受管實體類型的邏輯。

## 使用 `detect()` 的偵測參數
<a name="sensitive-data-detect-parameters-fine-grained-actions"></a>

 此方法用於偵測 DynamicFrame 中的實體。此方法會傳回新的 DataFrame，其中包含原始值和具有 PII 偵測中繼資料的其他資料欄 outputColumnName。當此 DynamicFrame 在 AWS Glue 指令碼內傳回後，即可進行自訂遮罩，或可改用具有微調動作 API 的 detect()。

```
detect(frame: DynamicFrame, 
       entityTypesToDetect: Seq[String], 
       outputColumnName: String = "DetectedEntities",
       detectionSensitivity: String = "LOW"): DynamicFrame
```

 參數：
+  **frame**：(類型：`DynamicFrame`) 包含要處理之資料的輸入 DynamicFrame。
+  **entityTypesToDetect**：(類型：`[Seq[String]`) 要偵測的實體類型清單。可以是受管實體類型或自訂實體類型。
+  **outputColumnName**：(類型：`String`，預設："DetectedEntities") 資料欄的名稱，其中偵測到的實體將會受到儲存。如果未提供，則預設資料欄名稱為 "DetectedEntities"。
+  **detectionSensitivity**：(類型：`String`，選項："LOW" 或 "HIGH"，預設："LOW") 指定偵測程序的敏感度。有效選項為 "LOW" 或 "HIGH"。如果未提供，則預設敏感度會設定為 "LOW"。

 `outputColumnName` 設定：

 資料欄的名稱，其中偵測到的實體將會受到儲存。如果未提供，則預設資料欄名稱為 "DetectedEntities"。針對輸出資料欄中的每一列，補充資料欄會包含資料欄名稱至偵測到之實體中繼資料的對應，其中包含下列鍵值組：
+  **entityType**：偵測到的實體類型。
+  **start**：原始資料中偵測到的實體起始位置。
+  **start**：原始資料中偵測到的實體結束位置。
+  **actionUsed**：執行於偵測到之實體的動作 (例如，"DETECT"、"REDACT"、"PARTIAL\_REDACT"、"SHA256\_HASH")。

 範例：

```
{
   "DetectedEntities":{
      "SSN Col":[
         {
            "entityType":"USA_SSN",
            "actionUsed":"DETECT",
            "start":4,
            "end":15
         }
      ],
      "Random Data col":[
         {
            "entityType":"BANK_ACCOUNT",
            "actionUsed":"PARTIAL_REDACT",
            "start":4,
            "end":13
         },
         {
            "entityType":"IP_ADDRESS",
            "actionUsed":"REDACT",
            "start":4,
            "end":13
         }
      ]
   }
}
```

 **具有微調動作之 `detect()` 的偵測參數** 

 此方法用於偵測使用指定參數之 DynamicFrame 中的實體。此方法會傳回新的 DataFrame，其中包含取代為遮罩敏感資料的原始值和具有 PII 偵測中繼資料的其他資料欄 `outputColumnName`。

```
detect(frame: DynamicFrame, 
       detectionParameters: JsonOptions,
       outputColumnName: String = "DetectedEntities",
       detectionSensitivity: String = "LOW"): DynamicFrame
```

 參數：
+  **frame**：(類型：`DynamicFrame`) 包含要處理之資料的輸入 DynamicFrame。
+  **detectionParameters**：(類型 `JsonOptions`) 針對偵測程序指定參數的 JSON 選項。
+  **outputColumnName**：(類型：`String`，預設："DetectedEntities") 資料欄的名稱，其中偵測到的實體將會受到儲存。如果未提供，則預設資料欄名稱為 "DetectedEntities"。
+  **detectionSensitivity**：(類型：`String`，選項："LOW" 或 "HIGH"，預設："LOW") 指定偵測程序的敏感度。有效選項為 "LOW" 或 "HIGH"。如果未提供，則預設敏感度會設定為 "LOW"。

<a name="detection-parameters-settings"></a> `detectionParameters` 設定 

 如果未包含任何設定，則會使用預設值。
+  **action**：(類型：`String`，選項："DETECT"、"REDACT"、"PARTIAL\_REDACT"、"SHA256\_HASH") 指定要在實體中執行的動作。必要. 請注意，執行遮罩的動作 (除了 "DETECT" 以外的所有動作) 僅可在每個資料欄執行一個動作。此為遮罩合併實體的預防措施。
+  **sourceColumns**：(類型：`List[String]`，預設：[“\*”]) 針對實體要執行偵測的來源資料欄名稱清單。如果不存在，則會預設為 [“\*”]。如果使用無效的資料欄名稱，則會引發 `IllegalArgumentException`。
+  **sourceColumnsToExclude**：(類型：`List[String]`) 針對實體要執行偵測的來源資料欄名稱清單。使用 `sourceColumns` 或 `sourceColumnsToExclude`。如果使用無效的資料欄名稱，則會引發 `IllegalArgumentException`。
+  **actionOptions**：根據指定動作的其他選項：
  +  如為 "DETECT" 和 "SHA256\_HASH"，則不允許任何選項。
  +  如為 "REDACT"：
    + **redactText**：(類型：`String`，預設值："\*\*\*\*\*") 用來取代偵測到之實體的文字。
  +  如為 "PARTIAL\_REDACT"：
    +  **redactChar**：(類型：`String`，預設："\*") 用於取代實體中每個偵測到之字元的字元。
    +  **matchPattern**：(類型：`String`) 適用於部分遮蔽的 Regex 模式。無法與 numLeftCharsToExclude 或 `numRightCharsToExclude` 結合。
    +  **numLeftCharsToExclude**：(類型：`String, integer`) 要排除的左側字元數。無法與 matchPattern 結合，但可搭配 `numRightCharsToExclude` 使用。
    +  **numRightCharsToExclude**：(類型：`String, integer`) 要排除的右側字元數。無法與 matchPattern 結合，但可搭配 `numRightCharsToExclude` 使用。

 `outputColumnName` 設定 

 [請參閱 outputColumnName 設定](#sensitive-data-detect-parameters-fine-grained-actions) 

## 適用於 `classifyColumns()` 的偵測參數
<a name="detection-parameters-classifycolumns"></a>

 此方法用於偵測 DynamicFrame 中的實體。此方法會傳回一個對應，其中金鑰為資料欄名稱，而值為偵測到的實體類型清單。當其在 AWS Glue 指令碼內傳回後，即可進行自訂遮罩。

```
classifyColumns(frame: DynamicFrame, 
                entityTypesToDetect: Seq[String], 
                sampleFraction: Double = 0.1, 
                thresholdFraction: Double = 0.1,
                detectionSensitivity: String = "LOW")
```

 參數：
+  **frame**：(類型：`DynamicFrame`) 包含要處理之資料的輸入 DynamicFrame。
+  **entityTypesToDetect**：(類型：`Seq[String]`) 要偵測的實體類型清單。可以是受管實體類型或自訂實體類型。
+  **sampleFraction**：(類型：`Double`，預設：10%) 掃描 PII 實體時，要取樣的資料部分。
+  **thresholdFraction**：(類型：`Double`，預設：10%) 為使資料欄經識別為 PII 資料，必須符合的資料部分。
+  **detectionSensitivity**：(類型：`String`，選項："LOW" 或 "HIGH"，預設："LOW") 指定偵測程序的敏感度。有效選項為 "LOW" 或 "HIGH"。如果未提供，則預設敏感度會設定為 "LOW"。