Lake Formationを調べてみた

# 背景・目的
Lake Formation(以降、Lfnという。)の機能や特徴を理解する。

# まとめ
- Lfnは、データレイクを数日で構築可能。
- 以下のメリットがある。
    - 素早い構築
    - セキュリティ管理の簡素化
    - セルフサービス機能の提供
- 以下の機能を有する。
    - DBとオブジェクトストレージからデータを収集およびカタログ化
    - データレイクをS3に作成
    - 機械学習を使ったデータのクリーンアップと分類
    - 行列、セルレベルのアクセス制御
- 以下のユースケースがある。
    - データレイクを素早く構築する
    - アクセス制御を一元的に定義して管理する
    - データの分類ときめ細かいアクセスを実施する
    - 継続的なデータ管理、タイムトラベル、ストレージの最適化
    - クロスアカウント共有でデータレイクを有効にする。 


# 概要
## 特徴
Lfnの3つのメリット「素早い構築」、「セキュリティ管理の簡素化」、「セルフサービス機能の提供」の特徴を以下に記載します。

|メリット |特徴 |説明 |
|:-- |:-- |:-- |
|データレイクを素早く構築する |既にAWSにあるデータベースからデータをインポートする | 既存のDBのアクセス認証を指定し、Cfnがデータとそのスキーマを読み取り、メタデータをカタログに記憶する。<BR>また、データについてもインポートができる。<BR><BR>対象のRDBは、RDSかEC2でホストされているMySQL、PostgreSQL、SQL Server、MariaDB、Oracleをサポートしている。|
| |その他の外部ソースからデータをインポートする | JDBCを使用してオンプレミスのDBからデータを移動できる。<BR>上記のデータレイク以外のDBについては、GlueのカスタムETLジョブで取り込むことが可能。|
| | AWS のその他のサービスからデータをインポートする |S3からも収集可能、CloudFront、ELB、CloudFrontなどのログも取り込み可能。<BR>カスタムジョブを使用して、KinesisやDynamoDBでデータレイクにデータを読み込むことも可能。|
| | データをカタログ化してラベルを付ける| データソースのメタ情報を読み込み、ユーザが検索可能なカタログを作成する。<BR>テーブルレベル、列レベルで、データにカスタムラベルを追加し、「機密情報」などの属性を定義することも可能。これにより、ユーザは分析が必要なデータを素早く検索できる。|
| | データを変換する| 分析しやすい形式で保存されるように、データに対して変換を実行する。<BR>変換テンプレートを使用して、分析用に準備するジョブをスケジュールする。<BR>パフォーマンスが向上するようににParquetやORCに変換する。 |
| | データを消去して重複を排除する|FindMatchesという機械学習の変換を使用して、重複排除する。 |
| | パーティションを最適化する| パフォーマンスとコスト削減のためにパーティションを最適化する。|
| | 行レベルおよびセルレベルのセキュリティ| アクセスを制限できるデータフィルターを提供する。行レベル、セルレベルのセキュリティを使用して、PIIなどの機密データを保護する。|
|セキュリティ管理を簡素化する | 暗号化を強化する| S3の暗号化機能を使用する。（KMSで管理されるキーによる自動的なサーバ側暗号化を提供できる。）|
| |アクセス制御を定義して管理する | セキュリティポリシーを、DB、テーブル、行、列、セルレベルでデータへのアクセスを制御できる。IAMポリシーや、IAMユーザ、フェデレーションする場合のユーザとグループに適用できる。きめ細かいコントロールを使用して、Redshift Spectrum、Athena、Glue ETL、EMR for SparkのLfnによって保護されたデータにアクセス可能。|
| |監査ログを実装する | Lfn経由でアクセスされるデータに対して、データレイクのデータを読み取る分析と機械学習のサービス全体でデータへのアクセス履歴を監査できる。|
| | Governed tables| ACIDトランザクションを使用して、複数のユーザとジョブがデータをS３の複数テーブルに確実かつ一貫して登録できるようにする。|
|データにセルフサービスアクセスを提供する |ビジネスメタデータでデータにラベルを付ける | テーブルプロパティのフィールドをカスタム属性として追加することで、データスチュワードやビジネスユニットなどのデータ所有者を指定できる。ビジネスメタデータをを定義するのが目的。|
| | セルフサービスのアクセスを有効にする| データセットへのアクセスのリクエストと提供を容易にして、様々な分析ユースケース用のデータレイクへのセルフサービスアクセスをユーザに提供する。|
| | 分析のために関連データを検出する| ユーザが中心のデータセットに記録されたデータセットを、オンラインで、テキストベースの検索とフィルタリングを行うことができる。ユーザは関連データを名前、内容、機密性、定義したカスタムラベルで検索できる。|
| | 分析方法を組み合わせてさらに詳しいインサイトを得る| EMRやAthena、Redshiftなどをしようして直接クエリできる。|

