Amazon DataZoneでデフォルトのデータレイクプロファイルで既存のS3 Bucketと連携しAthenaでクエリしてみた

Amazon DataZoneでデフォルトのデータレイクプロファイルで既存のS3 Bucketと連携しAthenaでクエリしてみた

Clock Icon2024.11.10

はじめに

データ事業本部ビッグデータチームのkasamaです。Amazon DataZoneのデフォルトのデータレイクプロファイルでは、DataZoneで作成したリソースのみにアクセス範囲が制限されています。そのため、既存のS3 BucketはデフォルトデータレイクプロファイルではAthenaで参照できない課題がありました。
既存のS3 BucketをDataZoneと連携させ、Athenaで参照するには、カスタムブループリントを使用して環境を構築する方法と、デフォルトのデータレイクプロファイルで構築した環境のIAM Roleポリシーに権限を追加する方法があります。

https://aws.amazon.com/jp/blogs/big-data/amazon-datazone-announces-custom-blueprints-for-aws-services/

比較的容易に設定できる後者の方を試したいと思います。ただIaCで管理したいとなるとカスタムブループリントの方が良いと思います。

事前準備

Admin IAM Role

以降の作業は全てAdministratorAccessポリシーを持つ、IAM Roleで作業します。
作成したIAM RoleでGlue Data CatalogをcreateできるようにAWS Lake FormationのAdministrative roles and tasksからPermissionをGrantします。同様にData lake administratorsで管理者として登録しておきます。

Screenshot 2024-11-09 at 22.35.55
Screenshot 2024-11-10 at 8.56.36

既存S3 Bucket、AWS Glue Data Catalog

手動で連携させるためのS3 Bucketを作成し、sampleデータを格納します。今回はAmazon DataZoneのworkshopで使用したorder.csvを使用します。

https://catalog.us-east-1.prod.workshops.aws/workshops/c7b9d931-6d86-4994-99e5-77ada5aaffbc/ja-JP/hands-on/data/manual

Screenshot 2024-11-09 at 22.23.08

次に手動でGlue DBを作成し、先ほどのS3格納したcsvがあるS3 PathからTarget Glue DBとなるGlue Crawlerを作成します。この辺りの設定は、先ほどのワークショップの4.Amazon DataZone で公開するデータを作成する オプション:手作業でのデータカタログ作成通りにやっています。

Screenshot 2024-11-10 at 8.44.47
Screenshot 2024-11-10 at 8.45.03

次にAWS Lake FormationのData lake permissionsでGlue CrawlerのIAM Roleに対して、作成したDBへのcreate table権限をGrantします。

Grant後はGlue Crawlerを実行し、tableが作成されることを確認します。

Screenshot 2024-11-10 at 8.53.44

Screenshot 2024-11-10 at 8.57.58

現状のAdmin権限で作成されたtableに対してAthenaで参照する場合は、AWS Lake FormationのData lake permissionsで該当tableへのselect権限が必要ですので注意してください。

Amazon DataZone デフォルトのデータレイクプロファイル

デフォルトのデータレイクプロファイルで、Sales(Producer側)プロジェクトとMarketing(Consumer側)プロジェクトを作成します。こちらについてもワークショップの以下の章を参考に作成しています。

  • ハンズオン(メイン) > 2.プロデューサー プロジェクトを作成する
  • ハンズオン(メイン) > 3.プロジェクト環境を作成する
  • ハンズオン(メイン) > 7.コンシューマー プロジェクトを作成する

Screenshot 2024-11-10 at 9.09.19

Producer側設定

Glue DBをデータアセットに登録

まずは、ProducerとなるSales環境で先ほど作成したGlue DBをデータソースとして、データアセットを作成します。データソースが作成されたら実行ボタンを押すことで、メタデータが取り込まれデータアセットが作成されます。

Screenshot 2024-11-10 at 9.20.21
Screenshot 2024-11-10 at 9.20.33
Screenshot 2024-11-10 at 9.27.03
Screenshot 2024-11-10 at 9.28.17

