Lake Formationでデータレイクを作成する

はじめに

皆さんこんにちは。

今回の記事ではAWSから2019年8月にリリースされたサービスである、Lake Formationについて紹介いたします。

Lake FormationはAWS上にデータレイクを構築するためのフルマネージドサービスです。 Lake Formationを使用することで、データの収集・クレンジング・分析を自動化し、データに対するきめ細やかなセキュリティを設定することができます。

具体的にはS3に保存されているデータからGlueを使ってデータカタログを作成し、データに対してテーブル・カラムレベルでアクセス権限の管理を行うことができます。 Lake Formationはリリースされてから日が浅く、ドキュメントも日本語版は提供されていません。 今回はドキュメント内の入門ガイドをもとに使い勝手を見ていきます。

それでは、入門ガイドに沿ってCloudTrailのログをデータレイクで管理できるようにしてみましょう。 以下の順番でLake Formationを準備していきます。

  1. IAMエンティティの作成
  2. データレイクの登録、権限付与
  3. データベースの登録、権限付与
  4. ワークフローの作成~実行
  5. アナリストによるクエリ

登場人物

今回の入門ではいくつかIAMユーザーやロールを作成する必要があるので、どのようなユーザーを作成するか紹介しておきましょう。

  • ワークフロー:Lake Formationのワークフローを実行するために必要な権限を持つロールです。

  • 管理者:データベースを作成したり、ほかのユーザーにLake Formationの権限を与えることができるユーザーです。

  • アナリスト:データレイクに対してクエリを実行できるユーザーです。

まずはじめにワークフロー用のロールを作成します。
以下の3つのインラインポリシーを付けてあげましょう。

Lake Formationへアクセスできるポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "Lakeformation",
            "Effect": "Allow",
            "Action": [
                 "lakeformation:GetDataAccess",
                 "lakeformation:GrantPermissions"
             ],
            "Resource": "*"
        }
    ]
}
自分自身のロールを渡すことができるポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PassRolePermissions",
            "Effect": "Allow",
            "Action": ["iam:PassRole"],
            "Resource": [
                "arn:aws:iam::【利用しているAWSアカウントID】:role/LakeFormationWorkflowRole"
            ]
        }
    ]
}
CloudTrailを読み取ることができるポリシー
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": "s3:GetObject",
            "Resource": ["arn:aws:s3:::【CloudTrailログが吐かれるS3バケット名】/*"]
        }
    ]
}

管理者ユーザーには、AWSGlueConsoleFullAccessAmazonAthenaFullAccessと以下2つのインラインポリシーを付与します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:*",
                "cloudtrail:DescribeTrails",
                "cloudtrail:LookupEvents"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Deny",
            "Action": [
                "lakeformation:PutDataLakeSettings"
            ],
            "Resource": "*"
        },
        {
            "Effect": "Allow",
            "Action": "iam:CreateServiceLinkedRole",
            "Resource": "*",
            "Condition": {
                "StringEquals": {
                    "iam:AWSServiceName": "lakeformation.amazonaws.com"
                }
            }
        },
        {
            "Effect": "Allow",
            "Action": [
                "iam:PutRolePolicy"
            ],
            "Resource": "arn:aws:iam::【利用しているAWSアカウントID】:role/aws-service-role/lakeformation.amazonaws.com/AWSServiceRoleForLakeFormationDataAccess"
        }
    ]
}
{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Sid": "PassRolePermissions",
            "Effect": "Allow",
            "Action": [
                "iam:PassRole"
            ],
            "Resource": [
                【ワークフロー用ロールのARN]
        }
    ]
}

アナリストユーザーは以下のインラインポリシーを設定します。

{
    "Version": "2012-10-17",
    "Statement": [
        {
            "Effect": "Allow",
            "Action": [
                "lakeformation:GetDataAccess",
                "glue:GetTable",
                "glue:GetTables",
                "glue:SearchTables",
                "glue:GetDatabase",
                "glue:GetDatabases",
                "glue:GetPartitions"
            ],
            "Resource": "*"
        }
    ]
}

