AWS Lake Formation

Lake Formation

Lake Formation とは

Lake Formation は、データレイクを構築、運用するための AWS マネージドサービスです。

データレイクについては、AWS のドキュメントで以下のように説明されています。

データレイクとは
データレイクは、規模にかかわらず、すべての構造化データと非構造化データを保存できる一元化されたリポジトリです。データをそのままの形で保存できるため、データを構造化しておく必要がありません。また、ダッシュボードや可視化、ビッグデータ処理、リアルタイム分析、機械学習など、さまざまなタイプの分析を実行し、的確な意思決定に役立てることができます。

https://aws.amazon.com/jp/what-is/data-lake

要するに、構造化・非構造化問わず、様々な形式のデータをそのままの形で保存できるリポジトリがデータレイクのようです。様々なデータを 1 つの場所に集中して保管することで、より多くのデータを分析に活用できるようになります。一方で、無造作に様々なデータを追加していると、データが多すぎるがゆえに必要なデータを見つけられなくなるという課題も生じます。

Lake Formation は、こういった課題を解決しつつ、簡単にデータレイクを構築、運用するためのサービスです。

以下の図にあるように Lake Formation は AWS Glue の拡張機能的な立ち位置のサービスとなっており、一部の機能では Glue のリソースを作成します。

https://d1.awsstatic.com/webinars/jp/pdf/services/20191001_BlackBelt_LakeFormation_A.pdf

大まかな理解

Lake Formation の各機能について、ざっくりと説明します。

まず、先述の通り Lake Formation はデータレイクを構築、運用するための AWS マネージドサービスです。そして、データレイクはデータの形式を問わずにデータを保存するリポジトリのことでした。データレイクの運用は、データレイクに保存した様々な形式のデータを分析し、意思決定にデータを活用することを目的としています。

上記よりデータレイクの利用にあたって、以下のリソースが必要になります。

  • データレイク本体
  • データレイクに保存するためのデータ
  • データレイクに保存されたデータを分析するためのサービス

データレイクには、構造化・非構造化問わず、様々な形式のデータが保存されます。データをただただ雑多に保存するだけでは、データレイクに保存されたデータがどのような形式のもので、何用のデータなのかわからなくなってしまいます。

データレイクを利用する目的はデータを分析することですので、保存されたデータを分析できるように整理する必要があります。そこで、データレイクに保存されたデータとセットで、そのデータの説明書も作っておく必要があります。

絵にすると、以下のような関係性です。

実際には、分析サービスを利用するユーザーによって、参照できるデータや説明書は異なるはずです。ユーザー A は、データ A を参照できるものの、ユーザー B はデータ A を参照できないなどの制御をする必要があります。

このデータや説明書に対するきめ細かなアクセス制御を管理するためのサービスが Lake Formation です。また、Lake Formation にはアクセス制御に加えて、データレイクにデータをインポートするブループリントと呼ばれる機能もあります。

これらを踏まえて、上の図を AWS サービスに置き換えて考えると以下のようになります。Lake Formation の主な機能は赤色の部分です。

こうしてみると非常にシンプルですね。

機能

Lake Formation の主な機能であるブループリントとアクセス制御についてみていきます。

ブループリント

ブループリントは Lake Formation に標準で用意された、データを Lake Formation に取り込むための機能です。その名の通りブループリント自体は設計図で、ブループリント上で入力したパラメータをもとにワークフローを作成してデータを取り込みます。ワークフローは、Glue クローラー、ジョブ、トリガーをカプセル化したものです。

A workflow encapsulates a complex multi-job extract, transform, and load (ETL) activity. Workflows generate AWS Glue crawlers, jobs, and triggers to orchestrate the loading and update of data. Lake Formation executes and tracks a workflow as a single entity. You can configure a workflow to run on demand or on a schedule.

https://docs.aws.amazon.com/lake-formation/latest/dg/workflows-about.html

実際、Lake Formation で作成されたワークフローは Glue コンソールからも確認することができます。ワークフロー自体は Glue からも作成可能ですが、Lake Formation ブループリントで用意されているデータソースについては、Lake Formation ブループリントを利用したほうが楽にワークフローを構築できます。

