Amazon Web Services ブログ
AWS Lake Formation による効果的なデータレイクの構築 パート 1: governed tableを作成する
- データレイクでのストリーミングの更新と削除(データベースレプリケーションなど)をサポートし、GDPR や CCPA などのプライバシー規制をサポート
- テーブルレベルまたは列レベルのアクセス制御だけでなく、行レベルのアクセス制御により、きめ細かでセキュアな共有を実現
- Amazon S3 のさまざまなテーブルやファイルのレイアウトを最適化し、分析のパフォーマンスを向上
AWS re:Invent 2021 で、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 を作成する方法を示します。特に、governed table のロケーションにパブリック S3 バケットを使用しています。この記事では、Amazon カスタマーレビューデータセット をサンプルデータとして使用しています。パブリック S3 バケットを使用しているため、この記事では読み取り専用のユースケースに限定されます。実際のユースケースでは、オブジェクトを S3 バケットに配置し、 governed table に追加し、コンパクションを有効にすることで、さらに多くのことを実行できます。
この記事には、簡単なセットアップのための AWS CloudFormation テンプレートが含まれています。ニーズに合わせて確認し、カスタマイズできます。AWS CloudFormation ではなく AWS マネジメントコンソールでリソースを設定する場合は、この記事の最後にある付録の手順を参照してください。
CloudFormation テンプレートは、次のリソースを生成します:
- AWS Identity and Access Management(IAM)ユーザー、ロール、ポリシー
- AWS Lake Formation のデータレイク設定とパーミッション
リソースを作成するには、次の手順を実行します:
us-east-1
リージョンで CloudFormation コンソールにサインインします。- Launch Stack を選択します:
- Next(次へ)を選択します。
- DataLakeAdminUsername および DataLakeAdminUserPassword に、データレイク管理者ユーザーの IAM ユーザー名とパスワードを入力します。
- DataAnalystUsername および DataAnalystUserPassword に、データアナリストユーザーの IAM ユーザー名とパスワードを入力します。
- DatabaseName について、デフォルトのままにします。
- Next(次へ) を選択します。
- 次のページで、Next(次へ) を選択します。
- 最後のページの詳細を確認し、I acknowledge that AWS CloudFormation might create IAM resources(AWS CloudFormation によって IAM リソースがカスタム名で作成される場合があることを承認します。)を選択します。
- Create(スタックの作成) を選択します。
スタックの作成には、最大 2 分かかります。
governed table のセットアップ
ここまでで、AWS Lake Formation で最初の governed table を作成して設定する準備ができました。
governed table の作成
governed table を作成するには、次の手順を実行します:
DatalakeAdmin1
ユーザーを使用して、us-east-1
リージョンの Lake Formation コンソール にサインインします。- Table を選択します。
- Create table を選択します。
- Name に
amazon_reviews_governed
と入力します。 - Database に、
lakeformation_tutorial_amazon_reviews
と入力します。 - Enable governed data access and management を選択します。
- Data is located in で、Specified path in my account を選択します。
s3://amazon-reviews-pds/parquet/
を入力します。- Classification で PARQUET を選択します。
- Upload Schema を選択します。
- テキストボックスに次の JSON 配列を入力します:
- Upload を選択します。
- Add column を選択します。
- Column name に
product_category
と入力します。 - Data type で、String を選択します。
- Partition Key を選択します。
- Add を選択します。
- Submit を選択します。
これで、新しい governed table が作成されたことが確認できます。
テーブル名を選択すると、 governed table の詳細が表示され、 Governance: Enabled
も表示されます。これは、このテーブルが Lake Formation の governed table であることを意味します。 governed table でない場合は、Governance: Disabled
と表示されます。
デフォルトで、自動コンパクションは governed table に対して有効になっています。この記事の例では、自動コンパクションは必要ではありません。AWS Command Line Interface (AWS CLI) や SDK を使用して自動コンパクションを無効にできます。自動コンパクションを無効にするには、次のコマンドを実行します。
現在、この governed table にはデータやパーティションは含まれていません。次のステップでは、マニフェスト API を使用して、この governed table に既存の S3 オブジェクトを追加します。
データが governed table の table location にある場合でも、そのデータは governed table に追加するまで認識されません。 governed table にオブジェクトを追加する前に、Lake Formation のパーミッションを設定して、必要なパーミッションをユーザーに付与します。
Lake Formationのパーミッションの設定
governed table に Lake Formation のパーミッションを付与する必要があります。以下のステップを実行します:
データパーミッション
DatalakeAdmin1
ユーザーを使用して、us-east-1
リージョンの Lake Formation コンソールにサインインします。- Permission で Data lake permissions を選択します。
- Data permission で、Grantを選択します。
- Principal で、IAM users and roles を選択し、ロール
LFRegisterLocationServiceRole-<CloudFormation stack name>
とユーザーDatalakeAdmin1
を選択します。 - Policy tags or catalog resources で、Named data catalog resources を選択します。
- Database で、
lakeformation_tutorial_amazon_reviews
を選択します。 - Table で、
amazon_reviews_governed
を選択します。 - Table permissions で、Select, Describe, Insert, Alter, Delete, Dropを選択します。
- Data permissions で、All data access を選択します。
- Grant を選択します。
- Permissions で Data lake permissions を選択します。
- Data permission で、Grant を選択します。
- Principals で、IAM users and roles を選択し、ユーザー
DataAnalyst1
を選択します。 - Policy tags or catalog resources で、Named data catalog resources を選択します。
- Database で、
lakeformation_tutorial_amazon_reviews
を選択します。 - Table で、
amazon_reviews_governed
を選択します。 - Table permissions で、Select と Describe を選択します。
- Data permissions で、All data access を選択します。
- 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 で新しいトランザクションを開始します:
これで、このトランザクション内でこのテーブルにファイルを追加できます。この記事では、 amazon-reviews-pds
テーブルから1つのサンプルパーティションとして product_Category=Camera
を選択し、このパーティションにある 1 つのファイルを選択します。追加したファイルの Uri
、 ETag
、 および Size
を確認する必要があります 。それでは、この情報を見つけてコピーしましょう。
write-operations1.json
という名前の新しいファイルを作成し、次の JSON を入力します ( Uri
、 ETag
、および Size
をコピーした値に置き換えます)。
governed table にファイルを追加するには、作成した write-operations1.json
ファイルを使用して UpdateTableObjects
API を呼び出します。( <transaction-id> を start-transaction
コマンドで取得したトランザクション ID に置き換えます)
トランザクションがコミットされる前に変更を検査するには、同じトランザクション IDを使用して GetTableObjects
API を呼び出します (<transaction-id> を start-transaction
コマンドで取得した ID に置き換えます)。トランザクションに上記の変更が適用されていないとこのコマンドは成功しないため、このコマンドは2回実行する必要があるかもしれません。2回目の実行時には、 UpdateTableObjects
オペレーションは成功しているでしょう。
次に、トランザクションをコミットして、このデータをこのトランザクションの外側で他のユーザーが使用できるようにします。これを行うには、 CommitTransaction
API を呼び出します。( <transaction-id> を start-transaction
コマンドで取得したトランザクション ID に置き換えます)
ここで UpdateTableObjects
API 呼び出しの変更をコミットした直後に、現在の日時を書き留めておいてください。このタイムスタンプは、この例の後半でタイムトラベルクエリに使用します。
この例では簡略化のために、1 つのパーティションに1 つのファイルのみを追加します。実際の使用では、必要なすべてのパーティション内のすべてのファイルを追加することができます。
次のコマンドでパーティションを追加します:
StartTransaction
API を呼び出して、別のLake Formation トランザクションを開始します:amazon-reviews-pds
にある Amazon S3 オブジェクトを一覧表示して 、別のサンプルファイルを選択します:ETag
とSize
をコピーするために 、1 つのサンプルファイルに対してHeadObject
API を呼び出します。write-operations2.json
という名前の新しいファイルを作成し、次の JSON を入力します 。(Uri
、ETag
、およびSize
をコピーした値に置き換えます)write-operations2.json
を使用してUpdateTableObjects
API を呼び出します。 ( <transaction-id> をstart-transaction
コマンドで取得したトランザクション ID に置き換えます)
Amazon Athena を使用して governed table にクエリを実行する
これで governed table は準備ができています! Amazon Athena を使用して、 governed table のクエリを開始しましょう。DataAnalyst1
ユーザーを使用して、 us-east-1
リージョンの Athena コンソールにサインインします。
Athena でクエリを初めて実行する場合は、クエリ結果の場所を構成する必要があります。詳細は、 クエリー結果の場所の指定 を参照してください。
Lake Formation プレビュー機能を使用するには、 AmazonAthenaLakeFormation
という名前の特別なワークグループを作成し、そのワークグループに参加する必要があります。詳細は、 ワークグループの管理 を参照してください。
シンプルなクエリの実行
DataAnalyst1
ユーザーを使用して、 us-east-1
リージョンの Athena コンソールにサインインします。まず、 governed table に格納された 10 個のレコードをプレビューしてみましょう:
次のようなクエリ結果が表示されます。
分析クエリの実行
次に、集計を使用して分析クエリを実行して、実際のユースケースをシミュレートしましょう。
次のスクリーンショットは、クエリの実行結果を示しています。このクエリでは、レビューの合計数と製品カテゴリごとの平均評価が返されました。
タイムトラベルを使用した分析クエリの実行
governed table では、タイムトラベル、つまり過去の時点でのテーブルをクエリできます。
Athena でタイムトラベルクエリを実行するには、Athena エンジンバージョン 2 を使用する必要があります。ワークグループがまだ Athena エンジンのバージョン 1 を使用している場合は、 Athena エンジンバージョン 2 を使用するようにワークグループを更新します 。
タイムトラベルクエリを送信するには、 次の構文の例のように、 SELECT
文でテーブル名の後ろに FOR SYSTEM_TIME AS OF <timestamp>
を使用します
timestamp パラメータは、タイムスタンプまたはタイムゾーン付きのタイムスタンプのいずれかです。タイムゾーンを指定しない場合、Athena は UTC 時間のタイムスタンプとして値を考慮します。
2021-05-26 08:15:00 UTC
の時点でデータを取得するには、タイムトラベルクエリを実行します:
次のスクリーンショットは、クエリの結果を示しています。結果には、 product_category=Camera
のレコードのみが含まれます 。これは、 product_category=Books
の下にあるファイルは 、 FOR SYSTEM_TIME AS OF
で指定されているタイムスタンプ ( 2021-05-26 08:15:00 UTC
) の後に追加されたためです。
クリーンアップ
最後に、リソースをクリーンアップします。
- CloudFormation スタックを削除します。 作成した governed table は、スタックとともに自動的に削除されます。
- Athenaのワークグループ
AmazonAthenaLakeFormation
を削除します。
まとめ
このブログ記事では、AWS パブリックデータセット内の既存のデータを使用して Lake Formation が governed table を作成する方法について説明しました。さらに、 governed table のクエリ方法と、 governed table に対してタイムトラベルクエリを実行する方法についても説明しました。このシリーズのパート 2 では、ストリーミングデータを取り込むための governed table の作成方法と、Lake Formation トランザクションによりストリーミング ETL を簡素化する方法を示します。
付録:コンソールを使用してリソースを設定する
IAM ロールと IAM ユーザーの設定
まず、2 つの IAM ロールを設定する必要があります。1 つは AWS Glue ETL ジョブ用、もう 1 つはLake Formationのデータレイクロケーション用です。
IAMポリシー
ポリシーを作成するには、次の手順を実行します:
- IAM コンソールで、Amazon S3 の新しいポリシーを作成します。
- ポリシーを
S3DataLakePolicy
として次のように保存します: - 次のステートメントを使用して、
LFLocationPolicy
という名前の新しい IAM ポリシーを作成します: - 次のステートメントを使用して、
LFQuery
ポリシーという名前の新しい IAM ポリシーを作成します:AWS Lake FormationのIAMロール
Lake Formation データレイクロケーションの IAM ロールを作成するには、以下の手順を実行します:
- Lake Formationの信頼関係を持つ
LFRegisterLocationServiceRole
という新しいLake Formation ロールを作成します:前のステップで作成したカスタマー管理ポリシー
S3DataLakePolicy
とLFLocationPolicy
をアタッチします。
このロールは、Lake Formation のデータレイクロケーションに登録された S3 パス配下のテーブルに Athena がクエリするときに一時クレデンシャルとして取得され使用されます。
IAM ユーザー
ユーザーを作成するには、次の手順を実行します:
DatalakeAdmin
という名前の IAM ユーザーを作成します- 次の AWS 管理ポリシーをアタッチします:
AWSLakeFormationDataAdmin
AmazonAthenaFullAccess
IAMReadOnlyAccess
- カスタマー管理ポリシー
LFQueryPolicy
をアタッチします。 - Athena を使用してデータをクエリできる
DataAnalyst
という名前の IAM ユーザーを作成します。 - AWS 管理ポリシー
AmazonAthenaFullAccess
をアタッチします。 - カスタマー管理ポリシー
LFQueryPolicy
をアタッチします。
Lake Formationの設定
Lake Formation を初めて使用する場合は、以下の手順に従って AWS Lake Formation の使用を開始できます。
- Lake Formation コンソールの Permissions で、Admins and database creators を選択します。
- Data lake administrators セクションで、Grant を選択します。
- IAM users and roles に、IAM ユーザー
DataLakeAdmin
を選択します。 - Save を選択します。
- Database creators セクションで、Grant を選択します。
- IAM users and roles に、
LFRegisterLocationServiceRole
を選択します。 - Create Database を選択します。
- Grant を選択します。
- Register and ingest で、Data lake locations を選択します。
- Register location を選択します。
- Amazon S3 path に、データが格納されているバケットの Amazon S3 パスを入力します。 これは、
LFLocationPolicy
にリストしたバケットと同じである必要があります 。 Lake Formation はこのロールを使用して、バケットとその下にあるすべてのプレフィックスへの読み取り/書き込みアクセスを必要とするクエリサービスに一時的な Amazon S3 認証情報を付与します。 - IAM role に、
LFRegisterLocationServiceRole
を選択します。 - Register location を選択します。
- Data catalog の下の、Settings を選択します。
- Use only IAM access control for new databases とUse only IAM access control for new tables in new databases の両方のチェックボックスがオフになっていることを確認します 。
- Data catalog の下の、Databases を選択します。
- Create database を選択します。
- Database を選択します。
- Name に、
lakeformation_tutorial_amazon_reviews
と入力します。 - Create database を選択します。
原文はこちらです。
本ブログはソリューションアーキテクトの宮田が翻訳しました。