データカタログへの権限制御する
Lake Formationは、データカタログにきめ細かな権限制御ができます。
ユーザーごとに、データカタログのDatabaseへのテーブル追加を禁止したり、あるカラムを非表示にしたり、実行できるSQLを制限したりできます。やってみます。
S3パス
s3://test-lf01/in00
Database名
lf01
テーブル名
test1
テスト用IAMユーザー
test_user1
CSVファイルをS3にアップ
ファイル名:person.csv
s3://test-lf01/in00 に以下のCSVファイルをアップ
taro, 20190101, 101, 00001
jiro, 20190202, 102, 00001
ojiro, 20190303, 101, 00002
hanako, 20190404, 103, 00004

スキーマは以下を想定
name(string)
date(string)
storeid(string)
accountnumber(string)
データカタログ作成
Database作成
Lake Formationの画面で左側メニューから"Database"をクリックし、右上の[Create database]をクリック

Nameに"lf01"と入れて、"Grant All to Everyone for new tables in this database"のチェックを外し、右下の[Create database]をクリック
※"Everyone"はLake Formationのユーザーグループの要素です。パブリックなユーザーという意味ではなく、Lake FormationのIAMアクセス許可を持つ全員という意味です。
"Grant All to Everyone for new tables in this database"はこのデータベースで作成される新しいテーブルに"Everyone"に対して全権限を与えるという設定。デフォルトはチェックが入っている。

Databaseできた

テーブル作成
Lake Formationの画面で左側メニューから"Tables"をクリックし、右上の[Create table]をクリック(今回は手動でテーブル作成)

以下を入力(あとに続く)
Name: "test1"
Database: "lf01"

Include path に s3://lf01/in00/
※別リージョンのバケットは選択できないっぽい
CSVにチェック

右上の[Add column]をクリック

カラムを追加していく。追加するカラムは↓
name(string)
date(string)
storeid(string)
accountnumber(string)

追加し終わったら右下の[Submit]をクリック

テーブル出来た。

権限確認
Databaseに対しては、管理者はフル権限、"Everyone"もフル権限(デフォルトではDatabase作成時に"Everyone"へのフル権限が付与される設定になってる)

テーブルに対しては、管理者はフル権限、"Everyone"はいない(前述のように、今回Database作成時の設定で新規作成テーブルに"Everyone"へのフル権限を付与しない設定にした)。なので管理者以外は操作できない。

Athenaで確認
まずは管理者で、Lake Formationで作ったデータカタログを使い、Athenaで閲覧出来ていることが確認できる。

Lake Formationによる権限管理
Lake Formationの売りの1つであるカラムレベルでの権限制御を確認する
今回は、あるユーザーに対してはstoreid, accountnumberのカラムは表示させたくない。テーブルのdropもさせたくない。という制御を入れます。
IAMユーザー作成
手順は割愛しますが、こんな感じでAdministratorのポリシーを持つtest_user1を作りました。
正真正銘administratorです
test_user1でAthenaにアクセスするとDatabaseのlf01は見えますが、まだテーブルへの権限がなにもないためテーブルは表示されません。もちろんクエリもはじかれます。
Lake Formationが登場する以前だったら見えてましたね。本機能はLake Formationのリソースベースポリシーと考えればいいと思います。

Lake FormationのData Permissionsで設定。当初やりたかった特定カラムだけ非表示
test_user1ユーザーに対してはstoreid, accountnumberのカラムは表示させたくない。テーブルのdropもさせたくない。という制御を入れます。
LakeFormationの画面で左側メニューの"Data Permissions"をクリックし、右上の[Grant]をクリック

以下を入力していきます(あとに続く)
IAM user add roles : test_user1
Database: lf01
Table: test1

以下を入れ右下の[Grant]をクリック
Columnに"Include columns"を選択
Include columnsに"name"、"date"を選択
Table permissionsに"select"にチェック

結果はこんな感じ

Athenaで確認
test_user1の人には、nameとdateの列だけが見える状態になっている。

ちゃんとDDLも拒否している
以下のようにパーミッションエラーな感じのメッセージが確認できる
MetaException(message:Insufficient Lake Formation permission(s):...

Lake FormationのRecent Access Activity のログはこんな感じ
※CloudTrailのログなので、だいたい10分くらい遅れて出力される。あとこの画面ではフィルタが相当弱い・・
右上のView eventをクリックで詳細確認可能

(補足)_DataCatalogのデフォルトセッティング
新しく作成されたデータベースとテーブルのデフォルトのパーミッションとして以下の2つを有効無効にできます(デフォルトは有効)
- 新しく作成されたデータベースに"Everyone"へのAll許可を与える
- 新しく作成されたテーブルに"Everyone"へのALL許可を与える
特に必要がなければチェックを外して右下の[Save]をクリックします。これにより新規で作成されたデータベースやテーブルに自動で"Everyone"への許可(IAMの権限があれば操作できる状態)されることはなくなり、Lake Formation上で明示的なきめ細かい許可を与える運用を行う事ができます。
"Everyone"はGlueDataCatalogからの移行のために存在するEntityで、この辺はまた今度記事にできればと

こちらも是非
LakeFormationの使い方まとめ
https://qiita.com/pioho07/items/76554a7ac4252858b450
Glueの使い方まとめ
https://qiita.com/pioho07/items/32f76a16cbf49f9f712f