Lake Formation では以下のタイプのブループリントを提供しています。

  • データベース用ブループリント
    • MySQL、PostgreSQL、SQL Server 、MariaDB、Oracle からデータをインポート可能
    • データベースには JDBC で接続し、RDS や EC2 だけでなく、オンプレミスのデータベースも対象
    • 一括データロードと増分データロードのいずれかを選択可能
  • ログファイル用ブループリント
    • AWS の主要なログ (CloudTrail、ALB、CLB) をインポート
    • 一括データロードのみ

ワークフローの実行ユーザーは、ワークフローによって作成されるデータカタログテーブルに対して SELECT 権限を持ちます。

Lake Formation にデータを取り込むにあたって、必ずしもブループリントを使う必要はありません。別の方法で S3 にデータを保存し、その S3 を Lake Formation の管理下に置くことも可能です。

アクセス制御

Lake Formation の肝となる機能です。むしろ、ほぼほぼこの機能を利用するために Lake Formation を利用するかと思います。

Lake Formation のアクセス制御では、次の 2 つのレベルで権限を実装できます。

  • データベースやテーブルなどのデータカタログリソースに対するメタデータレベル
  • 統合された分析エンジンに代わって、S3 に保存されているデータへのアクセスを管理するストレージレベル

ここでは、それぞれの概要を説明します。アクセス制御の詳細は、以下の記事で取り上げています。

Lake Formation のアクセス制御
概要 Lake Formation では、 データベースやテーブルなどのデータカタログリソースに対するメタデータレベル 統合された分析エンジンに代わって、S3 に保存されているデータへのアクセスを管理するストレージレベル の 2 つのレベル...

メタデータレベルのアクセス制御

データカタログに対するアクセス制御の設定です。メタデータレベルのアクセス権を付与することにより、プリンシパルはデータカタログ内のデータベーステーブルを作成、読み取り、更新、および削除できるようになります。

プリンシパルとデータカタログを紐づける方法として、名前付きリソース方式と LF タグベースの方式があります。

ストレージレベルのアクセス制御

データカタログテーブルに紐づく S3 に対してアクセスするプリンシパルを制御する設定です。

この設定を行う場合、Lake Formation に S3 の場所とともに、その S3 にアクセス可能な IAM role を設定します。ストレージレベルのアクセス制御が有効な S3 に紐づくデータカタログを使用する場合、Lake Formation はこの IAM role の一時的な認証情報を分析サービスに返却し、分析サービスは返却された一時的な認証情報を使用して S3 にアクセスしデータを取得します。

権限管理のワークフロー

次の図は、Lake Formation でのアクセス許可管理がどのように機能するか示しています。

引用: https://docs.aws.amazon.com/lake-formation/latest/dg/how-it-works.html
  1. メタデータの取得
    • ユーザーは、Athena などの分析エンジンに対してクエリを実行します。
    • Lake Formation と統合された分析エンジンは、リクエストされているテーブルを識別し、メタデータのリクエストをデータカタログに送信します。
  2. 権限の確認
    • データカタログは、Lake Formation におけるユーザーの権限を確認します。
    • ユーザーがテーブルへのアクセスを許可されている場合は、ユーザーが表示可能なメタデータをエンジンに返却します。
  3. 資格情報の取得
    • データカタログは、分析対象データを保管する S3 が Lake Formation の管理配下にあるかを分析エンジンに連携します。
    • S3 が Lake Formation に登録されている場合、分析エンジンはデータへアクセスするための一時的な認証情報を Lake Formation に要求します。
    • S3 が Lake Formation に登録されていない場合、分析エンジンからのデータアクセスは S3 に対して直接行われます。
  4. データの取得
    • ユーザーがテーブルへのアクセスを許可されている場合、Lake Formation は分析エンジンに一時的な認証情報を提供します。
    • 分析エンジンは提供された一時的な認証情報を使用して、S3 からデータを取得します。
    • 分析エンジンはジョブの実行を終了すると結果をユーザーに返却します。

チュートリアル

AWS の公式ドキュメントに Lake Formation のチュートリアルが用意されています。今回は、CloudTrail のログを Lake Formation に取り込むチュートリアルを通して、Lake Formation を利用する際の流れを確認しようと思います。

