Amazon Web Services ブログ

メインとなる AWS Lake Formation アカウントから、複数のアカウントのデータにアクセスおよび管理を行う



この記事では、中心的な AWS Lake Formation アカウントが、複数のアカウントにあるデータのアクセスや管理を行う方法を解説していきます。このウォークスルーでは、異なるアカウントにあるデータを使い、マスターとなる Lake Formation アカウントにある一元管理されたカタログを示します。 記事の中では、別のアカウントにあるカタログの読み出し、書き込み、更新、およびデータへのアクセスを行う許可を、Lake Formation サービスから付与する方法を説明します。

また、2 つのデータセットを使って、世界中から集めたニュース (gdelt) と、Amazon の製品が受けたレビューの数 (amazonreviews) との間に 相関性 が存在するかを判断していきます。

前提条件

今回の例では、それぞれ S3 バケットとアカウント番号がある、3 つのアカウントを使用する必要があります。

環境の設定

3 つのアカウントは次なようなものです。

  • Account Products (AP) – これは、Amazon の製品が受けたレビューを保存するためのアカウントです。この記事では、AWS CloudFormation を使って構成したものをデプロイします。
  • Account External (AE) – このアカウントは、100 を超える言語による放送、印刷物、ウェブニュースを世界中から集めモニタリングします。これは、毎日毎秒のように国際社会を動かし続けている、人々、場所、組織、数、テーマ、情報ソース、感情、引用、画像、出来事などを抽出します。この記事では、AWS CloudFormation を使って構成したものをデプロイします。
  • Main Account (MA) – メインとなるアカウントです。他の 2 つのアカウントからのデータを集約します。今回は、このアカウントに Lake Formation を定義します。このアカウントには、製品データと国際ニュース用のアカウントへのアクセス権限があります。

次の図は、全体的なアーキテクチャを示しています。

Account Products

AP には、次のような AWS Cloud Formation テンプレートをデプロイします。

このテンプレートにより、 productsaccountcf-bucketname-1pcfoxar1pxp (templateName-bucket-name-random_string) という名の S3 と、クロスアカウントのバケットポリシーを AP に作成します。このポリシーは、このバケットに対するルート ID アクセス権限をメインアカウントに付与します。

  • 作成した新しいバケットへの amazonreviews データセットのダウンロードには、Lambda 関数を使用します。

datalake-AccountId フィールドには、メインアカウントのアカウント番号を正確に入力します。次のスクリーンショットは今回の記事での例を示しており、MA アカウント番号は 1111111111111 となっています。

Account External

AE では、次のような AWS Cloud Formation テンプレートをデプロイします。

これにより、externalaccountcf-resultbucket-12ecq638afqiq (templateName-bucket-name_random_string) という名前の S3 バケットと、クロスアカウントのバケットポリシーが AE 内に作成されます。このポリシーは、メインアカウントにこのバケットへのアクセス許可を付与します。 また、このテンプレートでは、データセットの性質上必要とされるテーブルをデータカタログに作成します。AWS Glue のクローラを使う代りに、このテーブルの構造に従った Athena クエリが作成されます。

このテンプレートでは、Amazon Athena のクエリを実行し gdelt データセットをダウンロードします。また、Lake Formation が使用するテーブルのメタデータも作成します。

datalakeAccountid フィールドには、メインアカウントのアカウント番号を挿入する必要があります。今回の例では、MA のアカウント番号は 1111111111111です。CloudFormation に CREATE_COMPLETE と表示された段階でもクエリはまだ実行中です。これは、Athena コンソールから確認できます。Athena コンソールには、AWS マネジメントコンソールからアクセスできます。この実行中のクエリは、処理を容易にするため Parquet 形式のデータを使った新たなテーブルを AE に作成中です。

次のスクリーンショットに、クエリの履歴とステータスを示します。

これで、メインアカウントの Lake Formation において、設定作業を開始できるようになりました。

Lake Formation へのデータストアの登録

