Amazon Web Services ブログ

AWS Lake Formation による効果的なデータレイクの構築 パート 1: governed tableを作成する

本記事は Amazon Web Services, Senior Big Data Architect である 関山 宜孝 によって投稿されたものです。
数千人ものお客様が Amazon Simple Storage Service でデータレイクを構築しています。 AWS Lake Formation を使用すると、数か月ではなく数日で簡単にデータレイクを構築できます。しかし、データレイクにはまだ対処すべき困難な課題がいくつかあります:

  • データレイクでのストリーミングの更新と削除(データベースレプリケーションなど)をサポートし、GDPR や CCPA などのプライバシー規制をサポート
  • テーブルレベルまたは列レベルのアクセス制御だけでなく、行レベルのアクセス制御により、きめ細かでセキュアな共有を実現
  • Amazon S3 のさまざまなテーブルやファイルのレイアウトを最適化し、分析のパフォーマンスを向上

AWS re:Invent 2020 で、Lake Formation のトランザクション、行レベルのセキュリティ、高速化のプレビューを発表しました。これらの機能は新しい API から利用でき、行レベルのセキュリティによって Lake Formation によるガバナンスを拡張し、データレイク上でのトランザクションを提供します。

以下の一連の記事では、これらの新機能の使用方法を段階的に説明します。この記事では、governed tableの作成に焦点を当てています。

AWS Lake Formationによる効果的なデータレイクの構築:

governed tableとは

Lake Formation データカタログにて新しく導入されたテーブル対応が governed table です。governed table は、原子性、一貫性、独立性、耐久性(ACID)トランザクションに対応した新しい Amazon S3 テーブルタイプです。Lake Formation のトランザクションは、ETL スクリプトとワークフローの開発を簡素化し、複数のユーザーが複数の制御テーブルを同時、かつ信頼性高く挿入、削除、変更できるようにします。Lake Formation は、バックグラウンドで governed table のストレージを自動的にコンパクションして最適化し、クエリのパフォーマンスを向上させます。

AWS CloudFormation でリソースを準備する

この記事では、Amazon S3 上の既存のデータを使用して、新しい governed table を作成する方法を示します。特に、Amazon S3 のストレージコストをかけずに作業を開始するために、governed table のロケーションにパブリック S3 バケットを使用しています。この記事では、Amazon カスタマーレビューデータセット をサンプルデータとして使用しています。パブリック S3 バケットを使用しているため、この記事では読み取り専用のユースケースに限定されます。実際のユースケースでは、オブジェクトを S3 バケットに配置し、 governed table に追加し、コンパクションを有効にすることで、さらに多くのことを実行できます。

この記事には、簡単なセットアップのための AWS CloudFormation テンプレートが含まれています。ニーズに合わせて確認し、カスタマイズできます。AWS CloudFormation ではなく AWS マネジメントコンソールでリソースを設定する場合は、この記事の最後にある付録の手順を参照してください。

CloudFormation テンプレートは、次のリソースを生成します:

このセクションの手順に従う場合は、リージョンの us-east-1 を使用します。これは、この執筆時点では、これらのLake Formation プレビュー機能は us-east-1 でのみ利用可能であるためです。

リソースを作成するには、次の手順を実行します:

  1. us-east-1 リージョンで CloudFormation コンソールにサインインします。
  2. Launch Stack を選択します:
  3. Next(次へ)を選択します。
  4. DataLakeAdminUsername および DataLakeAdminUserPassword に、データレイク管理者ユーザーの IAM ユーザー名とパスワードを入力します。
  5. DataAnalystUsername および DataAnalystUserPassword に、データアナリストユーザーの IAM ユーザー名とパスワードを入力します。
  6. DatabaseName について、デフォルトのままにします。
  7. Next(次へ) を選択します。
  8. 次のページで、Next(次へ) を選択します。
  9. 最後のページの詳細を確認し、I acknowledge that AWS CloudFormation might create IAM resources(AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。)を選択します。
  10. Create(スタックの作成) を選択します。

スタックの作成には、最大 2 分かかります。

governed table のセットアップ

ここまでで、AWS Lake Formation で最初の governed table を作成して設定する準備ができました。

governed table の作成

governed table を作成するには、次の手順を実行します:

  1. DatalakeAdmin1 ユーザーを使用して、us-east-1 リージョンの Lake Formation コンソール にサインインします。
  2. Table を選択します。
  3. Create table を選択します。
  4. Nameamazon_reviews_governed と入力します。
  5. Database に、lakeformation_tutorial_amazon_reviews と入力します。
  6. Enable governed data access and management を選択します。

