【備忘録・まとめ】AWS Lake Formation

## 出典

[AWS Lake Formation - Developer Guide](https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/what-is-lake-formation.html)

## まとめ

* WebコンソールないしシンプルなAPIから操作、管理できるGlueおよびIAMのラッパー
* Lake Formationからできること
    * DataCatalogのDatabaseおよびTableの作成と管理
    * BlueprintによるGlueのWorkflow作成および管理と実行
    * IAM UserまたはRoleに対するDataCatalogへの各種権限のGrant及びRevoke
* S3 / Glue / Athena (Redshift Spectrum) のスタックで構成される集計環境が、RDBMSの様な操作感で使える

## 要点

### Lake Formation用語

* Data Lake
    * Data Catalogを用いてLake Formationにより管理されているS3のデータ
* Blueprint
    * Workflowを作るためのテンプレート
    * 典型的な各種データソースおよび出力データタイプについてテンプレートが用意されている
* Workflow
    * ETL処理のひとまとまり
        * Glue crowlers / jobs / triggers
    * Workflowに必要なRoleを割り当てて、ETL処理を走らせることになる
    * 以下を引数にとる
        * Data source / Data target / schedule
* Data Catalog
    * Glue Data Catalogのそれ
    * Hiveメタストア
* Principal
    * IAM User / Role
    * DataCatalogへのアクセス権をGrant / Revokeする対象

### LakeFormationにおけるユーザ・権限管理

LakeFormationでは、IAM Userに対して各種ポリシーをアタッチしてDataLakeAdministratorとし、そのIAM UserでDataLakeの管理をしていく事になる。一般のRDBMSで言うところのroot権限の様なものと考えれば分かりやすい。具体的な手順は[このへん](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-iamdla.html)を参照。

Administratorへアタッチする権限は主に4つ。
LakeFormationから呼び出す関連サービス（Glue/Athena、必要な場合はCloudTrailなど）の全権限もアタッチしておく。

* AWSGlueConsoleFullAccess (AWS managed)
* AmazonAthenaFullAccess (AWS managed)
* LakeFormationおよび関連リソースの各種操作権限
* 新設したWorkflowにRoleを設定する権限

これらの権限をアタッチしたユーザを、[LakeFormationにAdministrator登録する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-dla.html)ことで、LakeFormationからの全操作が可能になる。


同様に、データ分析者相当のIAM Userには相応の権限を付与することになる。具体的な手順は[このへん](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-lf-user.html)。

利用者毎に適宜IAM Userを払い出し、Policyを付与しておく。

### ざっくり使い方

1. WorkflowにアタッチするPolicyを用意する
    * だいたい[こんな感じ](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-workflow-role.html)
    * CloudTrailのログを使う場合は[こんな感じ](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-grant-cloudtrail.html)
2. DataLake用S3バケット(ETL処理後の集計可能なデータを入れておく場所)を用意する
    * このバケットをLakeFormationに[設定する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-register.html)と、この後DataCatalogに作成するDatabaseのデフォルトのバケットになる
    * このバケットに対してWorkflowがDatabaseやTableを作るのに使う権限を[設定する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-data-location.html)
3. DataCatalogにDatabaseを[作成する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-db.html)
4. 作成したDatabaseのデータに対する、各ユーザの権限を[設定する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-data-permissions.html)
5. Blueprintを使って、[Workflowを作成する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-create-workflow.html)
    * ここで、以下のパラメータを指定する
        * DataCatalogのDatabaseおよびテーブル(Prefix)名
        * DataLakeとなるS3バケット
        * 出力データフォーマット
        * Workflowが用いるIAM Role
        * 実行スケジュール(常時手動実行も可)
6. Workflowを[実行する](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-run-workflow.html)
7. Workflowによって作成されたTableに[Grant Selectする](https://docs.aws.amazon.com/lake-formation/latest/dg/cloudtrail-tut-grant-table.html)
8. めでたくAthenaでクエリが叩けるようになる

## 所感

* 最初の諸々権限設定が結構めんどくさい
* CDKでコード管理したい
* 管理のベストプラクティスなんかが出揃うまで、もう少し時間がかかりそう
    * あるいは、研究すべし
* ETLの処理、権限管理、およびデータソース、整形後データベースが一元管理できるので、上手く使えるとかなり強力そう
* Workflowのリトライやアラート処理、進捗の可視化なんかを考えると、Workflowは全部OnDemand実行にして、StepFunctionに寄せたりしたい気持ちが出てくる