Utilisation d’AWS Glue avec AWS Lake Formation pour un accès complet aux tables - AWS Glue

Utilisation d’AWS Glue avec AWS Lake Formation pour un accès complet aux tables

Présentation de l’accès complet aux tables

AWS Glue 5.0 prend en charge le contrôle de l’accès complet aux tables (FTA) dans Apache Spark en fonction de vos politiques définies dans AWS Lake Formation. Cette fonctionnalité permet d’effectuer des opérations de lecture et d’écriture à partir de vos tâches AWS Glue Spark sur des tables enregistrées AWS Lake Formation lorsque le rôle de tâche dispose d’un accès complet aux tables. La fonctionnalité FTA est idéale pour les cas d’utilisation qui doivent se conformer aux réglementations de sécurité au niveau des tables et prend en charge les fonctionnalités de Spark, notamment les jeux de données distribués résilients (RDD), les bibliothèques personnalisées et les fonctions définies par l’utilisateur (UDF) avec des tables AWS Lake Formation.

Lorsqu’une tâche AWS Glue Spark est configurée pour un accès complet aux tables (FTA), les informations d’identification AWS Lake Formation sont utilisées pour lire/écrire les données Amazon S3 pour les tables enregistrées AWS Lake Formation, tandis que les informations d’identification du rôle d’exécution de la tâche sont utilisées pour lire/écrire des tables non enregistrées auprès de AWS Lake Formation. Cette fonctionnalité active les opérations de langage de manipulation de données (DML), notamment les instructions CREATE, ALTER, DELETE, UPDATE et MERGE INTO sur les tables Apache Hive et Iceberg.

Note

Examinez vos exigences et déterminez si le contrôle précis des accès (FGAC) ou l’accès complet aux tables (FTA) répondent à vos besoins. Une seule méthode d’autorisation AWS Lake Formation peut être activée pour une tâche AWS Glue donnée. Une tâche ne peut pas exécuter simultanément l’accès complet aux tables (FTA) et le contrôle précis des accès (FGAC)

Fonctionnement de l’accès complet aux tables (FTA) sur AWS Glue

AWS Lake Formation propose deux approches pour le contrôle d’accès aux données : le contrôle précis des accès (FGAC) et l’accès complet aux tables (FTA). Le FGAC assure une sécurité renforcée grâce à un filtrage au niveau des colonnes, des lignes et des cellules, l’idéal pour les scénarios nécessitant des autorisations précises. Le FTA est idéal pour les scénarios de contrôle d’accès simples où vous avez besoin d’autorisations au niveau de la table. Il simplifie la mise en œuvre en éliminant le besoin d’activer le mode d’accès précis, améliore les performances et réduit les coûts en évitant le pilote système et les exécuteurs système, et prend en charge les opérations de lecture et d’écriture (y compris les commandes CREATE, ALTER, DELETE, UPDATE et MERGE INTO).

Dans AWS Glue 4.0, l’accès aux données basé sur AWS Lake Formation fonctionnait via la classe GlueContext, la classe d’utilitaire fournie par AWS Glue. Dans AWS Glue 5.0, l’accès aux données basé sur AWS Lake Formation est disponible via Spark SQL natif, Spark DataFrames, et continue d’être pris en charge via la classe GlueContext.

Mise en œuvre de l’accès complet aux tables

Étape 1 : Activer l’accès complet aux tables dans AWS Lake Formation

Pour utiliser le mode Accès complet aux tables (FTA), vous devez autoriser les moteurs de requêtes tiers à accéder aux données sans que la balise de session IAM ne soit validée dans AWS Lake Formation. Pour l’activer, suivez les étapes de la section Intégration des applications pour un accès complet aux tables.

Étape 2 : configurer des autorisations IAM pour le rôle d’exécution des tâches

Pour accéder en lecture ou en écriture aux données sous-jacentes, ainsi qu’aux autorisations AWS Lake Formation, un rôle d’exécution de tâche nécessite l’autorisation IAM lakeformation:GetDataAccess. Avec cette autorisation, AWS Lake Formation octroie la demande d’informations d’identification temporaires pour accéder aux données.

Voici un exemple de politique expliquant comment fournir les autorisations IAM pour accéder à un script dans Amazon S3, le chargement de journaux sur Amazon S3, les autorisations d’API AWS Glue et les autorisations d’accès à AWS Lake Formation.