Create a governed table.

  1. Data is located in で、Specified path in another account を選択します。
  2. s3://amazon-reviews-pds/parquet/ を入力します。
  3. ClassificationPARQUET を選択します。
  4. Upload Schema を選択します。
  5. テキストボックスに次の JSON 配列を入力します:

[
    {
        "Name": "marketplace",
        "Type": "string"
    },
    {
        "Name": "customer_id",
        "Type": "string"
    },
    {
        "Name": "review_id",
        "Type": "string"
    },
    {
        "Name": "product_id",
        "Type": "string"
    },
    {
        "Name": "product_parent",
        "Type": "string"
    },
    {
        "Name": "product_title",
        "Type": "string"
    },
    {
        "Name": "star_rating",
        "Type": "int"
    },
    {
        "Name": "helpful_votes",
        "Type": "int"
    },
    {
        "Name": "total_votes",
        "Type": "int"
    },
    {
        "Name": "vine",
        "Type": "string"
    },
    {
        "Name": "verified_purchase",
        "Type": "string"
    },
    {
        "Name": "review_headline",
        "Type": "string"
    },
    {
        "Name": "review_body",
        "Type": "string"
    },
    {
        "Name": "review_date",
        "Type": "bigint"
    },
    {
        "Name": "year",
        "Type": "int"
    }
]
JSON
  1. Upload を選択します。
  2. Add column を選択します。
  3. Column nameproduct_category と入力します。
  4. Data type で、String を選択します。
  5. Partition Key を選択します。
  6. Add を選択します。
  7. Submit を選択します。

これで、新しい governed table が作成されたことが確認できます。

テーブル名を選択すると、 governed table の詳細が表示され、 Governance: Enabled も表示されます。これは、このテーブルが Lake Formation の governed table であることを意味します。 governed table でない場合は、Governance: Disabled と表示されます。

Now you can see that the new governed table has been created.

また、Table properties lakeformation.aso.status: true も表示されています。これは、このテーブルに対して自動コンパクションが有効になっていることを意味します。この記事の例では、自動コンパクションは必要ありません。自動コンパクションを無効にするには、次の手順を実行します:

  1. Edit table を選択します。
  2. Automatic compaction の選択を解除します。
  3. Save を選択します。

現在、この governed table にはデータやパーティションは含まれていません。次のステップでは、マニフェスト API を使用して、この governed table に既存の S3 オブジェクトを追加します。

データが governed table の table location にある場合でも、そのデータは governed table に追加するまで認識されません。 governed table にオブジェクトを追加する前に、Lake Formation のパーミッションを設定して、必要なパーミッションをユーザーに付与します。

Even if you locate your data in the table location of the governed table, the data isn’t recognized yet.

Lake Formationのパーミッションの設定

governed table に Lake Formation のパーミッションを付与する必要があります。以下のステップを実行します:

データパーミッション

  1. DatalakeAdmin1 ユーザーを使用して、us-east-1 リージョンの Lake Formation コンソールにサインインします。
  2. PermissionData permissions を選択します。
  3. Data permission で、Grantを選択します。
  4. Principal で、IAM users and roles を選択し、ロール LFRegisterLocationServiceRole-<CloudFormation stack name> とユーザー DatalakeAdmin1 を選択します。
  5. Policy tags or catalog resources で、Named data catalog resources を選択します。
  6. Database で、lakeformation_tutorial_amazon_reviews を選択します。
  7. Table で、amazon_reviews_governed を選択します。
  8. Table permissions で、Select, Describe, Insert, Alter, Delete, Dropを選択します。
  9. Data permissions で、All data access を選択します。
  10. Grant を選択します。
  11. PermissionsData permissions を選択します。
  12. Data permission で、Grant を選択します。
  13. Principals で、IAM users and roles を選択し、ユーザー DataAnalyst1 を選択します。
  14. Policy tags or catalog resources で、Named data catalog resources を選択します。
  15. Database で、lakeformation_tutorial_amazon_reviews を選択します。
  16. Table で、amazon_reviews_governed を選択します。
  17. Table permissions で、SelectDescribe を選択します。
  18. Data permissions で、All data access を選択します。
  19. Grant を選択します。

governed table へのテーブルオブジェクトの追加

