LakeFormationで作るデータレイク

こんにちは、開発チームの松原です。 今回はAWSのサービスであるLakeFormationを使ったデータレイクづくりについてご紹介いたします☺️

データレイクとは

ざっくりいうと、構造化データ(DBのデータなど)も非構造化データ(動画など)もまるっといれて置いておける場所です。 DWH(データウェアハウス)と違い、整形したものではなく生のままのデータを入れられるため、分析や機械学習など利用シーンを限定しません。 aws.amazon.com

LakeFormationとは

AWSのサービスの一つで、データレイクの構築を簡単に行うことができます。 aws.amazon.com LakeFormationは、AWS Glue*1 のラッパーで、より簡単にデータレイクを構築できるようになっています。 特にBlueprintsという機能では、ポチポチっとするだけでワークフローを自動で生成することができます。

今回はBlueprintsを使って、DBデータをデータレイクに入れるワークフローを作成し、Athenaからデータを参照できるようにしました。

早速つくってみる

事前準備

VPC内で構築する場合、下記の設定が必要になります。

  • RDSのセキュリティグループのインバウンドルールに自己参照ルールを追加
  • RDSがあるVPCにS3のエンドポイントを作成 docs.aws.amazon.com

LakeFormationの初期設定

セットアップAWSLake Formation - AWSLake Formationに従ってに設定します。 操作する方はIAM作成などの権限を持っている必要があります。

S3バケットの作成

データレイクとなるS3バケットをあらかじめ作成しておきます。

データベース作成

Glueのデータカタログのメタデータを保存するデータベースです。Athenaでの参照時に使われます。 f:id:matsu-krmx:20210803163519p:plain

DBへの接続設定(Glue)

抽出したいDBに接続できるように、接続先の設定を行います。 f:id:matsu-krmx:20210803163902p:plain 接続先はRDSなどの各種DBサービスから選べます。JDBCを選んで自分で設定することも可能です。

Permissionの設定

ここが一番ややこしく感じました。

設定することで、データベース・テーブル・カラム × アカウント・ロール単位といった細かい粒度でのデータへのアクセス制御を行えます。 全てのデータを入れることのできるデータレイクだからこそ、アクセスできるデータとできないデータを細かく設定することでセキュリティリスクを低減させます。

https://docs.aws.amazon.com/lake-formation/latest/dg/images/TBAC_example_tags.png

Overview of Lake Formation Tag-Based Access Control - AWS Lake Formationより

テーブル・カラムとアカウントそれぞれにタグをつけて管理するイメージです。

タグを作成します

f:id:matsu-krmx:20210803225649p:plain

データベース・テーブル・カラムごとにタグを付与します

f:id:matsu-krmx:20210803225708p:plain

IAM(もしくはrole)にタグを付与し、許可する操作を選択します

f:id:matsu-krmx:20210803230005p:plainf:id:matsu-krmx:20210803230041p:plainf:id:matsu-krmx:20210803230117p:plain

BluePrintsの設定

BluePrintsのタイプを選択します

f:id:matsu-krmx:20210803182945p:plain
今回は、実行時に全てのデータを更新したかったので Database snapshot にしました。 Incremental database を選ぶと増分アップデートが可能なので、データ内容によってはこちらでも○
f:id:matsu-krmx:20210803182939p:plain

  • Database Connection: Glue上で設定した、DBの接続情報を選びます。
  • Source data Path: 抽出したいデータベース、テーブルを設定します。ワイルドカード%)の指定も可能です。sample-database/% とすると、sample-databaseの中の全てのテーブルが抽出されます。
  • Exclude pattern: 上で指定したものの中で、抽出したくないデータベース、テーブルが設定できます。パスワード情報や管理者情報など、データ活用に必要なくセキュリティリスクの高いデータはここで除外すると良さそうです。

f:id:matsu-krmx:20210803182928p:plain

  • Target database: Glue上で設定した、データベースを選択します。
  • Target storage location: データレイクとするS3バケットを選択します。
  • Data format: データ保存の型を選択します。データを使用する際のパフォーマンスに影響するので、今回は列指向型のParquetを選択しました。
  • frequency: 実行頻度を設定します。随時か日付実行を選択。cron形式で指定も可能です。

f:id:matsu-krmx:20210803182934p:plain

  • Workflow name: ワークフローの名前
  • IAM role: ワークフローを実行するIAM(ここでは初期設定で作成した LakeFormationWorkflowRole
  • Table prefix: RDSでのテーブル名の前に付きます
  • Maximum capacity: ジョブ実行時に割り当てられるDPUの最大数
  • Concurrency: ジョブの最大同時実行数

できあがり

f:id:matsu-krmx:20210804115017p:plain こちらができあがったワークフローです。一つ一つのジョブを設定することを考えると、ありがたさが身にしみますね。

Athenaで確認

f:id:matsu-krmx:20210803222820p:plain

AWSDataCatalogの中に今回作成したデータベースが追加されており、RDS上のデータが入っていることが確認できました😽

おわりに

データレイクができてしまえば、AWS GlueのETL機能を使ってデータの整形を行ったり、Amazon SageMakerから機械学習を行ってみたり、Amazon QuickSightで可視化してみたりと、調理方法は無限大です☺️

テックアカデミーチームでもどんどんデータを活用していきたいと思います💪

参考資料

booth.pm www.nikkeibp.co.jp

*1:Glueをまず触ってみたいという方は、ハンズオンを試してみるのがわかりやすくおすすめです。 (下記リンクの "はじめてのデータレイクハンズオン ~データの可視化と整形をやってみよう編~" から資料&動画が参照可能です) aws.amazon.com