メインアカウントの Lake Formation コンソールからログインします。初めて Lake Formation にアクセスする場合は、アカウントに管理者を追加する必要があります。そのユーザーは、このアカウントでログインしているユーザーです。

データレークを追加するために、次の手順を実行します。

  1. Lake Formation コンソールの [Register and ingest] の下にある [Data lake locations] を選択します。Lake Formation 用にデータレークのストレージリソースとしてマークされた S3 バケットがページに表示されます。ここでは、1 つの S3 バケットを多くのデータセットのためのレポジトリとすることも、別々のデータソースを別々のバケットで扱うことも可能です。この記事においては、別のアカウントにある S3 バケットを登録し、Lake Formation にマスターカタログを作成します。
  2. [Register location.] をクリックします。次のスクリーンショットは [Data lake locations] ペインが表示された様子です。ここで、 AP と AE に作成したバケットを両方登録します。
  3. [Amazon S3 location] にある [Amazon S3 path] には、s3://productsaccountcf-bucketname-1pcfoxar1pxp と入力します。
  4. [IAM role] で [You need an IAM role] を選択し、S3 バケットをデータレークとして適切に使うために必要なアクセス許可 (GetObjectPutObjectDeleteObjectListBucket) を Lake Formation に付与します。このデフォルトのロールには、必要なアクセス許可が備わっています。別の方法としては、既存の IAM ロールの中から、必要なアクセス許可があり、信頼されたエンティティとして lakeformation.amazonaws.com が設定されたものを選択することもできます。
  5. [Register location.] をクリックします。次のスクリーンショットに [Amazon S3 location] ペインを示します。これでストレージリソースの準備ができたので、2 つめのバケットを登録することができます。
  6. 前出の手順を繰り返しますが、ステップ 3 で登録した AE (888888888888) のバケット「externalaccountcf-resultbucket-12ecq638afqiq」は、「s3://externalaccountcf-resultbucket-12ecq638afqiq」として登録します。

IAM ロールの設定

Lake Formation がデータセットのカタログテーブルをストレージのロケーションに作成することを許可する IAM ロールが必要です。次の手順を実行します。

  1. AWS コーンソールで IAM にアクセスし IAM ロール の作成を行います。
  2. こちらにある例を参考に、AWS Glue と AWS Lambda のポリシーをアタッチします。
  3. ロールの trust relationshipは、次に示すポリシーに修正します。
    {
      "Version": "2012-10-17",
      "Statement": [
        {
          "Sid": "",
          "Effect": "Allow",
          "Principal": {
            "Service": "glue.amazon.com", "lambda.amazon.com"
          },
          "Action": "sts:AssumeRole"
        }
      ]
    }

次のスクリーンショットを参考にインラインポリシーを追加し、Athena クエリと AWS Glue を実行してAWS CloudWatch ログの公開を行うロールのアクセス許可を S3 へ付与します。

データレイクの作成

Lake Formation は、データレイク内に Hive 互換データカタログを維持します。S3 ストレージのバックエンドにデータカタログを作成したり、Lake Formation のデータインポーターによりデータを S3 にプッシュするには (これは記事の後半で説明)、まず Lake Formation カタログの中にデータベースを作成する必要があります。

Lake Formation データベースは、後でテーブルを追加する論理構造です。それぞれのテーブルには、そのテーブルをまとめて表す S3 の 1 つ以上のオブジェクトへのマッピングが含まれます。またテーブルには、ファイル形式や S3 ロケーション、そして列の定義など、列に関する基本的なメタデータも含まれています。オプションとして、テーブルと列の任意のキーと値のペアを定義して、データをより適切に記述し、データ検出のためにクエリ可能な属性として機能させることもできます。

作成した 1 つ以上のデータベースにおけるテーブルへのデータ入力方法としては、コンソールから手動で、AWS SDK または AWS CLI を使用してプログラム的に、あるいは AWS Glue クローラーを定義して自動的に行うなどがあります。