governed table にS3オブジェクトを追加するには、UpdateTableObjects APIを呼び出す必要があります。 AWS コマンドラインインターフェイス(AWS CLI)と SDK、および AWS Glue ETL ライブラリ(ライブラリ内でAPIが呼び出されます)を使用して呼び出すことができます。この記事では、AWS CLI を使用して API レベルでの動作を説明します。AWS CLI がない場合は、AWS CLI のインストール、更新、およびアンインストール を参照してください。また、Lake Formation プレビュープログラムで提供されるサービスモデルファイルもインストールする必要があります。DatalakeAdmin1 ユーザーの資格情報を使用して 、次のコマンドを実行する必要があります。

まず、StartTransaction API で新しいトランザクションを開始します:

$ aws lakeformation-preview start-transaction
{
    "TransactionId": "396880372a0045dc9c8faff2d19dfeea"
}
Bash

これで、このトランザクション内でこのテーブルにファイルを追加できます。この記事では、 amazon-reviews-pds テーブルから1つのサンプルパーティションとして product_Category=Camera を選択し、このパーティションにある 1 つのファイルを選択します。追加したファイルの UriETag 、 および Size を確認する必要があります 。それでは、この情報を見つけてコピーしましょう。

$ aws s3 ls s3://amazon-reviews-pds/parquet/product_category=Camera/
2018-04-09 15:37:05   65386769 part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:06   65619234 part-00001-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:06   64564669 part-00002-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:07   65148225 part-00003-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:07   65227429 part-00004-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:07   65269357 part-00005-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:08   65595867 part-00006-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:08   65012056 part-00007-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:09   65137504 part-00008-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
2018-04-09 15:37:09   64992488 part-00009-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet

$ aws s3api head-object --bucket amazon-reviews-pds --key parquet/product_category=Camera/part-00004-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
{
    "AcceptRanges": "bytes",
    "LastModified": "Mon, 09 Apr 2018 06:37:07 GMT",
    "ContentLength": 65227429,
    "ETag": "\"980669fcf6ccf31d2d686b9cccdd45e3-8\"",
    "ContentType": "binary/octet-stream",
    "Metadata": {}
}
Bash

write-operations1.json という名前の新しいファイルを作成し、次の JSON を入力します ( UriETag 、および Size をコピーした値に置き換えます)。

[
    {
        "AddObject": {
            "Uri": "s3://amazon-reviews-pds/parquet/product_category=Camera/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet",
            "ETag": "d4c25c40f33071620fb31cf0346ed2ec-8",
            "Size": 65386769,
            "PartitionValues": [
                "Camera"
            ]
        }
    }
]
JSON

governed table にファイルを追加するには、作成した write-operations1.json ファイルを使用して UpdateTableObjects API を呼び出します。( <transaction-id>start-transaction コマンドで取得したトランザクション ID に置き換えます)

$ aws lakeformation-preview update-table-objects --database-name lakeformation_tutorial_amazon_reviews --table-name amazon_reviews_governed --transaction-id <transaction-id> --write-operations file://./write-operations1.json
Bash

トランザクションがコミットされる前に変更を検査するには、同じトランザクション IDを使用して GetTableObjects API を呼び出します。 (<transaction-id>start-transaction コマンドで取得した ID に置き換えます)

$ aws lakeformation-preview get-table-objects --database-name lakeformation_tutorial_amazon_reviews --table-name amazon_reviews_governed --transaction-id <transaction-id>
Bash
{
    "Objects": [
        {
            "PartitionValues": [
                "Camera"
            ],
            "Objects": [
                {
                    "Uri": "s3://amazon-reviews-pds/parquet/product_category=Camera/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet",
                    "ETag": "d4c25c40f33071620fb31cf0346ed2ec-8",
                    "Size": 65386769
                }
            ]
        }
    ]
}
JSON

次に、トランザクションをコミットして、このデータをこのトランザクションの外側で他のユーザーが使用できるようにします。これを行うには、 CommitTransaction API を呼び出します。( <transaction-id> を start-transaction コマンドで取得したトランザクション ID に置き換えます)

$ aws lakeformation-preview commit-transaction --transaction-id <transaction-id>
Bash

ここで  UpdateTableObjects API 呼び出しの変更をコミットした直後に、現在の日時を書き留めておいてください。このタイムスタンプは、この例の後半でタイムトラベルクエリに使用します。

$ date -u
Wed May 26 08:12:00 UTC 2021
SQL
トランザクションをコミットすると、Lake Formation コンソール上でパーティションが確認できます。

After running the preceding command, you can see the partition on the Lake Formation console.