既存S3 BucketにAthenaで参照

Producer側の現状の設定でQuery dataからAthena画面へ遷移すると作成したcm_kasama_salesDBが参照できないことがわかります。これはAmazon DataZoneで作成されたIAM Roleで該当DBへAthena参照する権限とAWS Lake FormationのPermissionが不足しているためです。
Screenshot 2024-11-10 at 9.40.33
Screenshot 2024-11-10 at 9.40.52

sales_env環境のユーザーロールは設定から確認できます。
今回はこのIAM Roleのポリシーを修正します。
Screenshot 2024-11-10 at 9.52.28

該当のIAM Roleには3つのpolicyがありますが、1つ目と2つ目に既存のS3 BucketとGlueのARNを追記しています。

Screenshot 2024-11-10 at 10.17.33
Screenshot 2024-11-10 at 11.06.07
Screenshot 2024-11-10 at 10.25.15

次にAWS Lake Formationを設定します。該当IAM RoleからAthenaで参照するには、以下の設定が必要です。

  • データベースレベルの権限:
    • DESCRIBE 権限: データベース内のテーブルリストを表示するために必要です。
  • テーブルレベルの権限:
    • DESCRIBE 権限: テーブルのメタデータを表示するために必要です。
    • SELECT 権限: テーブルのデータを読み取るために必要です。

Screenshot 2024-11-10 at 10.33.36
Screenshot 2024-11-10 at 10.34.11

これでAthenaで参照できると思い、クエリをかけましたが、エラーとなりました。

com.amazonaws.services.s3.model.AmazonS3Exception: User: arn:aws:sts::<AWS_ACCOUNT_ID>:assumed-role/datazone_usr_<role>/ee8opl is not authorized to perform: s3:ListBucket on resource: "arn:aws:s3:::<BUCKET_NAME>" 
because no permissions boundary allows the s3:ListBucket action (Service: Amazon S3; 
Status Code: 403; Error Code: AccessDenied; Request ID: 20TQ52d2NJ; S3 Extended 
Request ID: eEvaT0=; Proxy: null), S3 Extended Request ID: IofWyCT0= (Bucket: <BUCKET_NAME>, Key: order/)

Screenshot 2024-11-10 at 10.37.26

原因は、IAM Roleに付与されているAmazonDataZoneEnvironmentRolePermissionsBoundaryというPermissionsBoundaryにあります。ListBucketの権限が特定のprefixでないと許可されない設定となっています。

Screenshot 2024-11-10 at 10.48.42

対応としては、AmazonDataZoneEnvironmentRolePermissionsBoundaryを外すか、AmazonDataZoneEnvironmentRolePermissionsBoundaryをCOPYして先ほどのConditionのみ修正したPermissionsBoundaryに置き換えるかになります。今回は簡易的な検証用途のため、外す対応としますが、プロジェクトで使用する場合は置き換えることを推奨します。

改めてAthenaでクエリしたところ成功しました。
Screenshot 2024-11-10 at 11.12.37

データアセットを公開

データアセットを公開しようとすると、管理対象外の警告が出ます。これは、公開するアセットに AWS Lake Formation のアクセス許可が適用されていないことを示します。アセットの Amazon S3 の場所をAWS Lake Formation に登録する必要があります。
Screenshot 2024-11-10 at 11.27.37

https://docs.aws.amazon.com/datazone/latest/userguide/troubleshooting-datazone.html
https://dev.classmethod.jp/articles/20220111-datalake-build/#Data%2520Lake%2520Location%25E3%2581%25AE%25E8%25BF%25BD%25E5%258A%25A0

AWS Lake FormationのData lake administratorsでIAM RoleをData lake administratorに設定します。
Screenshot 2024-11-10 at 11.33.47

AWS Lake FormationのData lake locationsでIAM Roleに、該当S3 pathのpermissionをLake Formationで設定します。
Screenshot 2024-11-10 at 11.34.52

AWS Lake FormationのData locationsでIAM Roleに、該当S3 pathへのpermissionをGrantします。
Screenshot 2024-11-10 at 12.36.19