## AWS利用料
* 以下のように利用料金がかかります。

|内容 |単位 |内容 | 
|:-- |:-- |:-- | 
|データフィルタリング | 1TB/2.5USD| Governed Tablesまたは行レベルのアクセス許可で保護されているテーブルをクエリする場合、スキャンされたバイト数単位に課金される。目がバイト単位で切り上げれられる。10MBバイト未満については、10MBで計算される。| 
|トランザクションメタデータの保存とリクエスト |（ストレージ）S3オブジェクト100,000個あたり 1.00USD | S3オブジェクト、パーティション、トランザクションを追跡するGoverned Tableに関連付けられたメタデータを管理する。| 
| |（リクエスト）毎月のリクエスト100万件あたり1.00USD |同上 |
|ストレージオプティマイザー | 1TBあたり2.5USD|ストレージオプティマイザーによってスキャンされたバイト数に対して課金され、バイト数はMB単位で切り上げ。<BR>ストレージオプティマイザは、バックグラウンドで実行され、小さなファイルを大きなファイルに圧縮して分析エンジンのクエリパフォーマンスを向上させる。 | 

※ 料金は、2022/6/26現在の東京リージョンの価格になります。

## 用語

| 用語| 説明| 
|:-- |:-- |
|データレイク |S3に保存され、CatalogをしよステLfnにより管理される永続的データ。<BR>データレイクの対象は、以下の通り<BR>・構造化データと非構造化データ<BR>・rawデータと変換されたデータ | 
|データアクセス |Lfnは、IAMポリシーを補強する新しい許可/取り消しモデルを通じて、データをセキュアで詳細なアクセスを提供する。 <BR>設定済みのLfnのポリシーはユーザがアクセスを認可されているデータにしかアクセスできないことを確実にする。| |
|ブループリント |データレイクにデータを簡単に取り込めるようにするデータ管理テンプレート。<BR>LfnはRDBやCloudTrailログなど事前定義されたソースタイプごとに、いくつかのブループリントを提供する。<BR>ブループリントからはワークフローを作成が可能。 | |
|ワークフロー |Glueジョブ、クローラー、トリガーのためのコンテナ。<BR>ワークフローを定義するときは、ワークフローの基礎となるブループリントを選択する。 | |
|データカタログ | 永続的なメタデータストア。Apache Hiveメタストアと同様の方法で実行できるマネージド・サービス。 | |

# 実践
## Lake Formationのセットアップ
[AWS Lake Formation のセットアップ](https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/getting-started-setup.html)を参考に試してみる。

### AWS の初期設定タスクを完了する
* AWSサインアップやIAMユーザの作成は実施済みなので省略します。

### ワークフロー用の IAM ロールを作成する
* ワークフローを作成する際に、使用するためのIAMロールをLfnに付与します。
1. Glueを選択し次へ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/acbc5c0a-52ec-cc07-6fda-34146d996bee.png)


1. AWSGlueServiceRoleポリシーを選択し次へ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/9bdb80b5-d31d-c9e5-8004-fa4472ab0e1b.png)

1.ロール名「LakeFormationWorkflowRole」をつけてロールを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7487b741-a87e-c2f8-0cd1-9b84e77b2493.png)

1.作成したロールの「インラインポリシー」の追加をクリック。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7ae771aa-0a14-74c6-1739-3c50fafe206e.png)