この例では簡略化のために、1 つのパーティションに1 つのファイルのみを追加します。実際の使用では、必要なすべてのパーティション内のすべてのファイルを追加することができます。

次のコマンドでパーティションを追加します:

  1. StartTransaction  API を呼び出して、別のLake Formation トランザクションを開始します:
    $ aws lakeformation-preview start-transaction
    {
         "TransactionId": "c96cdbeab7e34b35a383faa75b372234"
    }
    Bash
  2. amazon-reviews-pds にある Amazon S3 オブジェクトを一覧表示して 、別のサンプルファイルを選択します:
    $ aws s3 ls s3://amazon-reviews-pds/parquet/product_category=Books/
    2018-04-09 15:35:58 1094842361 part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:35:59 1093295804 part-00001-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:00 1095643518 part-00002-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:00 1095218865 part-00003-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:00 1094787237 part-00004-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:33 1094302491 part-00005-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:35 1094565655 part-00006-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:35 1095288096 part-00007-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:35 1092058864 part-00008-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    2018-04-09 15:36:35 1093613569 part-00009-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    Bash
  3. ETag と Size をコピーするために 、1 つのサンプルファイルに対して HeadObject  API を呼び出します。
    $ aws s3api head-object --bucket amazon-reviews-pds --key parquet/product_category=Books/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet
    {
         "AcceptRanges": "bytes",
         "LastModified": "Mon, 09 Apr 2018 06:35:58 GMT",
         "ContentLength": 1094842361,
         "ETag": "\"9805c2c9a0459ccf337e01dc727f8efc-131\"",
         "ContentType": "binary/octet-stream",
         "Metadata": {}
    }
    Bash
  4. write-operations2.json という名前の新しいファイルを作成し、次の JSON を入力します 。( UriETag 、および Size をコピーした値に置き換えます)
    [
        {
                "AddObject": {
                "Uri": "s3://amazon-reviews-pds/parquet/product_category=Books/part-00000-495c48e6-96d6-4650-aa65-3c36a3516ddd.c000.snappy.parquet",
                "ETag": "9805c2c9a0459ccf337e01dc727f8efc-131",
                "Size": 1094842361,
                "PartitionValues": [
                    "Books"
               ]
           }
        }
    ]
    JSON
  5. write-operations2.json を使用して  UpdateTableObjects  API を呼び出します。 ( <transaction-id>  を start-transaction   コマンドで取得したトランザクション ID に置き換えます)
    $ aws lakeformation-preview update-table-objects --database-name lakeformation_tutorial_amazon_reviews --table-name amazon_reviews_governed --transaction-id <transaction-id> --write-operations file://./write-operations2.json
    Bash

    CommitTransaction API を呼び出します ( <transaction-id>  を  start-transaction  コマンドで取得したトランザクション ID に置き換えます) 。

    $ aws lakeformation-preview commit-transaction --transaction-id <transaction-id>
    Bash
    これで、2 つのパーティションが Lake Formation コンソールに表示されます。

Now the two partitions are visible on the Lake Formation console.

Amazon Athena を使用して governed table にクエリを実行する

これで governed table は準備ができています! Amazon Athena  を使用して、 governed table のクエリを開始しましょう。DataAnalyst1 ユーザーを使用して、 us-east-1 リージョンの Athena コンソールにサインインします。

Athena でクエリを初めて実行する場合は、クエリ結果の場所を構成する必要があります。詳細は、  クエリー結果の場所の指定  を参照してください。

Lake Formation プレビュー機能を使用するには、 AmazonAthenaLakeFormationPreview という名前の特別なワークグループを作成し、そのワークグループに参加する必要があります。詳細は、 ワークグループの管理 を参照してください。

シンプルなクエリの実行

DataAnalyst1 ユーザーを使用して、 us-east-1 リージョンの Athena コンソールにサインインします。まず、 governed table に格納された 10 個のレコードをプレビューしてみましょう:

SELECT * 
FROM lakeformation.lakeformation_tutorial_amazon_reviews.amazon_reviews_governed
LIMIT 10
SQL

次のようなクエリ結果が表示されます。

The following screenshot shows the query results.

分析クエリの実行

次に、集計を使用して分析クエリを実行して、実際のユースケースをシミュレートしましょう。

SELECT product_category, count(*) as TotalReviews, avg(star_rating) as AverageRating
FROM lakeformation.lakeformation_tutorial_amazon_reviews.amazon_reviews_governed 
GROUP BY product_category
SQL

次のスクリーンショットは、クエリの実行結果を示しています。このクエリでは、レビューの合計数と製品カテゴリごとの平均評価が返されました。

