はじめに
こんにちは!クラウド事業部の中根です。
先日、AWS DEAを取得しました。
その学習中にLake Formationの列レベルと行レベルでのアクセス制御、というものを初めて知りました。
なんだか気になったので、試してみました。
AWS DEA学習中の方の参考になれば幸いです。
Lake Formationとは
Lake Formationは、簡単に言うと、データレイクの構築と管理を簡素化するためのAWSサービスです。
公式ドキュメント

列レベル・行レベルでのアクセス制御
1つのデータセット(テーブル)に対し、アクセスするユーザーやグループに応じて特定の列や行を見えないようにすることができます。
これがないと、各ユーザーやグループがアクセスするためのビューを作成する必要があり、管理が煩雑になります。
例えば、顧客データの中で電話番号列などの個人情報を、特定の社員しかアクセスできないようにする、という制御が可能です。
列レベル・行レベルでのアクセス制御を活用することで、シンプルなアクセス制御を実現できます。
公式ドキュメント
事前準備
1. データセットの準備
S3バケットを作成し、以下のサンプルデータを格納します。
id,name,department,salary,region 1,Alice,Engineering,8000,US 2,Bob,Engineering,7500,EU 3,Charlie,HR,6000,US 4,David,HR,6200,EU 5,Eve,Finance,9000,US 6,Frank,Finance,8800,EU 7,Grace,Sales,7000,US 8,Heidi,Sales,7200,EU
2. テーブル作成
Athenaクエリエディタを開き、以下のクエリを実行します。
CREATE database lake_formation_test;
CREATE EXTERNAL TABLE lake_formation_test.employees (
id INT,
name STRING,
department STRING,
salary INT,
region STRING
)
ROW FORMAT DELIMITED
FIELDS TERMINATED BY ','
LOCATION '<1.で格納したサンプルデータのフォルダパス(ファイル名なし)>'
TBLPROPERTIES ("skip.header.line.count"="1");

次の画面のようにエラーが出たら、右上の「設定を編集」を押下します。
遷移先でクエリ結果を保存するためのS3バケットを指定してください。
バケットは1.とは別で作っておくのがおすすめです。

作成したら、データが格納されていること、全てのデータを見られることを確認します。
select * from lake_formation_test.employees;

3. IAMロール作成
検証用に、IAMロールを作成します。
以下のように設定して「次へ」。

AmazonAthenaFullAccess,AmazonS3FullAccessポリシーをアタッチします。
適当な名前を付けてIAMロールを作成します。

4. IAMAllowedPrincipalsのアクセス権の削除
Lake Formationのサービス画面から、「Data permissions」に進み、以下の2つにチェックをして「Revoke」を押下します。
環境によってはそもそも存在しないかもしれませんが、その場合は無視してください。

2.作成したテーブルに対して、IAMAllowedPrincipalsが権限を持っている場合は削除する、ということをしています。
簡単に説明すると、IAMAllowedPrincipalsが権限を持っている場合、IAMベースでアクセス制御がされ、今回の行レベル、列レベルのアクセス制御をすることができないです。
行レベルのアクセス制御
1. データフィルター設定
Lake Formationのサービス画面から、「Data filters」に進み、「Create new filter」を押下します。

Data filter nameは任意の名前を付けます。
Target tableは、事前準備の2.で作成したテーブルです。

Row filter expressionには以下を入力します。
region = 'US'

2. 行レベルのアクセス制御設定
Lake Formationのサービス画面から、「Data permissions」に進み、「Grant」を押下します。

以下のように入力して「Grant」押下します。
IAM users and roles: 事前準備の3.IAMロール作成のロール名
LF-Tags or catalog resources: Named Data Catalog resources
Tables: 事前準備の2.で作成したテーブル
Data filters: 1.で作成したデータフィルター
Data filter permissions: Selectだけチェック


3. スイッチロール
マネジメントコンソール右上から、ロールの切り替えを行います。
マルチセッションサポートオフの方は多少UIが違うかもしれませんが、同様にロールの切り替えをします。

Account ID:自分のアカウントID
IAM role name:事前準備の3.IAMロール作成のロール名

マネジメントコンソール右上で、ロールが切り替わったことを確認してください。

4. クエリ実行
Athenaクエリエディタを開き、以下のクエリを実行します。
select * from lake_formation_test.employees;
次の画面のようにエラーが出たら、事前準備の2.と同様に対処してください。

regionがUSのデータだけ表示されていることが確認できました!

列レベルのアクセス制御
※前の手順で、スイッチロールしている場合は、元のセッションで操作してください。
1. データフィルター設定
Lake Formationのサービス画面から、「Data filters」に進み、「Create new filter」を押下します。

Data filter nameは任意の名前を付けます。
Target tableは、事前準備の2.で作成したテーブルです。
Column-level accessは、Exclude columnsを選択し、Salaryだけチェックします。

2. 列レベルのアクセス制御設定
Lake Formationのサービス画面から、「Data permissions」に進み、「Grant」を押下します。

以下のように入力して「Grant」押下します。
IAM users and roles: 事前準備の3.IAMロール作成のロール名
LF-Tags or catalog resources: Named Data Catalog resources
Tables: 事前準備の2.で作成したテーブル
Data filters: 1.で作成したデータフィルター
Data filter permissions: Selectだけチェック


3. 行レベルのアクセス制御を解除
「行レベルのアクセス制御」を試している場合は、その権限をRevokeしておきましょう。

4. スイッチロール
前述の行レベルのアクセス制御の3.と同じロールにスイッチロールします。

5. クエリ実行
Athenaクエリエディタを開き、以下のクエリを実行します。
select * from lake_formation_test.employees;
salary列が非表示になっていることが確認できました!

まとめ
今回は、Lake Formationの列レベル・行レベルのアクセス制御を試してみました。
AWS DEAを受験予定の方の参考になれば幸いです。
関連記事
今回は列レベル、行レベルそれぞれで試しましたが、両方を組み合わせることも可能です。
以下の記事もご参考ください!
終わりに
APCはAWS Advanced Tier Services(アドバンストティアサービスパートナー)認定を受けております。
その中で私達クラウド事業部はAWSなどのクラウド技術を活用したSI/SESのご支援をしております。
www.ap-com.co.jp
https://www.ap-com.co.jp/service/utilize-aws/
また、一緒に働いていただける仲間も募集中です!
今年もまだまだ組織規模拡大中なので、ご興味持っていただけましたらぜひお声がけください。