今回の記事では、amazonreviews と gdelt の 2 つの論理データベースを定義します

  1. Lake Formation コンソールで、 [Data catalog] の下にある [Databases] を選択します。
  2. [Create database] をクリックします。次のスクリーンショットに [Databases] ペインを示します。
  3. [Name] に amazonreviews と入力します。
  4. [Location] に s3://productsaccountcf-bucketname-1pcfoxar1pxp/amazonreviews と入力します。
  5. [Description] には、簡潔で意味のある説明を入力します。
  6. [Grant All to Everyone for new tables in this database] をオフにします。
  7. [Create database] をクリックします。次のスクリーンショットに、データベースの詳細を示します。
    1. gdelt データベースを作成します。[Name] を gdelt に設定します。
    2. [Location] に s3://externalaccountcf-resultbucket-12ecq638afqiq/gdelt と入力します。
    3. [Description] には、次の例のように簡潔で意味のある説明を入力します。
    4. [Grant All to Everyone for new tables in this database] のチェックボックスをオフにします。

アクセス許可の付与

これでデータベースの作成が終わりました。次に、Lake Formation に作成したロールに対しアクセス許可を付与する必要があります。IAM ユーザーとロールの設定は、管理者として行う必要があります。

  1. Lake Formation コンソール で [Permissions] の下にある [Admins and database creators] を選択します。次のスクリーンショットのように、[Admins and database creators.] が表示されます。
  2. [Permissions] で [Data Permission] を選択します。
  3. [Actions] メニューから [Grant] を選択します。
  4. 対象の IAM ロールを選択します。
  5. [Database permissions] で [Create table] と [Grant all] をオンにします。
  6. [Grant] をクリックします。次のスクリーンショットに [Grant permissions] ペインを示します。amazonreviewsgdelt のデータベースにも、前出の手順を繰り返します。
  7. 前出の手順を、amazonreviewsgdelt にも繰り返します。次の手順では、作成したデータレークにロールのアクセス許可を付与します。
  8. [Permissions] の下にある [Data locations] を選択します。
  9. [Grant] をクリックします。
  10. 新しいロールを選択します。次のスクリーンショットに、 [Data locations] ペインを示します。
  11. [IAM users and roles] でロールを選択します。
  12. [Storage locations] に s3://productsaccountcf-bucketname-1pcfoxar1pxp と入力します。
  13. [Grant] をクリックします。次のスクリーンショットに [Grant permissions] ペインを示します。
  14. データレーク s3://externalaccountcf-resultbucket-12ecq638afqiq/ にも同じ手順を繰り返します。

メインアカウントの設定

次のような CloudFormation スタックを MA にデプロイします。

これは、amazonreviews と gdelt のデータベースにテーブルを作成します。

[Actions] メニューで、 [Grant] を選択します。 アクセス許可を付与するロールもしくはユーザーを選択し、2 つのチェックボックスをオンにします。次に、[Grant] をクリックします。

データをクエリする

この時点で、カタログ内にデータが設定されました。マスターアカウントから Athena を使い、異なるアカウントにあるデータセット間でのクエリが行えます。

次の手順を実行し、テーブルにアクセス許可を付与します。

  1. Lake Formation コンソールで [Data catalog] の下にある [Tables] を選択します。
  2. クエリするテーブルを選択します。
  3. [Actions] メニューから [Enter your role or user name] を選択します。次のスクリーンショットに [Tables] ペインを示します。
  1. [Table permissions] で [Select] をオンにします。
  2. [Grantable permissions] で、[Alter]、[Insert]、[Drop]、[Delete]、[Select]、[Grant all] をそれぞれオンにします。次のスクリーンショットに [Grant permissions] ペインを示します。
  1. ここまでの手順を、gdeltevents テーブルに対しても繰り返します。これでデータをクエリする準備ができました。
  1. [Tables] で [events] を選択します。
  2. [Actions] メニューから [View data] を選択します。次のスクリーンショットに [Tables] ペインを示します。
  1. ここまでの手順を、gdeltevents テーブルに対しても繰り返します。これでデータをクエリする準備ができました。
  1. [Tables] で [events] を選択します。
  2. [Actions] メニューから [View data] を選択します。
  3. 画面が AWS Athena コンソールに遷移します。次のスクリーンショットに Athena console を示します。
  1. [Query Editor] タブで、[reviews] と [events] への SQL クエリを入力します。

