AWS Lake Formationでのデータレイク登録からデータアクセスまで
この記事は NTTコミュニケーションズ Advent Calendar 2021 の16日目の記事です。
はじめに
はじめまして!BS本部SS部の荒井です。データマネジメントに関するプリセールスを担当しています。
今回はアドベントカレンダー企画ということで、AWS Lake Formationに関する記事を投稿をさせていただきます。
データレイクとAWS Lake Formation
近年データ分析の盛り上がりなどから、散逸している様々な形式のデータを一元管理できるレポジトリ、いわゆるデータレイクを導入するケースが増えてきています(参考:データレイクとは)。 例えばシステムごとに保存されていた「会員データ」「購入履歴」「問合せ履歴」などのデータをデータレイクに集約することでシステム横断の顧客分析を手軽に行うことができ、利益率向上の施策を検討したり顧客離れの原因を理解することにつながります。
AWSではこのデータレイクを構築するためのLake Formation
というサービスがあります。
Lake Formation
ではデータカタログや権限管理などデータのマネジメントに関わる様々な機能を持っています。
今日はこのLake Formation
を用いて、以下の流れでデータレイク作成からデータカタログを介したデータアクセスまでの操作に関してお話ししたいと思います。
- データレイクを作成する
- 保持しているファイルをデータレイクに保存する
- データレイクに保存したファイルのメタデータを自動取得しデータカタログに登録する
- データカタログを介してファイルの中身にアクセスする
権限周りの設定やフォルダ構成など、ところどころで注意点があるのでこちらも随時説明していけたらと思います。
全体図
全体のイメージは以下になります。
流れに沿うとポイントは以下の通りです。
Lake Formation
は裏ではGlue
の機能をベースに作られているため、ここでもGlue
の機能を使います。
- データレイクを作成する ⇒ データレイクはAWSだと
S3
になります。 - 保持しているファイルをデータレイクに保存する ⇒ 今回は手動で実施します。
- データレイクに保存したファイルのメタデータを自動取得しデータカタログに登録する ⇒ メタデータの自動取得は
Glue
のCrawler
を使います。データカタログもGlue
の機能です。 - データカタログを介してファイルの中身にアクセスする ⇒ 今回は手軽にSQLを叩いてアクセスできる
Athena
を使います。
データレイクを作成する
データレイクとするS3 Bucket
を作成してLake Formation
に登録します。
以降の作業はAWSのコンソールにログインして実行します。
まずはS3 Bucket
を作成します。
S3
に移動 >バケットを作成
- 設定値で以下を入力(指定がないものはデフォルト) >
バケットを作成
- バケット名 : 任意の名称
次に作成したS3 Bucket
をLake Formation
に登録します。
なお、登録時にはIAM Role
が必要となりますが通常はAWSServiceRoleForLakeFormationDataAccess
というAWSが用意したものを使えば大丈夫です。
ただ、ユースケースによっては自分で作成する必要があります。詳しくはこちらを参照ください。
AWS Lake Formation
に移動- 初回だと
Welcome to Lake Formation
のダイアログが出るので、Add myself
>Get Started
(データレイク管理者を自分に定義) Data lake locations
>Register location
- 設定値で以下を入力(指定がないものはデフォルト) >
Register location
- Amazon S3 path : 作成した
S3 Bucket
- IAM Role :
AWSServiceRoleForLakeFormationDataAccess
or 自分で作成したIAM Role
- Amazon S3 path : 作成した
これでデータレイクの作成と登録は完了です!
保持しているファイルをデータレイクに保存する
次に、ファイルをデータレイクに保存します。
本記事では手動で行いますが、Lambda
等を使って自動化しても大丈夫です。
今回はサンプルデータとしてよく使われるタイタニック号乗客者データを使います。こちらなどからダウンロードしておきます。
S3
> データレイクのS3 Bucket
を選択フォルダの作成
からtitanic
という名称のフォルダを作成- 作成した
titanic
フォルダにタイタニック号乗客者データ(titanic.csv
)をアップロード
無事データレイクにデータを保存できました!
(補足) 今回のケースではtitanic
フォルダを1つ作成するのみでしたが、より多くの種類のデータを保存する場合にはフォルダ構成は重要です。
この後でCrawler
という機能を使ってデータカタログへ自動登録する際に、フォルダ構成に従って精査されたり各種名称が決められるためです。
以下にフォルダ構成の一例を示します。
- 例えば、サービスAの購買データ、アクセスデータ、会員データを保存する場合を考えます。
まず最初はサービスA用の大きくひとくくりのフォルダを作ります。
<データレイク用S3 Bucket> |- serviceA ←作成
次に、購買データ、アクセスデータ、会員データ用のフォルダ(
buy
,access
,member
)を作ります。<データレイク用S3 Bucket> |- serviceA |- buy ←作成 |- access ←作成 |- member ←作成
購買データは年ごとの
2020.csv
,2021.csv
というようなファイルだったとします。この場合は、作成したbuy
フォルダにそのままアップロードします。<データレイク用S3 Bucket> |- serviceA |- buy | |- 2020.csv ←アップロード | |- 2021.csv ←アップロード |- access |- member
アクセスデータは時間ごとの
2200.csv
(22時のデータ),2300.csv
(23時のデータ)というようなファイルで、日ごとのフォルダが必要だったとします。この場合は作成したaccess
フォルダ下に日付のフォルダを作り、その中にアップロードします。<データレイク用S3 Bucket> |- serviceA |- buy | |- 2020.csv | |- 2021.csv |- access | |- 20210101 ←作成 | | |- 2200.csv ←アップロード | | |- 2300.csv ←アップロード | |- 20210102 ←作成 | | |- 2200.csv ←アップロード | | |- 2300.csv ←アップロード |- member
最後に、会員データは
member.csv
という1つだけのファイルだったとします。この場合も作成したmember
フォルダにそのままアップロードします。注意点は、この場合も会員データ用のフォルダ(member
)を作らないといけなく、serviceA
フォルダ配下にアップロードしてはいけない点です。<データレイク用S3 Bucket> |- serviceA |- buy | |- 2020.csv | |- 2021.csv |- access | |- 20210101 | | |- 2200.csv | | |- 2300.csv | |- 20210102 | | |- 2200.csv | | |- 2300.csv |- member |- member.csv ←アップロード |- member.csv ←ここにアップロードするのはNG!
上記のようなフォルダ構成を取ると、この後の手順でデータカタログを自動作成した時に
buy
,access
,member
というテーブルが作成されます。※今回はこの例のようにはなりません。
データレイクに保存したファイルのメタデータを自動取得しデータカタログに登録する
次に、Glue
のCrawler
という機能を用いてデータレイクに保存したファイルのメタデータを自動取得し、データカタログに登録します。
メタデータとはフォーマット(csvやparquetなど)や構造(csvのカラムなど)、保存場所などデータがどのようなものかを表す情報になります。
まず、メタデータを登録する先となるデータカタログのデータベースを作成する作業をします。
Lake Formation
>Data catalog
下のDatabases
>Create database
- 以下を入力(指定がないものはデフォルト) >
Create database
- Name:任意の名称
また、任意でLF-Tag
をデータベースにアサインします。
LF-Tag
はLake Formation Tag
の略で、Lake Formation
内で権限管理などに使えるタグになります。
Lake Formation
ではこちらを設定して権限管理することが推奨されています。(この後の手順を進めると以下のようにLF-Tag
がrecommendedされているのが確認できます。)
ただし、どのようなLF-Tag
を定義しておくかの設計が事前に必要なのと、データレイク管理者のみがLF-Tag
を作成できることは注意が必要です。(参考:LFタグの作成)
Lake Formation
>Permissions
下のLF-Tags
>Add LF-Tag
Key
とValues
を設定してAdd LF-Tag
ここではLF-Tag
の事前の設計が必要ですが、例えば以下のようなKey
,Values
などが考えられます。Key
=env
,Values
=development, staging, production
Key
=service
,Values
=serviceA, serviceB
Key
=source
,Values
=titanic, iris
※今回はこちらを設定します。iris
の方は使用しません。
Databases
に戻り、作成したデータベースを選択 >Actions
>Edit LF-Tags
Assign new LF-Tag
を押して、設定したいKey
とValues
(今回はKey
=source
,Values
=titanic
)を選択してSave
次に、Crawler
で使用するIAMロール
を作成し権限を付与します。
権限付与はいくつか必要になりますので少し長いですが、最後に補足で各手順がどのような用途のためなのかをまとめます。
IAM
>ロール
>ロールを作成
- 以下を入力(指定がないものはデフォルト) > 最後に
ロールの作成
- ユースケース:
Glue
を選択 - アクセス権限:
AWSGlueServiceRole
- ロール名:任意の名称
- ユースケース:
- 作成した
IAMロール
を選択 >+インラインポリシーの追加
JSON
タブに切り替えて以下を入力してポリシーの確認
>名前
に任意の名称を入れてポリシーの作成
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": "s3:*",
"Resource": [
"arn:aws:s3:::<データレイクのS3バケット名>",
"arn:aws:s3:::<データレイクのS3バケット名>/*"
]
}
]
}
データベースへの権限付与を以下の手順で実施します。
Lake Formation
に移動 >Permissions
下のData lake permissions
>Grant
- 以下を入力(指定がないものはデフォルト) > 最後に
Grant
- IAM users and roles:上記で作成した
IAMロール
- LF-Tags or catalog resources
- データベースに
LF-Tag
を設定した場合はResources matched by LF-Tags (recommended)
を選択 >Add LF-Tag
でデータベースに設定したLF-Tag
のKey
,Values
を選択(今回はKey
=source
,Values
=titanic
) - 設定していない場合は
Named data catalog resources
を選択 >Databases
で作成したデータベースを選択
- データベースに
- Database permissions:
Database permissions
のSuper
を選択
- IAM users and roles:上記で作成した
データレイク(S3 Bucket
)への権限付与を以下の手順で実施します。
IAMロール
にも手順10
でS3 Bucket
への権限を付与していますが、こちらの手順も必要です。
Permissions
下のData locations
>Grant
- 以下を入力(指定がないものはデフォルト) > 最後に
Grant
- IAM users and roles:上記で作成した
IAMロール
- Storage locations:データレイクの
S3 Bucket
を選択
- IAM users and roles:上記で作成した
(補足) 各手順で設定したアクセス権限は以下の用途です。
IAMロール
への権限付与:データカタログを介さないS3
アクセスに必要 ※今回だとCrawler
がファイルのメタデータを取得するときに必要- データベースへの権限付与:データカタログのデータベースアクセスに必要 ※今回だと
Crawler
がファイルのメタデータを登録するときに必要 - データレイクへの権限付与:S3のデータに向いたデータカタログを登録するときに必要 ※今回だと
Crawler
がファイルのメタデータを登録するときに必要
ここまで長かったですが、準備が整ったのでGlue
のCrawler
を作成し、実行します。
Glue
に移動 >クローラ
>クローラの追加
- 以下を入力(指定がないものはデフォルト) > 最後に
完了
- クローラの名前:任意の名称
- Crawler source type :
Data stores
- データストアの選択:
S3
- インクルードパス:フォルダマークを押して、
データレイク保存
で作成したtitanic
フォルダ - IAM ロールの選択:
既存のIAMロールを選択
- IAMロール:上記で作成した
IAMロール
- データベース:上記で作成したデータベース
- 作成した
Crawler
を選択 >クローラの実行
完了した後にテーブル
へ移動すると、自動的にtitanic
テーブルが追加されていることを確認できます。これがtitanic.csv
のメタデータになります。
さらに中身を見てみるとデータの場所や、下にスクロールすると以下のようにカラムの情報が自動的に取得されるところも確認できます。
ここまででメタデータの自動取得とデータカタログへの登録は完了です!
データカタログを介してファイルの中身にアクセスする
データへのアクセスができるか、Athena
で確認してみます。
Athena
はサーバ不要でS3内のデータにクエリを投げられるサービスです。
クエリを投げる対象のファイルはGlue
のデータカタログにメタデータが登録されている必要がありますが、ここまでの手順で登録が完了しているのですぐに使い始めることができます。
Athena
へ移動データベース
に設定したデータベースを選択して、テーブル
にtitanic
テーブルが表示されることを確認エディタで以下を入力して
実行
SELECT * FROM titanic limit 10;
クエリの保存先に関するエラーが出たら、こちらを参考にしてクエリの出力先のS3を別途作成・設定
実行
がうまくいくと以下のようにデータの中身が表示される
Athena
を使い、データカタログを用いたデータアクセスをすることが確認できました!
特にDB等に保存しているわけではないファイルにクエリを投げられるのは便利で、S3に置いてあるファイルに対してちょっとした分析をしたいときなどに手軽に使えます。
今回は単純なSELECT *
でしたが、複雑なクエリを投げて分析することも可能です。
終わりに
今回は、AWSのLake Formation
でのデータレイク登録からデータアクセスまでを試してみました。
ご紹介したのはあくまで一例で、Lake Formation
やそのベースとなっているGlue
でできることはもっと多くのことがあるので、興味のある方は使い込んでみてください!
AWSを利用してデータレイクを構築するというユースケースは今後増えてくると思いますが、まだ調べてもサンプルケースが出てこない場合が多かったりします。 何か例を探している方がいましたら、この記事が参考になれば幸いです。
ご覧いただきありがとうございました! それでは、明日の記事もお楽しみに!