Creating a data lake from an AWS CloudTrail source - AWS Lake Formation
A step-by-step tutorial for creating and loading a data lake from an AWS CloudTrail source using Lake Formation.

Lake Formation に関しては、以下のドキュメントで Lake Formation を利用するペルソナと推奨される IAM アクセス許可が紹介されています。今回のチュートリアルでも、このペルソナをベースに権限設定を行っています。

Lake Formation personas and IAM permissions reference - AWS Lake Formation
Use this reference of AWS Lake Formation personas and their suggested IAM permissions.

事前準備

AdministratorAccess をもつ IAM 管理者ユーザーで事前準備をしていきます。

データレイク管理者の作成

Lake Formation を初めて利用する場合、データレイク管理者を設定する必要があります。データレイク管理者は、データの場所とデータカタログリソースに対する Lake Formation アクセス制御を付与できる唯一の IAM User または IAM role です。

AdministratorAccess を持つ IAM 管理者は、データレイク管理者に設定しないことを推奨されているため、新しくデータレイク管理者用の IAM User を作成します。IAM コンソールから、datalake_admin という名前のユーザーを作成します。

今回のチュートリアル用にこちらを参考にして以下のポリシーを付与しました。

  • AWSLakeFormationDataAdmin (データレイク管理者で必須)
  • AWSGlueConsoleFullAccess (ワークフロー作成時に一部の glue アクションが必要)
  • LakeFormationSLR
  • UserPassRole

作成されたデータレイク管理者には、以下の暗黙的な Lake Formation 権限が付与されます。
https://docs.aws.amazon.com/lake-formation/latest/dg/implicit-permissions.html

IAM User の作成後、IAM 管理者ユーザーで Lake Formation コンソールにアクセスします。Lake Formation でデータレイク管理者を設定していない場合は “Welcome to Lake Formation” ウィンドウが表示されるので、先ほど作成した datalake_admin をデータレイク管理者に設定します。

データレイクユーザーの作成

データレイクを利用するユーザーを作成します。

IAM コンソールから、datalake_user という名前のユーザーを作成します。

今回のチュートリアル用にこちらを参考にして以下のポリシーを付与しました。

  • AmazonAthenaFullAccess
  • DatalakeUserBasic

ワークフロー用 IAM role の作成

ブループリントから作成するワークフローが Lake Formation にデータを取り込む際に使用する IAM role を作成します。IAM コンソールから LakeFormationWorkflowRole という名前のロールを作成します。

今回のチュートリアル用にこちらを参考にして以下のポリシーを付与しました。

  • AWSGlueServiceRole
  • LakeFormationWorkflow

デフォルト権限モデルの変更

既存のデータカタログとの互換性を確保するため、Lake Formation はデフォルトで IAM アクセスコントロールのみを使用する設定となっています。この場合、ユーザーは IAM ポリシーと S3 バケットポリシーを通じて、データへのアクセスを制御されます。Lake Formation のアクセス制御を有効にするため、今回はこのデフォルト設定を無効にします。

[Data Catalog setting] メニューより “Default permissions for newly created databases and tables” 内のチェックを両方とも外します。

CloudTrail 証跡の作成

以下を参考に CloudTrail で証跡を作成し、S3 に CloudTrail イベントを出力しておきます。
https://docs.aws.amazon.com/awscloudtrail/latest/userguide/cloudtrail-create-a-trail-using-the-console-first-time.html

ワークフロー用 IAM role の権限追加

LakeFormationWorkflowRole に対して、CloudTrail からログを読み取るための権限を追加します。

今回のチュートリアル用にこちらを参考にして以下のポリシーを付与しました。

  • DatalakeGetCloudTrail

Lake Formation に S3 を登録する

Lake Formation でデータを保管するための S3 を作成します。今回は k-log-lf-bucket という名前の S3 バケットを作成しました。

作成した S3 バケットを Lake Formation に登録していきます。datalake_admin でサインインして Lake Formation コンソールを開き、[Data lake locations] メニューにて “Register location” をクリックします。

  • 作成した S3 バケットを S3 パスに指定します。
  • IAM role はデフォルトで選択されているサービスロールのままとします。
  • 権限モードでは Lake Formation を選択します。