日付ごとに情報をクエリする場合は、データ列を標準化し、データを集約したビューを作成します。シーケンシャルに行う場合は、次のクエリを実行します。

CREATE VIEW amznrevw.aggreviews AS
SELECT count() as reviewcount, star_rating, verified_purchase, from_iso8601_date(review_date) as reviewdate FROM "amznrevw"."reviews2" group by star_rating, verified_purchase, review_date;

CREATE VIEW gdelt.eventsformatted AS
SELECT from_iso8601_date(substr(cast(day as varchar),1,4) || '-' || substr(cast(day as varchar),5,2)||'-' || substr(cast(day as varchar),7,2)) as eventdate, actor1code,actor1name,actor1countrycode, actor2code,actor2name,actor2countrycode FROM "gdelt"."events" ;

CREATE VIEW gdelt.eventsagregated AS
select count() as numevetns, eventdate, (count(distinct actor1code) + count(distinct actor2code)) as numactors from gdelt.eventsformatted group by eventdate;

クエリの準備ができました。次のクエリを実行することで、最大のレビュー数を伴う gdelt イベントが 5 日間にいくつ存在したかを知ることができます。

select eventdate, sum(reviewcount) as totalreviews, sum(numevetns) as totalnumevetns from gdelt.eventsagregated as event, amznrevw.aggreviews as review where event.eventdate = review.reviewdate group by eventdate order by totalreviews desc, totalnumevetns desc limit 5;

次のスクリーンショットに、このクエリの返す結果を示します。

2015 年 1 月 3 日にはレビュー数は最大ですが、gdelt イベントの数は最大ではありません (833,890) 。

次のクエリを実行すると、最大の gdelt イベント数を伴うレビューが 5 日間に何回行われたかを知ることもできます。

select eventdate, sum(reviewcount) as totalreviews, sum(numevetns) as totalnumevetns from gdelt.eventsagregated as event, amznrevw.aggreviews as review where event.eventdate = review.reviewdate group by eventdate order by totalnumevetns desc, totalreviews desc limit 5;

次のスクリーンショットに、このクエリの返す結果を示します。

2012 年の 1 月 25 日には、200 万件のイベントがありましたがレビュー数は 378 だけです。

しめくくりとして、2 つの事象の間にある相関性を、次のクエリを実行して確認します。

SELECT corr(reviewcount,
numevetns) AS review_event_correlation
FROM gdelt.eventsagregated AS event, amznrevw.aggreviews AS review
WHERE event.eventdate = review.reviewdate

次のスクリーンショットに、このクエリの返す結果を示します。

これら 2 つの列には相関性がないことを確認できます。

まとめ

今回の記事では、中心においた Lake Formation カタログを介し、データストアのクロスアカウントアクセスを行うための設定方法を説明しました。このソリューションでは、外部アカウント内に 2 つの S3 バケットを作成し、それらからデータセットのダウンロードを行い、Lake Formation にそのデータへのアクセス許可を付与するまでを示しました。同時に、データレークにあるデータの管理を Lake Formation から行う方法と、Athena と Glue クローラーを使い 2 つのデータレークにあるデータをクエリする方法をお伝えしました。

 


著者について


Shilpa Mehta は AWS のデータラボで働くソリューションアーキテクトです。
Shilpa は、お客様が AWS Data Lab でわずか 4 日間でデータと分析のプロトタイプを設計および構築できるようお手伝いをしています。

 

 

 

Laura Caicedo Camacho は AWS で働くソリューションアーキテクトです。彼女はお客様がクラウドを選択活用する際のお手伝いをしています。

 

 

 

 

Luis Caro Perez は AWS で働くソリューションアーキテクトです。  お客様と協力してアプリケーションに関する助言や技術支援を行い、AWS を使用する場面でソリューションの価値を向上させる手助けをしています。