JSON
{ "Version":"2012-10-17", "Statement": [ { "Sid": "ScriptAccess", "Effect": "Allow", "Action": [ "s3:GetObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/scripts/*" ] }, { "Sid": "LoggingAccess", "Effect": "Allow", "Action": [ "s3:PutObject" ], "Resource": [ "arn:aws:s3:::amzn-s3-demo-bucket/logs/*" ] }, { "Sid": "GlueCatalogAccess", "Effect": "Allow", "Action": [ "glue:GetDatabase", "glue:GetDatabases", "glue:GetTable", "glue:GetTables", "glue:GetPartition", "glue:GetPartitions", "glue:CreateTable", "glue:UpdateTable" ], "Resource": [ "arn:aws:glue:us-east-1:111122223333:catalog", "arn:aws:glue:us-east-1:111122223333:database/default", "arn:aws:glue:us-east-1:111122223333:table/default/*" ] }, { "Sid": "LakeFormationAccess", "Effect": "Allow", "Action": [ "lakeformation:GetDataAccess" ], "Resource": "*" } ] }

Étape 2.1 : configurer des autorisations AWS Lake Formation

Les tâches AWS Glue Spark qui lisent des données depuis Amazon S3 nécessitent l’autorisation AWS Lake Formation SELECT.

Les tâches AWS Glue Spark qui écrivent/suppriment des données dans Amazon S3 nécessitent l’autorisation AWS Lake Formation ALL.

Les tâches AWS Glue Spark qui interagissent avec le Catalogue de données AWS Glue nécessitent les autorisations DESCRIBE, ALTER, DROP, selon le cas.

Étape 3 : initialiser une session Spark pour l’accès complet aux tables à l’aide d’AWS Lake Formation

Pour accéder aux tables enregistrées auprès d’AWS Lake Formation, les configurations suivantes doivent être définies lors de l’initialisation de Spark afin que Spark utilise les informations d’identification AWS Lake Formation.

Pour accéder aux tables enregistrées auprès d’AWS Lake Formation, vous devez configurer explicitement votre session Spark pour utiliser les informations d’identification AWS Lake Formation. Ajoutez les configurations suivantes lors de l’initialisation de votre session Spark :

from pyspark.sql import SparkSession # Initialize Spark session with Lake Formation configurations spark = SparkSession.builder \ .appName("Lake Formation Full Table Access") \ .config("spark.sql.catalog.glue_catalog", "org.apache.spark.sql.catalog.hive.GlueCatalog") \ .config("spark.sql.catalog.glue_catalog.glue.lakeformation-enabled", "true") \ .config("spark.sql.defaultCatalog", "glue_catalog") \ .getOrCreate()

Principales configurations :

  • spark.sql.catalog.glue_catalog : enregistre un catalogue nommé « glue_catalog » qui utilise l’implémentation de GlueCatalog

  • spark.sql.catalog.glue_catalog.glue.lakeformation-enabled : active explicitement l’intégration AWS Lake Formation pour ce catalogue

  • Le nom du catalogue (« glue_catalog » dans cet exemple) peut être personnalisé, mais il doit être cohérent dans les deux paramètres de configuration.

Hive

‐‐conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true

Iceberg

--conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true
  • spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.AWS Glue.accesscontrol.AWSLakeFormationCredentialResolver : configurez EMR Filesystem (EMRFS) pour utiliser les informations d’identification AWS Lake Formation S3 pour les tables enregistrées AWS Lake Formation. Si la table n’est pas enregistrée, utilisez les informations d’identification du rôle d’exécution de la tâche.

  • spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true et spark.hadoop.fs.s3.folderObject.autoAction.disabled=true : configurez EMRFS pour utiliser l’en-tête de type de contenu application/x-directory au lieu du suffixe $folder$ lors de la création de dossiers S3. Cette opération est nécessaire lors de la lecture de tables AWS Lake Formation, car les informations d’identification AWS Lake Formation ne permettent pas de lire les dossiers de tables dotées du suffixe $folder$.

  • spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true : configurez Spark pour ignorer la validation de l’emplacement vide de la table avant sa création. Cette opération est nécessaire pour les tables enregistrées AWS Lake Formation, car les informations d’identification AWS Lake Formation permettant de vérifier l’emplacement vide ne sont disponibles qu’après la création de la table du Catalogue de données AWS Glue. Sans cette configuration, les informations d’identification du rôle d’exécution de la tâche valideront l’emplacement de la table vide.

  • spark.sql.catalog.createDirectoryAfterTable.enabled=true : configurez Spark pour créer le dossier Amazon S3 après la création de la table dans le métastore Hive. Cette opération est obligatoire pour les tables enregistrées AWS Lake Formation, car les informations d’identification AWS Lake Formation permettant de créer le dossier Amazon S3 ne sont disponibles qu’après la création de la table du Catalogue de données AWS Glue.

  • spark.sql.catalog.dropDirectoryBeforeTable.enabled=true : configurez Spark pour qu’il supprime le dossier Amazon S3 avant de supprimer la table dans le métastore Hive. Cette opération est nécessaire pour les tables enregistrées AWS Lake Formation, car les informations d’identification AWS Lake Formation permettant de supprimer le dossier S3 ne sont pas disponibles après la suppression de la table du Catalogue de données AWS Glue.

  • spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true : configurez le catalogue Iceberg afin d’utiliser les informations d’identification AWS Lake Formation Amazon S3 pour les tables enregistrées AWS Lake Formation. Si la table n’est pas enregistrée, utilisez les informations d’identification d’environnement par défaut.

Modèles d’utilisation

Utilisation de FTA avec DataFrames

Pour les utilisateurs habitués à Spark, DataFrames peut être utilisé avec l’accès complet aux tables AWS Lake Formation.

AWS Glue 5.0 ajoute la prise en charge native de Spark pour l’accès complet aux tables Lake Formation, simplifiant ainsi la façon dont vous travaillez avec les tables protégées. Cette fonctionnalité permet aux tâches AWS Glue Spark AWS Glue 5.0 de lire et d’écrire directement des données lorsque l’accès complet aux tables est accordé, supprimant ainsi les restrictions imposées auparavant à certaines opérations Extraction, transformation et chargement (ETL). Vous pouvez désormais tirer parti des fonctionnalités avancées de Spark, notamment des jeux de données distribués résilients (RDD), des bibliothèques personnalisées et des fonctions définies par l’utilisateur (UDF) avec des tables AWS Lake Formation.

FTA Spark natif dans AWS Glue 5.0

AWS Glue 5.0 prend en charge le contrôle de l’accès complet aux tables (FTA) dans Apache Spark en fonction de vos politiques définies dans AWS Lake Formation. Ce niveau de contrôle est idéal pour les cas d’utilisation qui doivent être conformes aux réglementations de sécurité au niveau de la table.

Exemple de table Apache Iceberg