The following screenshot shows the results

タイムトラベルを使用した分析クエリの実行

governed table では、タイムトラベル、つまり過去の時点でのテーブルをクエリできます。

Athena でタイムトラベルクエリを実行するには、Athena エンジンバージョン 2 を使用する必要があります。ワークグループがまだ Athena エンジンのバージョン 1 を使用している場合は、 Athena エンジンバージョン 2 を使用するようにワークグループを更新します 。

タイムトラベルクエリを送信するには、 次の構文の例のように、 SELECT  文でテーブル名の後ろに FOR SYSTEM_TIME AS OF <timestamp> を使用します

SELECT * 
FROM lakeformation.database.table
FOR SYSTEM_TIME AS OF <timestamp>
SQL

timestamp パラメータは、タイムスタンプまたはタイムゾーン付きのタイムスタンプのいずれかです。タイムゾーンを指定しない場合、Athena は UTC 時間のタイムスタンプとして値を考慮します。

2021-05-26 08:15:00 UTC の時点でデータを取得するには、タイムトラベルクエリを実行します:

SELECT product_category, count(*) as TotalReviews, avg(star_rating) as AverageRating
FROM lakeformation.lakeformation_tutorial_amazon_reviews.amazon_reviews_governed
FOR SYSTEM_TIME AS OF TIMESTAMP '2021-05-26 08:15:00 UTC'
GROUP BY product_category
SQL

次のスクリーンショットは、クエリの結果を示しています。結果には、 product_category=Camera のレコードのみが含まれます 。これは、 product_category=Books の下にあるファイルは 、 FOR SYSTEM_TIME AS OF で指定されているタイムスタンプ ( 2021-05-26 08:15:00 UTC ) の後に追加されたためです。

The following screenshot shows the query results.

クリーンアップ

最後に、リソースをクリーンアップします。

  1.  CloudFormation スタックを削除します。  作成した governed table は、スタックとともに自動的に削除されます。
  2. Athenaのワークグループ  AmazonAthenaLakeFormationPreview  を削除します。

まとめ

このブログ記事では、AWS パブリックデータセット内の既存のデータを使用して Lake Formation が governed table を作成する方法について説明しました。さらに、 governed table のクエリ方法と、 governed table に対してタイムトラベルクエリを実行する方法についても説明しました。このシリーズのパート 2 では、ストリーミングデータを取り込むための governed table の作成方法と、Lake Formation トランザクションによりストリーミング ETL を簡素化する方法を示します。

Lake Formations トランザクション、行レベルのセキュリティ、アクセラレーションは、現在、米国東部(バージニア北部)リージョンでプレビューできます。 これらの機能への早期アクセスを得るには、  プレビューにサインアップしてください  。


付録:コンソールを使用してリソースを設定する

IAM ロールと IAM ユーザーの設定

まず、2 つの IAM ロールを設定する必要があります。1 つは AWS Glue ETL ジョブ用、もう 1 つはLake Formationのデータレイクロケーション用です。

IAMポリシー

ポリシーを作成するには、次の手順を実行します:

  1. IAM コンソールで、Amazon S3 の新しいポリシーを作成します。
  2. ポリシーを  S3DataLakePolicy  として次のように保存します:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Effect": "Allow",
                "Action": [
                    "s3:PutObject",
                    "s3:GetObject",
                    "s3:DeleteObject"
                ],
                "Resource": [
                    "arn:aws:s3:::amazon-reviews-pds/*"
                ]
            },
            {
                "Effect": "Allow",
                "Action": [
                    "s3:ListBucket"
                ],
                "Resource": [
                    "arn:aws:s3:::amazon-reviews-pds"
                ]
            }
        ]
    }
    JSON
  3. 次のステートメントを使用して、LFLocationPolicy という名前の新しい IAM ポリシーを作成します:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "LFPreview1",
                "Effect": "Allow",
                "Action": "execute-api:Invoke",
                "Resource": "arn:aws:execute-api:*:*:*/*/POST/reportStatus"
            },
            {
                "Sid": "LFPreview2",
                "Effect": "Allow",
                "Action": [
                    "lakeformation:StartTransaction",
                    "lakeformation:CommitTransaction",
                    "lakeformation:CancelTransaction",
                    "lakeformation:GetTableObjects",
                    "lakeformation:UpdateTableObjects"
                ],
                "Resource": "*"
            },
            {
                "Effect": "Allow",
                "Action": [
                    "glue:GetDatabase",
                    "glue:GetDatabases",
                    "glue:GetTableVersions",
                    "glue:GetPartitions",
                    "glue:GetTable",
                    "glue:GetTables",
                    "glue:UpdateTable"
                ],
                "Resource": "*"
            }
        ]
    }
    JSON
     
              
  4. 次のステートメントを使用して、 LFQuery ポリシーという名前の新しい IAM ポリシーを作成します:
    {
        "Version": "2012-10-17",
        "Statement": [
            {
                "Sid": "LFPreview1",
                "Effect": "Allow",
                "Action": "execute-api:Invoke",
                "Resource": "arn:aws:execute-api:*:*:*/*/POST/reportStatus"
            },
            {
                "Sid": "LFPreview2",
                "Effect": "Allow",
                "Action": [
                    "lakeformation:StartTransaction",
                    "lakeformation:CommitTransaction",
                    "lakeformation:CancelTransaction",
                    "lakeformation:ExtendTransaction",
                    "lakeformation:PlanQuery",
                    "lakeformation:StartQueryPlanning",
                    "lakeformation:GetTableObjects",
                    "lakeformation:GetQueryState",
                    "lakeformation:GetWorkUnits",
                    "lakeformation:Execute",
                    "lakeformation:GetWorkUnitResults"
                ],
                "Resource": "*"
            }
        ]
    }
    JSON

    AWS Lake FormationのIAMロール

