

# 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 ジョブで 2 つの API を提供します。これらは、`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")
```

 AWS マネージド PII タイプとカスタムエンティティタイプを識別するには、`detect()` API を使用できます。検出結果が含まれる新しい列が自動的に作成されます。`classifyColumns()` API は、キーが列名で値が検出されたエンティティタイプのリストになっているマップを返します。`SampleFraction` は、PII エンティティをスキャンしているときにサンプリングするためのデータの割合を示し、`ThresholdFraction` は、列が PII データとして識別されるために満たされる必要があるデータの割合を示します。

### 行レベルの検出
<a name="w2aac67c11c24c19b9c11"></a>

 この例では、ジョブが `detect()` と `classifyColumns()` API を使用して以下のアクションを実行しています。
+  Amazon S3 バケットからデータを読み込み、dynamicFrame に変換する 
+  dynamicFrame 内にある「Email」と「Credit Card」のインスタンスを検出する 
+  元の値と、各行の検出結果が網羅された 1 つの列が含まれる dynamicFrame を返す 
+  返された dynamicFrame を別の Amazon S3 パスに書き込む 

```
  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\$1PTIN」、「BANK\$1ACCOUNT]、「USA\$1SSN」、「USA\$1PASSPORT\$1NUMBER」、および「PHONE\$1NUMBER」の機密データタイプの検出 
+  変更およびマスキングされた値と、各行の検出結果が網羅された 1 つの列が含まれる dynamicFrame を返す 
+  返された dynamicFrame を別の Amazon S3 パスに書き込む 

 上記の `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% にある場合に検出済みとしてマークするとともに、感度が [低] になるようにパラメータを設定します 
+  キーが列名、値が検出されたエンティティタイプのリストであるマップを返します 
+  返された dynamicFrame を別の Amazon S3 パスに書き込む 

```
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` のリストに追加する必要があります。

 データ内に特定の機密データタイプ (「Employee Id」など) がある場合は、`CreateCustomEntityType()` API を呼び出してカスタムエンティティを作成することができます。以下の例では、リクエストパラメータを使用して `CreateCustomEntityType()` API にカスタムエンティティタイプ「EMPLOYEE\$1ID」を定義します。

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

 次に、カスタムエンティティタイプ (EMPLOYEE\$1ID) を`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`、オプション: [低] または [高]、デフォルト: [低]) 検出プロセスの感度を指定します。有効なオプションは [低] または [高] です。指定しない場合、デフォルトの感度は [低] に設定されます。

 `outputColumnName` の設定: 

 検出されたエンティティが保存される列の名前。指定しない場合、デフォルトの列名は「DetectedEntities」となります。出力列の各行について、補足列には、次の key-value ペアを含む、検出されたエンティティメタデータに対する列名のマップが含まれます。
+  **entityType** – 検出されたエンティティタイプ。
+  **start** – 元のデータ内の検出されたエンティティの開始場所。
+  **end** – 元のデータ内の検出されたエンティティの終了場所。
+  **actionUsed** – 検出されたエンティティに対して実行されたアクション (例:「DETECT」、「REDACT」、「PARTIAL\$1REDACT」、「SHA256\$1HASH」)。

 例: 

```
{
   "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`、オプション: [低] または [高]、デフォルト: [低]): 検出プロセスの感度を指定します。有効なオプションは [低] または [高] です。指定しない場合、デフォルトの感度は [低] に設定されます。

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

 設定が含まれていない場合は、デフォルト値が使用されます。
+  **action** – (タイプ: `String`、オプション:「DETECT」、「REDACT」、「PARTIAL\$1REDACT」、「SHA256\$1HASH」) エンティティに対して実行するアクションを指定します。必須。マスキングを実行するアクション (「DETECT」を除くすべて) は、列ごとに 1 つのアクションしか実行できないことに留意してください。これは、合体したエンティティをマスキングするための予防措置です。
+  **sourceColumns** – (タイプ: `List[String]`、デフォルト: [“\$1”]) エンティティの検出を実行するソース列名のリスト。存在しない場合は、デフォルトで [“\$1”] に設定されます。無効な列名が使用された場合に `IllegalArgumentException` を発生させます。
+  **sourceColumnsToExclude** – (タイプ: `List[String]`) エンティティの検出を実行するソース列名のリスト。`sourceColumns` または `sourceColumnsToExclude` のいずれかを使用します。無効な列名が使用された場合に `IllegalArgumentException` を発生させます。
+  **actionOptions** – 指定されたアクションに基づく追加オプション: 
  +  「DETECT」および「SHA256\$1HASH」の場合、いかなるオプションも使用できません。
  +  「REDACT」の場合: 
    + **redactText** – (タイプ: `String`、デフォルト:「\$1\$1\$1\$1\$1」) 検出されたエンティティを置き換えるテキスト。
  +  「PARTIAL\$1REDACT」の場合: 
    +  **redactChar** – (タイプ: `String`、デフォルト:「\$1」) エンティティ内で検出された各文字を置き換える文字。
    +  **matchPattern** – (タイプ: `String`) 部分的なマスキングの正規表現パターン。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`、オプション: [低] または [高]、デフォルト: [低]) 検出プロセスの感度を指定します。有効なオプションは [低] または [高] です。指定しない場合、デフォルトの感度は [低] に設定されます。