from pyspark.sql import SparkSession catalog_name = "spark_catalog" aws_region = "us-east-1" aws_account_id = "123456789012" warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/" spark = SparkSession.builder \ .config("spark.sql.extensions","org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions") \ .config(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkSessionCatalog") \ .config(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") \ .config(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") \ .config(f"spark.sql.catalog.{catalog_name}.glue.account-id",f"{aws_account_id}") \ .config(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") \ .config(f"spark.sql.catalog.dropDirectoryBeforeTable.enabled", "true") \ .config(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") \ .config(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") \ .config("spark.sql.defaultCatalog", catalog_name) \ # Add this line .getOrCreate() database_name = "your_database" table_name = "your_table" df = spark.sql(f"select * from {database_name}.{table_name}") df.show()

Autorisations IAM nécessaires

Votre rôle d’exécution de tâches AWS Glue doit comporter les éléments suivants :

{ "Action": "lakeformation:GetDataAccess", "Resource": "*", "Effect": "Allow" }

Plus les autorisations d’accès S3 appropriées pour vos emplacements de vos données.

Configuration de Lake Formation

Avant d’utiliser FTA Spark natif dans AWS Glue 5.0 :

  1. Autorisez les moteurs de requêtes tiers à accéder aux données sans validation des balises de session IAM dans AWS Lake Formation.

  2. Accordez les autorisations de table appropriées à votre rôle d’exécution de tâches AWS Glue via la console AWS Lake Formation.

  3. Configurez votre session Spark avec les paramètres requis indiqués dans l’exemple ci-dessus.

Utilisation de FTA avec DynamicFrames

Les DynamicFrames natifs d’AWS Glue peuvent être utilisés avec l’accès complet aux tables AWS Lake Formation pour des opérations ETL optimisées. L’accès complet aux tables (FTA) fournit un modèle de sécurité qui accorde des autorisations au niveau de la table, ce qui permet un traitement des données plus rapide que le contrôle précis des accès (FGAC), car il évite les surcharges liées aux vérifications d’autorisation au niveau des lignes et des colonnes. Cette approche est utile lorsque vous devez traiter des tables entières et que les autorisations au niveau des tables répondent à vos exigences de sécurité.

Dans AWS Glue 4.0, les DynamicFrames avec FTA nécessitaient une configuration GlueContext spécifique. Alors que le code DynamicFrame AWS Glue 4.0 existant avec FTA continuera de fonctionner dans AWS Glue 5.0, la nouvelle version offre également une prise en charge native de FTA Spark avec une plus grande flexibilité. Pour les nouveaux développements, pensez à utiliser l’approche Spark native décrite dans la section DataFrames, en particulier si vous avez besoin de fonctionnalités supplémentaires telles que des jeux de données distribués résilients (RDD), des bibliothèques personnalisées et des fonctions définies par l’utilisateur (UDF) avec des tables AWS Lake Formation.

Autorisations nécessaires

Le rôle IAM exécutant votre tâche Glue doit disposer des éléments suivants :

  • lakeformation:GetDataAccess autorisation

  • Autorisations de tables Lake Formation appropriées accordées via la console Lake Formation

Exemple de mise en œuvre de DynamicFrame dans AWS Glue 5.0

from awsglue.context import GlueContext from pyspark.context import SparkContext # Initialize Glue context sc = SparkContext() glueContext = GlueContext(sc) # Configure catalog for Iceberg tables catalog_name = "glue_catalog" aws_region = "us-east-1" aws_account_id = "123456789012" warehouse_path = "s3://amzn-s3-demo-bucket/warehouse/" spark = glueContext.spark_session spark.conf.set(f"spark.sql.catalog.{catalog_name}", "org.apache.iceberg.spark.SparkCatalog") spark.conf.set(f"spark.sql.catalog.{catalog_name}.warehouse", f"{warehouse_path}") spark.conf.set(f"spark.sql.catalog.{catalog_name}.catalog-impl", "org.apache.iceberg.aws.glue.GlueCatalog") spark.conf.set(f"spark.sql.catalog.{catalog_name}.io-impl", "org.apache.iceberg.aws.s3.S3FileIO") spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled","true") spark.conf.set(f"spark.sql.catalog.{catalog_name}.client.region",f"{aws_region}") spark.conf.set(f"spark.sql.catalog.{catalog_name}.glue.id", f"{aws_account_id}") # Read Lake Formation-protected table with DynamicFrame df = glueContext.create_data_frame.from_catalog( database="your_database", table_name="your_table" )

Configuration supplémentaire

Configuration du mode d’accès complet aux tables dans les blocs-notes AWS Glue Studio

Pour accéder aux tables enregistrées AWS Lake Formation à partir de sessions Spark interactives dans des blocs-notes AWS Glue Studio, vous devez utiliser le mode d’autorisation de compatibilité. Utilisez la commande magique %%configure pour définir votre configuration Spark avant de démarrer votre session interactive. Cette configuration doit être la première commande de votre bloc-notes, car elle ne peut pas être appliquée une fois la session démarrée. Choisissez la configuration en fonction de votre type de table :

Pour les tables Hive

%%configure --conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true

Pour les tables Iceberg

%%configure --conf spark.hadoop.fs.s3.credentialsResolverClass=com.amazonaws.glue.accesscontrol.AWSLakeFormationCredentialResolver --conf spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true --conf spark.hadoop.fs.s3.folderObject.autoAction.disabled=true --conf spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true --conf spark.sql.catalog.createDirectoryAfterTable.enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true --conf spark.sql.catalog.glue_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.glue_catalog.warehouse=s3://example-s3-bucket_DATA_LOCATION --conf spark.sql.catalog.glue_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.glue_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.catalog.glue_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.glue_catalog.glue.region=REGION

Remplacez les espaces réservés :

  • S3_DATA_LOCATION : s3://amzn-s3-demo-bucket

  • REGION : Région AWS (p. ex., us-east-1)

  • ACCOUNT_ID : Votre ID de compte AWS

Note

Vous devez définir ces configurations avant d’exécuter des opérations Spark dans votre bloc-notes.

Opérations prises en charge

Ces opérations utiliseront des informations d’identification AWS Lake Formation pour accéder aux données de la table.

Note

Lors de l’activation d’AWS Lake Formation :

  • Pour FTA : activer la configuration Spark spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled

  • CREATE TABLE

  • ALTER TABLE

  • INSERT INTO

  • INSERT OVERWRITE

  • SELECT

  • UPDATE

  • MERGE INTO

  • DELETE FROM

  • ANALYZE TABLE

  • REPAIR TABLE

  • DROP TABLE

  • Requêtes de source de données Spark

  • Écritures de source de données Spark

Note

Les opérations non répertoriées ci-dessus continueront à utiliser les autorisations IAM pour accéder aux données de la table.

Migration d’AWS Glue 4.0 vers AWS Glue 5.0 FTA

Lors de la migration d’AWS Glue 4.0 GlueContext FTA vers AWS Glue Spark FTA 5.0 natif :

  1. Autorisez les moteurs de requêtes tiers à accéder aux données sans validation des balises de session IAM dans AWS Lake Formation. Suivez Étape 1 : Activer l’accès complet aux tables dans AWS Lake Formation.

  2. Vous n’avez pas besoin de modifier le rôle d’exécution des tâches. Vérifiez toutefois que le rôle d’exécution de tâches AWS Glue dispose de l’autorisation IAM lakeformation:GetDataAccess.

  3. Modifiez les configurations de session Spark dans le script. Assurez-vous que les configurations Spark suivantes sont présentes :

    --conf spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=s3://<bucket-name>/warehouse/ --conf spark.sql.catalog.spark_catalog.client.region=<REGION> --conf spark.sql.catalog.spark_catalog.glue.account-id=ACCOUNT_ID --conf spark.sql.catalog.spark_catalog.glue.lakeformation-enabled=true --conf spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
  4. Mettez à jour le script de telle sorte que les DataFrames GlueContext soient remplacés par des DataFrames Spark natifs.

  5. Mettez à jour votre tâche AWS Glue pour utiliser AWS Glue 5.0

Considérations et restrictions

  • Si une table Hive est créée à l’aide d’une tâche pour laquelle l’accès complet aux tables n’est pas activé et qu’aucun enregistrement n’est inséré, les lectures ou écritures suivantes à partir d’une tâche avec accès complet aux tables échoueront. Cela est dû au fait qu’AWS Glue Spark sans accès complet aux tables ajoute le suffixe $folder$ au nom de dossier de la table. Pour résoudre cela, vous pouvez procéder comme suit :

    • Insérez au moins une ligne dans la table à partir d’une tâche pour laquelle FTA n’est pas activé.

    • Configurez la tâche pour laquelle FTA n’est pas activé afin de ne pas utiliser le suffixe $folder$ dans le nom du dossier dans S3. Cela peut être réalisé en configurant spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true pour Spark.

    • Créez un dossier Amazon S3 à l’emplacement de la table s3://path/to/table/table_name à l’aide de la console Amazon S3 ou de la CLI Amazon S3.

  • L’accès complet aux tables fonctionne exclusivement avec EMR Filesystem (EMRFS). S3A Filesystem n’est pas compatible.

  • L’accès complet aux tables est pris en charge pour les tables Hive et Iceberg. La prise en charge pour les tables Hudi et Delta n’a pas encore été ajoutée.

  • Les tâches faisant référence à des tables dotées de règles de contrôle précis des accès (FGAC) AWS Lake Formation ou à des vues de Catalogue de données AWS Glue échoueront. Pour interroger une table avec des règles FGAC ou une vue de Catalogue de données AWS Glue, vous devez utiliser le mode FGAC. Vous pouvez activer le mode FGAC en suivant les étapes décrites dans la documentation AWS : Using AWS Glue with AWS Lake Formation for fine-grained access control.

  • L’accès complet aux tables ne prend pas en charge Spark Streaming.

  • Ne peut pas être utilisé simultanément avec FGAC.