1.以下のポリシーを追加します。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                 "lakeformation:GetDataAccess",
                 "lakeformation:GrantPermissions"
             ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": ["iam:PassRole"],
            "Resource": [
                "arn:aws:iam::<account-id>:role/LakeFormationWorkflowRole"
            ]
        }
    ]
}
```
- lakeformation:GetDataAccess
    - ワークフローによって作成されたジョブによるターゲットロケーションへの書き込みを可能にする。
- lakeformation:GrantPermissions
    - ワークフローがターゲットテーブルに対する SELECT 許可を付与することを可能にする。
- iam:PassRole
    - サービスが LakeFormationWorkflowRole ロールを引き受けてクローラとジョブを作成し、作成されたクローラとジョブにロールをアタッチすることを可能にする。

1.２つのポリシーがアタッチされました。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/eb8915ca-4121-7149-8c37-74a569a21cdf.png)

### データレイク管理者を作成する
1.以下のポリシーをアタッチしたIAMユーザを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/27fa772d-2b0f-11f0-f6c4-4384d88282e6.png)
インラインポリシーは、以下の通り

```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:AWSServiceName": "lakeformation.amazonaws.com"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::<account-id>:role/aws-service-role/lakeformation.amazonaws.com/AWSServiceRoleForLakeFormationDataAccess"
        }
    ]
}
```
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PassRolePermissions",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                "arn:aws:iam::<account-id>:role/LakeFormationWorkflowRole"
            ]
        }
    ]
}
```

2. Lfnのトップページの Get Startで作成したIAMユーザを選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/d2707060-3d5b-42b6-9a82-7e303b71d710.png)


### デフォルトの許可モデルを変更する
* Lfnは当初、既存のGlue Data Catalog動作との互換性のために「IAM アクセスコントロールのみを使用する」設定が有効化された状態になっている。
* これらの設定を無効にして、Lake Formation 許可でのきめ細かなタグベースのアクセスコントロールを有効にすることが推奨されている。

1.LfnのナビゲーションペインのData Catalog>Setingsをクリックし、２つのチェックボックスを外しSaveします。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/787cf484-93c6-bc67-4b75-b7141a1fe868.png)

2.ナビゲーションペインのPermissions→Administrative roles and tasksをクリックします。
3.Database creatorsでIAMAllowedPrincipalsを選択し、Revokeをクリックし削除します。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/442dd8ee-4f4c-84d3-edfa-7afc76fd7457.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/7c41a253-497a-6d9c-c8f5-f3bea766aa5b.png)

※ [データレイクのデフォルトセキュリティ設定の変更](https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/change-settings.html)

### 追加の Lake Formation ユーザーを作成する
* AWS Lake Formation でデータレイクにアクセスできる IAM ユーザーを作成する。
* データレイクをクエリするための最小限の許可セットを持っている。

以下のポリシーをアタッチしたユーザを作成する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/206276/e403ad5b-7d54-8896-7655-8ed339cadf42.png)

DatalakeUserBasicは、以下の通り。
```
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess",
                "glue:GetTable",
                "glue:GetTables",
                "glue:SearchTables",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:GetPartitions",
                "lakeformation:GetResourceLFTags",
                "lakeformation:ListLFTags",
                "lakeformation:GetLFTag",
                "lakeformation:SearchTablesByLFTags",
                "lakeformation:SearchDatabasesByLFTags"
            ],
            "Resource": "*"
        }
    ]
}
```
### データレイク用の Amazon S3 ロケーションを設定する
* データレイク内のデータの管理とセキュア化に Lake Formation を使用するには、まず Amazon S3 ロケーションを登録する必要がある。
* ロケーションを登録すると、その Amazon S3 パスと、そのパスにあるすべてのフォルダが登録され、Lake Formation によるストレージレベルの許可の適用が可能になる。
* ユーザーが Amazon Athena などの統合エンジンからのデータをリクエストすると、Lake Formation はユーザーの許可を使用するのではなく、データアクセスを提供する。
* ロケーションを登録するときは、そのロケーションに対する読み取り/書き込み許可を付与する IAM ロールを指定する。
    * Lake Formation は、登録された Amazon S3 ロケーションにあるデータへのアクセスをリクエストする統合された AWS のサービスに一時的な認証情報を提供するときに、そのロールを引き受ける。
    * ユーザーは、Lake Formation サービスリンクロール (SLR) を指定するか、独自のロールを作成することができる。
* カスタムロールは、以下の状況で使用する。
    * 登録された Amazon S3 ロケーションに管理対象テーブルを作成することを予定している。
    * ユーザー定義ロールには、SLR 許可に加えて、CloudWatch Logs でのログの追加と、メトリクスの発行のためのポリシーが含まれている必要がある。
    * Amazon S3 ロケーションが別のアカウント内に存在する。
    * Amazon S3 ロケーションに AWS マネージドキー で暗号化されたデータが含まれている。
    * Amazon EMR を使用して Amazon S3 ロケーションにアクセスすることを予定している。






# まとめ
次回以降に、[AWSドキュメント](チュートリアル)のチュートリアルを実践してみます。


# 参考
https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/how-it-works.html