ユーザーが作成できたらデータレイク用のS3バケットを1つ作成しておきましょう。
Lake Formationで集められたデータは最終的にここで作成したS3バケットにたまっていきます。

 

データレイクの登録、権限付与

ここまでできたら、管理者ユーザーとしてマネジメントコンソールにログインしなおしましょう。
Lake Formationコンソールで「Admin and databae creators」から「Grant」で Lake Formationの管理者権限をもつユーザーを指定しましょう。
Lake Formation 管理者権限

次にデータレイク用のS3バケットをLake Formationに登録します。
Lake Formationコンソールで「Data lake locations」で「Register location」を選択します。 S3バケット Lake Formationに登録

「Browse」から作成したS3バケットを選択します。 S3バケット 選択

S3バケットが登録できたら、今度はワークフローがS3バケットを参照できるようにします。

「Data locations」から「Grant」を選択します。

S3バケットを参照

Data locations

ワークフロー用のロールとデータレイク用のS3バケットを選択して「Grant」します。 データレイク用のS3バケットを選択

 

データベースの登録、権限付与

Lake Formationデータカタログとしてデータベースを登録します。
ここで登録したデータベースはデータカタログとしてAWS内で統合されGlueやAthenaからも参照することができます。

コンソールから「Databases」で「Create database」を選択します。 「Create database」を選択

「Name」を入力して他の欄は空欄のままにしておきます。
「Name」を入力

たった今作成したデータベースを操作できるように権限を与えます。
主にワークフローがデータベースを操作するのでワークフロー用のロールに権限を与えることになります。

「Data Permissions」から「Grant」を選択します。 Data Permissions

「IAM users and roles」でワークフロー用のロールを、「Database」で作成したデータベースを選択します。
「Database permissions」でどのような権限を与えるかを選択できます。
今回は「Create table」、「Alter」、「Drop」の3つの権限を与えるようにします。 Database permissions

 

ワークフローの作成~実行

いよいよワークフローを作成します。
Lake Formationで実際にデータの収集、カタログへの登録などを行うものになります。
今回はLakeFormationから提供されているBlueprintという機能を使ってCloudTrailからデータを収集するワークフローを作成します。

「Blueprint」から「Use blueprint」を選択します。 Blueprint

AWS CloudTrail」を選択します。 AWS CloudTrail

「Import source」ではインポートしたいCloudTrailソースと開始日を選択します。
「Import target」では今回作成したデータベースをS3バケットを選択します。
Data formatは「Parquet」を選択します。

「Import frequency」では「Run on demand」を選択します。 「Import options」では「IAM role」にワークフロー用のロールを選択します。  

ワークフローが作成できたら「Start it now?」から実行してみましょう。

 

アナリストによるクエリ

ワークフローによって取り込まれたデータをクエリしてみましょう。 まずはアナリストがデータをクエリできるように、テーブルに対する権限を与える必要があります。
ワークフロー用のロールに権限を与えたときと同じように「Grant Permissions」を行います。

今回はアナリスト用のユーザに対して、作成したデータベースにワークフローによって作成されたテーブルの「Select」権限を与えます。

Grant Permissions

これでアナリストユーザーとしてコンソールにログインすればAthenaからCloudTrailデータをクエリすることができます。 AthenaからCloudTrailデータをクエリ

 

おわりに

いかがでしたでしょうか。 Lake FormationはAWS Glueの拡張機能と位置付けられており、今回の構成もGlueを使えば代替することができます。
しかし、Blueprintなどで意識する必要がなくなった個所も自分で設定する必要が出てくるため思ったよりも大変な作業になります。
試しにデータレイクを作ってみるとより理解が深まると思うので、是非一緒に作ってみてください。

 

 

ブログ著者

 

 

アプリケーション開発バナー


AWS無料相談会