AWS Glue StudioでPIIデータをSHA-256でハッシュ化してみた

2023.05.05

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

データアナリティクス事業本部の鈴木です。

AWS Glueでは、データソース内の個人識別情報を識別して処理を行うことができます。

DevelopersIOでも過去に以下のような記事でこの機能が紹介されていました。

今回は改めて自分でも試してみて、特にまだ検証記事がなかったApply cryptographic hashを使った対処方法を選択した際の結果をご紹介します。

やりたいこと

以下のようにGlue StudioからGlue Jobを作成して、あるS3にある個人情報を含むデータを読み込み、別のS3に該当の情報をSHA-256でハッシュ化して出力したいです。

作成したいGlue Job

機密データ検出の対象となるデータタイプは、以下のGlueのデベロッパーガイドに記載がありました。

AWS GlueのPIIを識別する機能はETLパイプライン内で検出とマスクを行いたい場合に利用できます。検出したいパターンをカタログから選ぶと自動で検出してくれるのでとても便利でした。リソースをPIIの識別用に用意できるのも特徴の一つですね。

準備

データの作成

この記事で利用している検証用ダミーデータの生成は以下のツールを利用して作成しました。

以下のようなCSVファイルを作成しました。

sample.csv

"名前","年齢","都道府県","性別","誕生日","マイナンバー","職業","運転免許番号"
"***","28","新潟県","男","1994/12/04","2416-4241-1680","サラリーマン","469402386840"
"***","37","大阪府","女","1985/12/15","3662-2389-7210","サラリーマン","628505690240"
"***","36","東京都","男","1987/03/03","9859-0305-4340","フリーター","308608503420"
"***","29","福井県","女","1994/01/07","1947-6056-4191","サラリーマン","529303498600"
"***","21","大阪府","女","2002/03/28","2139-2872-6090","大学生","-"
"***","35","埼玉県","男","1988/02/09","8334-0133-9924","サラリーマン","438700818211"
"***","40","群馬県","男","1983/01/12","3200-3500-2981","サラリーマン","428204219780"
"***","30","三重県","男","1992/06/01","4274-7409-3968","サラリーマン","559200033290"
"***","34","大阪府","女","1988/11/28","8150-4427-9618","サラリーマン","628804157140"

ダミーデータではありますが、偶然の一致を避けるため、氏名はあらかじめマスクしておきました。

今回機密データ検出の対象として想定しているのは、マイナンバーおよび運転免許番号です。

データのS3バケットへのアップロード

以下のようにデータソースとなるバケットへアップロードしておきました。

サンプルデータのアップロード

Glue Jobで使うIAMロールの作成

以下のテンプレートでGlue Jobで使うIAMロールを作成しておきました。

AWSTemplateFormatVersion: "2010-09-09"
Description: Creating Glue Studio Execution Role for Pii Detection

Parameters:
  PiiDataBucketName:
    Description: Backet Name for Pii Sample Data.
    Type: String
  MartBucketName:
    Description: Backet Name for Data Mart.
    Type: String

Resources:
  GlueStudioExecutionRole:
    Type: AWS::IAM::Role
    Properties:
      RoleName: AWSGlueServiceRole-Studio-CM-nayuts
      AssumeRolePolicyDocument:
        Version: "2012-10-17"
        Statement:
          - Effect: Allow
            Principal:
              Service: glue.amazonaws.com
            Action: "sts:AssumeRole"
      Path: "/"
      Policies:
        - PolicyName: GlueStudioS3AccessPolicy
          PolicyDocument:
            Version: "2012-10-17"
            Statement:
              - Effect: "Allow"
                Action: [
                  "s3:*"
                ]
                Resource: [
                  !Sub "arn:aws:s3:::${PiiDataBucketName}",
                  !Sub "arn:aws:s3:::${PiiDataBucketName}/*",
                  !Sub "arn:aws:s3:::${MartBucketName}",
                  !Sub "arn:aws:s3:::${MartBucketName}/*"
                ]
      ManagedPolicyArns:
        - arn:aws:iam::aws:policy/service-role/AWSGlueServiceRole

IAMロール名は、AWS Glue Studio のセットアップ - AWS Glue StudioAWSGlueServiceRoleの文字列で始まる必要がある旨が記載されていたので、それに沿った命名としています。

Glue Jobを作成

データソース

以下のように設定しました。

データソース

データターゲット