Lake Formation データレイクロケーションの IAM ロールを作成するには、以下の手順を実行します:

  1. Lake Formationの信頼関係を持つ  LFRegisterLocationServiceRole  という新しいLake Formation ロールを作成します:
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Effect": "Allow",
          "Principal": {
            "Service": [
              "lakeformation.amazonaws.com"
            ]
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }
    
    JSON

    前のステップで作成したカスタマー管理ポリシー S3DataLakePolicy と LFLocationPolicy をアタッチします。

このロールは、Lake Formation のデータレイクロケーションに登録された S3 パス配下のテーブルに Athena がクエリするときに一時クレデンシャルとして取得され使用されます。

IAM ユーザー

ユーザーを作成するには、次の手順を実行します:

  1. DatalakeAdmin   という名前の IAM ユーザーを作成します
  2. 次の AWS 管理ポリシーをアタッチします:
    1. AWSLakeFormationDataAdmin
    2. AmazonAthenaFullAccess
    3. IAMReadOnlyAccess
  3. カスタマー管理ポリシー  LFQueryPolicy  をアタッチします。
  4. Athena を使用してデータをクエリできる  DataAnalyst  という名前の IAM ユーザーを作成します。
  5. AWS 管理ポリシー  AmazonAthenaFullAccess  をアタッチします。
  6. カスタマー管理ポリシー  LFQueryPolicy  をアタッチします。

Lake Formationの設定

Lake Formation を初めて使用する場合は、以下の手順に従って AWS Lake Formation の使用を開始できます。

  1. Lake Formation コンソールの Permissions で、Admins and database creators を選択します。
  2. Data lake administrators セクションで、Grant を選択します。
  3. IAM users and roles に、IAM ユーザー  DataLakeAdmin  を選択します。
  4. Save を選択します。
  5. Database creators セクションで、Grant を選択します。
  6. IAM users and roles に、 LFRegisterLocationServiceRole  を選択します。
  7. Create Database を選択します。
  8. Grant を選択します。
  9. Register and ingest で、Data lake locations を選択します。
  10. Register location を選択します。
  11. Amazon S3 path に、データが格納されているバケットの Amazon S3 パスを入力します。 これは、LFLocationPolicy にリストしたバケットと同じである必要があります 。 Lake Formation はこのロールを使用して、バケットとその下にあるすべてのプレフィックスへの読み取り/書き込みアクセスを必要とするクエリサービスに一時的な Amazon S3 認証情報を付与します。
  12. IAM role に、 LFRegisterLocationServiceRole を選択します。
  13. Register location を選択します。
  14. Data catalog の下の、Settings を選択します。
  15. Use only IAM access control for new databasesUse only IAM access control for new tables in new databases の両方のチェックボックスがオフになっていることを確認します 。
  16. Data catalog の下の、Databases を選択します。
  17. Create database を選択します。
  18. Database を選択します。
  19. Name に、 lakeformation_tutorial_amazon_reviews と入力します。
  20. Create database を選択します。

原文はこちらです。

本ブログはソリューションアーキテクトの宮田が翻訳しました。