「S3 Object Lambdaと Amazon Comprehend を使用した PII データの検出と編集」をやってみた


# 概要
以下記事に沿ってPIIデータの削除にトライしました。

https://docs.aws.amazon.com/ja_jp/AmazonS3/latest/userguide/tutorial-s3-object-lambda-redact-pii.html


元々は非構造化テキストデータ内のPIIを除去する目的に使用される想定かと思いますが、今回はcsvファイルでも動くかどうか検証したいと思います。

尚、テストデータの作成にはUser Localさんの個人情報テストジェネレータを使って出力したcsvファイルを使用します。

https://testdata.userlocal.jp/

*以下の手順で DefaultLanguageCode を ja に設定している箇所がございますが、Amazon Comprehend の PII検知のサポート対象は「en」のみとなります。(2022/12/2 時点) 
検証開始時に気づかず興味本位で設定変更した結果、S3 Object lambdaがエラーを返す結果となりました。本記事では敢えて失敗の過程も晒しますので、反面教師にして頂ければと思います。*

# 手順
## 1. S３バケットの作成
- バケット名、任意のリージョンを選択
- その他はデフォルトのまま作成

## 2. S3 バケットにファイルをアップロード

今回用意したcsvファイル
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/b42c389c-989f-e301-0104-7b420892ac2d.png)

## 3. S3 アクセスポイントの作成
S3コンソールで、アクセスポイント -> アクセスポイントの作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/72cee446-34cb-2117-d6f7-750b61527fdb.png)
アクセスポイン名設定、1 で作成したバケットの名前を入力、[ネットワークオリジン] で、[インターネット] を選択
その他はデフォルトのままアクセスポイントを作成
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/99690692-632c-ae35-d8b8-26706a33ef36.png)

## 4. 事前構築された Lambda 関数の設定とデプロイ

AWS Management Console にサインインし、AWS Serverless Application Repository で[ComprehendPiiRedactionS3ObjectLambda](https://console.aws.amazon.com/lambda/home#/create/app?applicationId=arn:aws:serverlessrepo:us-east-1:839782855223:applications/ComprehendPiiRedactionS3ObjectLambda) 関数を表示します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/e2ad8937-ee81-19e2-d3f8-04bf9824ccc6.png)

DefaultLanguageCodeを ja に設定してみる。

:::note warn
冒頭述べた通り ja だと失敗するので、en を指定して下さい。
:::

それ以外はデフォルトのまま、「このアプリがカスタム IAM ロールを作成することを承認します。」にチェックを入れてデプロイ。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/19159794-ba25-c48a-2fad-86501003d871.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/24a7d435-806b-e7f6-180e-568382191bd9.png)

## ステップ 5. S3 Object Lambda アクセスポイントの作成
S3コンソールから、Object Lambda アクセスポイント -> Object Lambda アクセスポイントの作成 を選択。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/8c918d46-dda4-1f9a-552f-d45076b7a582.png)
アクセスポイント名を指定し、ステップ 3 で作成した標準アクセスポイントを入力または参照。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/360b8e78-6df3-1b81-3efd-4c03606ee178.png)
- S3 APIは「GetObject」を選択
- Lambda 関数はステップ 4 でデプロイした Lambda 関数を選択
- それ以外はデフォルトで[Object Lambda アクセスポイントの作成] を選択

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/ab89e90f-4fe2-1f67-99c2-f227ece302ce.png)

## ステップ 6 S3 Object Lambda アクセスポイントを使用して、編集されたファイルを取得する
> S3 Object Lambda アクセスポイントを使用して、編集されたファイルを取得するには
> S3 Object Lambda アクセスポイントを使用してファイルの取得をリクエストすると、S3 Object Lambda への GetObject > API 呼び出しが行われます。S3 Object Lambda は Lambda 関数を呼び出して PII データを変換し、変換されたデータを標準 S3 GetObject API への応答として返します。

とのことなので、後は S3 Object Lambda アクセスポイントにアクセスすると、デプロイされた S3 Object Lambda が実行され、PIIデータにマスクが掛かった状態で出力されるはずです。

S3 コンソールの左のナビゲーションペインで、[Object Lambda アクセスポイント] を選択します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/b57faa42-594e-dd87-9580-c2dc5691e285.png)
早速、dummy.csv を DL してみます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/505a0440-05d2-f6f3-5cb9-788a30e5b2a0.png)
容量オーバーでDLできず。lambda の環境設定で環境変数をチューニングします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/2cf17389-189e-be41-3da8-c0ba36a4dfac.png)
DocumentMaxSizeを100MBに設定。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/0e3ff58a-bf41-6e29-fff3-0b10ba3e891f.png)
再度、トライするも、今度はInternal Errorが発生。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/fcf16726-6c32-13ee-a747-8c7d2e8b1fa8.png)
やはり「DefaultLanguageCode が `ja` では動かないので、素直に `en` に戻す。( すみません。最初からちゃんとドキュメントチェックしておくべきでした。)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/515a4964-5da2-21e4-45d4-23831e7a2ea1.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/d80f9905-966f-9b63-936b-50a7444b7aa9.png)

### 出力結果
無事に出力はされましたが、以下のような問題が発生しました。
- csvのフォーマットが崩れる
- マスクが掛かる箇所がバラバラ (メールアドレスとマイナンバーあたりは上手くマスクできていそう？)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/878000/a68bbf6c-db8a-2a93-bc5f-e56b2a5f23fd.png)
## 結論
- 構造化データのPIIデータ削除目的でデータ加工パイプラインに組み込むのは非現実的
- アプリケーションのバックエンドとしての利用が想定される。
    - CS部門のお客様とのやりとりを管理するシステムにおいて、CS担当以外のロールで閲覧する際にPIIが削除された状態で閲覧できるみたいなシステムを作る時に便利かも。(ComprehendのPIIエンティティー検出機能が日本語対応するのであればの話。)

以上、ここまでご覧頂き、ありがとうございました。