以下のように設定しました。今回はCSVで出力するようにFormatを設定しました。

データターゲット

変換

Node typeDetect Sensitive Dataを選択しました。

Node typeの選択

Transformタブでは以下のように選択しました。今回はFind sensitive data in each rowを選択し、Select specific patternsにてJapan Driving LicenseJapan My Numberの2つを選びました。またSHA-256でハッシュ化したいので、ActionsApply cryptographic hashを選びました。

Transformタブの設定

なお、Select specific patternsではBrowseボタンを押すと以下のように適用するパターンを選択することができました。

Browseの表示

Glue Jobの詳細設定

Job detailsタブからIAM RoleをCloudFormationで作成したものを使うように設定しておきました。また、Requested number of workers2にしておきました。

Jobの詳細の設定

Glue Jobの実行

コンソール右上のRunボタンからJobを実行し、成功することを確認しました。

データターゲットで指定したパスに以下のデータが出力されることを確認できました。

名前,年齢,都道府県,性別,誕生日,マイナンバー,職業,運転免許番号
"***",28,新潟県,男,1994/12/04,"a495ea36a6e6045528315bfac4c6c9282c8d8166e3dd60de43dec321ddddc9a8",サラリーマン,"9a58bcb51083857d71405533b8d385e00b0d71687f0677e910ae614419a86f20"
"***",37,大阪府,女,1985/12/15,"62f97a458a8d7dc55630faac356d4c79210041fae44ddf94393edbdd88b6eb64",サラリーマン,"73929ba081971219282b8c207be756418c37c1329d94fff16bc4a7a6d293b461"
"***",36,東京都,男,1987/03/03,"699894c233dfd4a7986b83deae6a355b8e78ece0605ed47e954c7d6db675d489",フリーター,"58d85c437d37b07ea1da8a6e50bade93f473d6547e927f259f16b99b37d97bfa"
"***",29,福井県,女,1994/01/07,"b934ed439049215e8ad2d185480b6d859177800ef64c56ff225017f06a872493",サラリーマン,"b1c81d2937ac9f157e781278e0ef418e4f120cea90f2d56611eab7ecd62ae104"
"***",21,大阪府,女,2002/03/28,"9fc4131df9f219c6e35d565905ff72ad599338370b1203c363c47892498afc71",大学生,-
"***",35,埼玉県,男,1988/02/09,"a9de3d736fbcb2cbb5949d0dd68ec98e612f4193408e5a1123169b9c172d5c19",サラリーマン,"71626b6c01d81185c15bc2f3b123459c6f8a92b5c9498ff4a30ff0b4ce4a96e5"
"***",40,群馬県,男,1983/01/12,"883577b551182b8d2afec68d180540161b3bf00c93a695e391ef99d68bbd00d4",サラリーマン,"b81e41a7dd39e1b3c52144ec4ca48d81f8c3fb888f0635e69c8775c6b355ce62"
"***",30,三重県,男,1992/06/01,"700ecaeaefbc434d277bb9a15311ee7bf075494199aab6da83c7e41fa34c4501",サラリーマン,"c1167aa382827014383f460a9df1642d60a7d1a1161e6aad5d46157e847da991"
"***",34,大阪府,女,1988/11/28,"8048717ca5f67ec361f5fe76d9e2fb3a8ee344f83a6ff145d0bde071d40288ee",サラリーマン,"3e350ee785b37d34175f3bc834cb71807f529609e779709d695a5d85f5dff5fa"

補足

機密データの検出のためのスクリプトの実装について

Scriptタブからビジュアルエディタで実装した内容をPythonスクリプトにしたものが確認できますが、機密データの検出をPythonスクリプトでどのように記述すればいいのか確認できたので補足として記載します。

Glue Studio外でこの機密データ検出機能を使用できることは以下のページにも紹介がありますが、具体的な実装をPythonでどうするのがよさそうかあまり情報を見つけられなかったので困っていました。

今回の実装についてはScriptタブを開くと以下のようにスクリプトが表示されており、非常に参考になりました。

スクリプトの機密情報検出部分

Glue Studioでは作ることができるけれど、スクリプト単体ではどのように書くとよいか分からないものについては、Scriptタブで内容を調べるとよいかもしれません。

終わりに

今回は、AWS Glue Studioでデータソース内の個人識別情報を識別して、SHA-256でハッシュ化する検証をしてみました。

参考になりましたら幸いです。