設定した後に公開ボタンを押すと先ほどのアラートは消えているので、この状態で公開します。
Screenshot 2024-11-10 at 11.43.06

Consumer側設定

データアセットのサブスクライブ

次にConsumer側のMarketingプロジェクトで、検索ボックスからデータアセットを検索し、サブスクリプションリクエストを出します。
Screenshot 2024-11-10 at 11.45.06

Producer側のSalesプロジェクトで受信リクエストからリクエストを表示し、サブスクリプションを承認します。
Screenshot 2024-11-10 at 11.47.00

再度Consumer側に戻ると閲覧できていることがわかります。
Screenshot 2024-11-10 at 12.41.09

既存S3 BucketにAthenaで参照

MarketingプロジェクトのQuery dataからAthena参照は問題なく成功しました。サブスクリプションするとAmazon DataZone管理のGlue DBにtableが作成され、権限も付与されるため、設定変更は不要です。
(試しにProducer側のS3アクセス権限を削除したところ、Marketing側のAthenaクエリで失敗しました。Assumeしている動きに見えましたがCloudTrailからそのようなイベントは確認できなかったため、あくまで推測です。)

Screenshot 2024-11-10 at 11.58.52

最後に

手動で修正することがなかなか手間なのでIaCで管理したいところです。。
EventBridgeでDataZoneのEventは検知できます。イベントトリガーでLambdaをキックさせて権限を変更するみたいなことはやろうと思えばできますが、なかなかの手間だと思います。
https://docs.aws.amazon.com/datazone/latest/userguide/working-with-events-and-notifications.html

カスタムプロファイルで構築する方法については引き続き検証したいと思います。

2024/11/25 追記

改めて公式のワークショップを確認したところ、4.Amazon DataZone で公開するデータを作成する オプション:手作業でのデータカタログ作成4. Lake Formationにデータレイク登録という項目が追記されていました。内容は、データソースのあるS3 PathをAWS Lake FormationのData lake locationsで登録するというものです。IAM Role AWSServiceRoleForLakeFormationDataAccessに対して、該当S3 PathにPermission mode Lake Formationで登録します。
試しに手動で作成した、S3 Bucketの該当Pathに対して、AWSServiceRoleForLakeFormationDataAccessのPermissionを設定しました。

Screenshot 2024-11-25 at 7.07.52

そのあとは、Producer側で、データソースの作成、データアセット作成、データの公開を行い、Consumer側で、サブスクリプション依頼、Producerで承認をしたのちに、Consumer側でQuery dataからAthena画面へ遷移しました。
Screenshot 2024-11-25 at 7.13.58
クエリを実行したところ、S3ファイルの内容が参照できていることが確認できました。
Screenshot 2024-11-25 at 7.14.44

Data lake locationsAWSServiceRoleForLakeFormationDataAccessを登録する前後で、変化を確認したところ、登録後に許可ポリシーに対象パスへの操作権限が追加されていました。
Screenshot 2024-11-25 at 7.32.10

Amazon S3 ロケーションを登録すると、Lake Formation はAWSServiceRoleForLakeFormationDataAccessロールを引き継ぎます。これにより、その場所のデータにアクセスするAWS サービスに一時的な認証情報が付与され、datazone_prefixで始めるIAM RoleからS3へAthenaでクエリすることが成功するのです。
https://docs.aws.amazon.com/ja_jp/lake-formation/latest/dg/service-linked-roles.html
https://repost.aws/ja/knowledge-center/glue-insufficient-lakeformation-permissions
以下P17参照
https://pages.awscloud.com/rs/112-TZM-766/images/AWS-Black-Belt_2023_AWS-Lake-Formation_1010_v1.pdf

Producer側でもAthenaでクエリしたい場合は、sales_environment_sub_dbに登録されていないと参照できないため、自身のデータに対してサブスクリプションの依頼と承認を行い、sales_environment_sub_dbと紐づけることで参照するのが簡単な方法です。
Screenshot 2024-11-25 at 7.48.38

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.