これで対象の S3 バケットを Lake Formation の管理下とすることができました。

データロケーションへの許可

Lake Formation に S3 を登録できたので、次は登録した S3 を参照するデータカタログの作成操作を制御します。データレイク管理者以外のユーザーが Lake Formation に登録された S3 パスに対して、好き勝手にデータベースやテーブルを作成できないように制限するための設定です。後の手順で作成するワークフローがデータを取り込めるように、ワークフローで使う IAM role に対してデータロケーションへの許可を付与します。

[Data locations] メニューにて “Grant” をクリックします。

  • 事前準備で作成したLakeFormationWorkflowRole をプリンシパルに指定します。
  • 「Storage locations」には Lake Formation に登録した S3 バケットを指定します。

前項の [Data lake locations] と名前が似ていて紛らわしいのですが、[Data locations] は [Permissions] セクション内、[Data lake locations] は [Administration] セクション内のメニューであり、役割が異なりますので注意しましょう。

データベースの作成

[Databases] メニューを開き “Create database” をクリックして、データカタログにデータベースを作成します。

テーブル作成権限の付与

ワークフローで使う IAM role に対して、データカタログにテーブルを作成するための権限を付与します。

[Databases] メニューで先ほど作成した lakeformation_cloudtrail を選択し、”Actions” > “Grant” とクリックします。

  • プリンシパルに LakeFormationWorkflowRoleを指定します。
  • 作成したデータベースが対象リソースに選択されていることを確認します。
  • 「Database permissions」として Create tableAlterDrop を選択します。

ブループリントを使用してワークフローを作成する

ブループリントを使用して CloudTrail のログをインポートするワークフローを作成します。

[Blueprints] メニューで “Use blueprint” をクリックしてブループリントを使用します。

  • 「Blueprint type」は CloudTrail を選択します。
  • インポートする証跡名とインポートするログの最初の日を指定します。
  • ターゲットには、先に作成したデータカタログデータベースと Lake Formation に登録した S3 を選択します。
  • 実行頻度をオンデマンドで設定します。
  • ワークフロー用に作成しておいた IAM role を指定し、ワークフロー名やテーブルのプレフィックスを指定します。

ワークフローの実行

ブループリントからワークフローが作成されたら、作成されたワークフローを実行してログを Lake Formation に取り込みます。今回は、実行頻度をオンデマンドで設定しているため、手動でワークフローを実行します。

[Blueprints] メニューで作成したワークフローを選択し、”Actions” > “Start” とクリックしてワークフローを実行します。ワークフローの完了まで、しばらく待ちます。

ワークフローが完了すると指定した S3 に CloudTrail ログがインポートされ、データカタログにはテーブルが作成されます。

また、Glue コンソールからブループリントで作成されたワークフローやワークフローに含まれる Glue リソースを確認することも可能です。

ユーザーへの権限付与

インポートしたデータをクエリできるように datalake_user に対して SELECT 権限を付与します。

[Databases] メニューにて lakeformation_cloudtrail を選択し、”Actions” > “Grant” とクリックします。

  • プリンシパルに datalake_user を指定します。
  • 対象リソースにワークフローで作成されたテーブルを指定します。
  • テーブル権限として Select にチェックをいれます。

ユーザーでクエリする

datalake_user でサインインし、Athena コンソールを開きます。

クエリを実行して SELECT 文が実行できることを確認します。

一方で、今回 SELECT 以外の操作は許可していないため、例えば CREATE TABLE などは失敗します。

エラーメッセージを確認してみると Lake Formation で権限が許可されておらず、操作に失敗したことがわかります。

FAILED: IllegalStateException Unxpected Exception thrown: Unable to fetch table new_table_name. Insufficient Lake Formation permission(s) on new_table_name (Service: AmazonDataCatalog; Status Code: 400; Error Code: AccessDeniedException; Request ID: xxxxx; Proxy: null)

まとめ

この記事では、Lake Formation の概要を説明し、チュートリアルに沿って具体的な操作や動作について確認してきました。

なかなか初見ではとっつきづらいサービスかと思いますが、多くの分析サービスと統合されているサービスですので、これを機に Dive Deep してみてはいかがでしょうか。

この記事が、どなたかの役に立てば幸いです。