Como usar AWS Glue com AWS Lake Formation para acesso total à tabela
Introdução ao acesso total à tabela
O AWS Glue 5.0 é compatível com o controle de acesso total à tabela (FTA) no Apache Spark com base em suas políticas definidas no AWS Lake Formation. Esse recurso habilita operações de leitura e gravação de seus trabalhos Spark do AWS Glue em tabelas registradas no AWS Lake Formation quando o perfil de trabalho tiver acesso total à tabela. O FTA é ideal para casos de uso que precisam estar em conformidade com os regulamentos de segurança no nível da tabela e oferece suporte aos recursos do Spark, incluindo conjuntos de dados distribuídos resilientes (RDDs), bibliotecas personalizadas e funções definidas pelo usuário (UDFs) com tabelas do AWS Lake Formation.
Quando um trabalho do Spark do AWS Glue é configurado para acesso total à tabela (FTA), as credenciais do AWS Lake Formation são usadas para ler/gravar dados do Amazon S3 em tabelas registradas no AWS Lake Formation, enquanto as credenciais do perfil de runtime do trabalho serão usadas para ler/gravar tabelas não registradas no AWS Lake Formation. Esse recurso permite operações de linguagem de manipulação de dados (DML), incluindo as instruções CREATE, ALTER, DELETE, UPDATE e MERGE INTO em tabelas do Apache Hive e do Iceberg.
nota
Analise seus requisitos e determine se o controle de acesso de alta granularidade (FGAC) ou o acesso total à tabela (FTA) atende às suas necessidades. Só é possível ativar um método de permissão do AWS Lake Formation para um determinado trabalho do AWS Glue. Um trabalho não pode executar simultaneamente o acesso total à tabela (FTA) e o controle de acesso de alta granularidade (FGAC) ao mesmo tempo.
Como o acesso total à tabela (FTA) funciona no AWS Glue
O AWS Lake Formation oferece duas abordagens para controle de acesso a dados: controle de acesso de alta granularidade (FGAC) e acesso total à tabela (FTA). O FGAC fornece segurança aprimorada por meio de filtragem no nível de coluna, linha e célula, ideal para cenários que exigem permissões granulares. O FTA é ideal para cenários simples de controle de acesso em que você precisa de permissões no nível de tabela. Ele simplifica a implementação ao eliminar a necessidade de habilitar o modo de acesso refinado, melhora o desempenho e reduz os custos ao evitar o driver do sistema e os executores do sistema, além de oferecer suporte às operações de leitura e de gravação (incluindo os comandos CREATE, ALTER, DELETE, UPDATE e MERGE INTO).
No AWS Glue 4.0, o acesso a dados baseado no AWS Lake Formation funcionava por meio da classe GlueContext, a classe utilitária fornecida pelo AWS Glue. No AWS Glue 5.0, o acesso a dados baseado no AWS Lake Formation está disponível por meio do SQL nativo do Spark, o Spark DataFrames, e continua sendo suportado pela classe GlueContext.
Implementação do acesso total à tabela
Etapa 1: habilitar o acesso total à tabela no AWS Lake Formation
Para usar o modo de acesso total à tabela (FTA), você precisa permitir que mecanismos de consulta de terceiros acessem dados sem a validação da tag de sessão do IAM no AWS Lake Formation. Para habilitar, siga as etapas em Application integration for full table access.
Etapa 2: configurar permissões do IAM para o perfil de runtime do trabalho
Para acesso de leitura ou gravação aos dados subjacentes, além das permissões do AWS Lake Formation, um perfil de runtime do trabalho precisa da permissão lakeformation:GetDataAccess
do IAM. Com essa permissão, o AWS Lake Formation concede a solicitação de credenciais temporárias para acessar os dados.
Confira a seguir um exemplo de política de como fornecer permissões do IAM para acesso a um script no Amazon S3, upload de logs no Amazon S3, permissões de API do AWS Glue e permissão para acessar o AWS Lake Formation.
Etapa 2.1: configurar permissões do AWS Lake Formation
Os trabalhos do Spark do AWS Glue que leem dados do Amazon S3 exigem a permissão SELECT do AWS Lake Formation.
Os trabalhos do Spark do AWS Glue que gravam/excluem dados no Amazon S3 exigem a permissão ALL do AWS Lake Formation.
Os trabalhos do Spark do AWS Glue que interagem com o Catálogo de Dados do AWS Glue exigem as permissões DESCRIBE, ALTER, DROP, conforme apropriado.
Etapa 3: inicializar uma sessão do Spark para acesso total à tabela usando o AWS Lake Formation
Para acessar as tabelas registradas no AWS Lake Formation, é necessário definir as seguintes configurações durante a inicialização do Spark a fim de configurá-lo para usar credenciais do AWS Lake Formation.
Para acessar as tabelas registradas no AWS Lake Formation, você precisa configurar explicitamente sua sessão do Spark para usar credenciais do AWS Lake Formation. Adicione as seguintes configurações ao inicializar sua sessão do 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()
Principais configurações:
-
spark.sql.catalog.glue_catalog
: registra um catálogo chamado “glue_catalog” que usa a implementação GlueCatalog. -
spark.sql.catalog.glue_catalog.glue.lakeformation-enabled
: habilita explicitamente a integração AWS Lake Formation para esse catálogo. -
O nome do catálogo (“glue_catalog” neste exemplo) pode ser personalizado, mas precisa ser consistente em ambas as configurações.
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
: configure o EMR Filesystem (EMRFS) para usar credenciais do S3 do AWS Lake Formation para tabelas registradas do AWS Lake Formation. Se a tabela não estiver registrada, use as credenciais do perfil de runtime do trabalho. -
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
espark.hadoop.fs.s3.folderObject.autoAction.disabled=true
: configure o EMRFS para usar o cabeçalho do tipo de conteúdo application/x-directory em vez do sufixo $folder$ ao criar pastas do S3. Isso é necessário ao ler tabelas do AWS Lake Formation, pois as credenciais do AWS Lake Formation não permitem a leitura de pastas de tabelas com o sufixo $folder$. -
spark.sql.catalog.skipLocationValidationOnCreateTable.enabled=true
: configure o Spark para ignorar a validação da ausência do local da tabela antes da criação. Isso é necessário para tabelas registradas do AWS Lake Formation, pois as credenciais do AWS Lake Formation para verificar o local vazio só estão disponíveis após a criação da tabela do Catálogo de Dados do AWS Glue. Sem essa configuração, as credenciais do perfil de runtime do trabalho validarão o local da tabela vazia. -
spark.sql.catalog.createDirectoryAfterTable.enabled=true
: configure o Spark para criar a pasta do Amazon S3 após a criação da tabela no metastore do Hive. Isso é necessário para tabelas registradas do AWS Lake Formation, pois as credenciais do AWS Lake Formation para criar a pasta do Amazon S3 só estão disponíveis após a criação da tabela do Catálogo de Dados do AWS Glue. -
spark.sql.catalog.dropDirectoryBeforeTable.enabled=true
: configure o Spark para encerrar a pasta do Amazon S3 antes da exclusão da tabela no metastore do Hive. Isso é necessário para tabelas registradas do AWS Lake Formation, pois as credenciais do AWS Lake Formation para encerrar a pasta do S3 não estão disponíveis após a exclusão da tabela do Catálogo de Dados do AWS Glue. -
spark.sql.catalog.<catalog>.AWS Glue.lakeformation-enabled=true
: configure o catálogo do Iceberg para usar as credenciais do Amazon S3 do AWS Lake Formation para tabelas registradas do AWS Lake Formation. Se a tabela não estiver registrada, use as credenciais de ambiente padrão.
Padrões de uso
Como usar o FTA com DataFrames
Para usuários familiarizados com o Spark, é possível usar o DataFrames com acesso total à tabela (FTA) do AWS Lake Formation.
O AWS Glue 5.0 acrescenta suporte nativo do Spark para o acesso total à tabela do Lake Formation, simplificando a forma como você trabalha com tabelas protegidas. No AWS Glue 5.0, esse recurso permite que trabalhos do Spark do AWS Glue leiam e gravem dados diretamente quando o acesso total à tabela for concedido, removendo limitações que antes restringiam determinadas operações de extração, transformação e carregamento (ETL). Agora, você pode aproveitar os recursos avançados do Spark, incluindo conjuntos de dados distribuídos resilientes (RDDs), bibliotecas personalizadas e funções definidas pelo usuário (UDFs) com tabelas do AWS Lake Formation.
FTA nativo do Spark no AWS Glue 5.0
O AWS Glue 5.0 é compatível com o controle de acesso total à tabela (FTA) no Apache Spark com base em suas políticas definidas no AWS Lake Formation. Esse nível de controle é ideal para casos de uso que precisam estar em conformidade com os regulamentos de segurança no nível da tabela.
Exemplo de Tabela do 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()
Permissões obrigatórias do IAM
Seu perfil de execução de trabalho do AWS Glue precisa ter:
{ "Action": "lakeformation:GetDataAccess", "Resource": "*", "Effect": "Allow" }
As permissões de acesso apropriadas do S3 para seus locais de dados.
Configuração do Lake Formation
Antes de usar o FTA nativo do Spark no AWS Glue 5.0:
-
Permita que mecanismos de consulta de terceiros acessem dados sem a validação da tag de sessão do IAM no AWS Lake Formation.
-
Conceda permissões de tabela apropriadas ao seu perfil de execução de trabalho do AWS Glue por meio do console do AWS Lake Formation.
-
Configure sua sessão do Spark com os parâmetros necessários mostrados no exemplo acima.
Como usar o FTA com DynamicFrames
O DynamicFrames nativo do AWS Glue pode ser usado com o acesso total à tabela (FTA) do AWS Lake Formation para operações otimizadas de ETL. O acesso total à tabela (FTA) fornece um modelo de segurança que concede permissões no nível da tabela, permitindo um processamento mais rápido de dados em comparação com o controle de acesso de alta granularidade (FGAC), pois ignora a sobrecarga das verificações de permissão no nível de linha e de coluna. Essa abordagem é útil quando você precisa processar tabelas inteiras e as permissões no nível de tabela atendem aos seus requisitos de segurança.
No AWS Glue 4.0, o DynamicFrames com FTA exigia uma configuração específica do GlueContext. Embora o código existente do DynamicFrame no AWS Glue 4.0 com FTA continue funcionando no AWS Glue 5.0, a versão mais recente também oferece suporte nativo ao FTA do Spark com maior flexibilidade. Para novos desenvolvimentos, considere usar a abordagem nativa do Spark descrita na seção DataFrames, especialmente se você precisar de recursos adicionais, como conjuntos de dados distribuídos resilientes (RDDs), bibliotecas personalizadas e funções definidas pelo usuário (UDFs) com tabelas do AWS Lake Formation.
Permissões obrigatórias
O perfil do IAM que executa seu trabalho do Glue precisa ter:
-
Permissão
lakeformation:GetDataAccess
-
Permissões apropriadas da tabela do Lake Formation concedidas pelo console do Lake Formation
Exemplo de implementação do DynamicFrame no 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" )
Configuração adicional
Configurar o modo de acesso total à tabela em cadernos do AWS Glue Studio
Para acessar tabelas registradas do AWS Lake Formation em sessões interativas do Spark em cadernos do AWS Glue Studio, você precisa usar o modo de permissão de compatibilidade. Use o comando mágico %%configure
para definir sua configuração do Spark antes de iniciar sua sessão interativa. Essa configuração precisa ser o primeiro comando em seu caderno, pois não poderá ser aplicada após o início da sessão. Escolha a configuração com base no seu tipo de tabela:
Para tabelas do 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
Para tabelas do 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
Substitua os espaços reservados:
-
S3_DATA_LOCATION:
s3://amzn-s3-demo-bucket
-
REGION:
região da AWS (p. ex., us-east-1)
-
ACCOUNT_ID:
seu ID de conta da AWS
nota
Você precisa definir essas configurações antes de executar qualquer operação do Spark em seu caderno.
Operações com Suporte
Essas operações usarão credenciais do AWS Lake Formation para acessar os dados da tabela.
nota
Ao habilitar AWS Lake Formation:
-
Para FTA: habilite a configuração
spark.sql.catalog.{catalog_name}.glue.lakeformation-enabled
do Spark
-
CRIAR TABELA
-
ALTER TABLE
-
INSERT INTO
-
INSERT OVERWRITE
-
SELECT
-
UPDATE
-
MERGE INTO
-
DELETE FROM
-
ANALYZE TABLE
-
REPAIR TABLE
-
DESCARTAR TABELA
-
Consultas de fontes de dados do Spark
-
Gravações na fonte de dados do Spark
nota
As operações não listadas acima continuarão usando as permissões do IAM para acessar os dados da tabela.
Migrar do FTA do AWS Glue 4.0 para o AWS Glue 5.0
Ao migrar do Spark do GlueContext AWS Glue 4.0 para o FTA do Spark nativo do AWS Glue 5.0:
-
Permita que mecanismos de consulta de terceiros acessem dados sem a validação da tag de sessão do IAM no AWS Lake Formation. Confira Etapa 1: habilitar o acesso total à tabela no AWS Lake Formation.
-
Você não precisa alterar o perfil de runtime do trabalho. No entanto, verifique se o perfil de execução de trabalho do AWS Glue tem a permissão lakeformation:GetDataAccess do IAM.
-
Modifique as configurações da sessão do Spark no script. Certifique-se de que as seguintes configurações do Spark estejam presentes:
--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
-
Atualize o script de modo que os DataFrames do GlueContext sejam alterados para DataFrames nativos do Spark.
-
Atualize seu trabalho do AWS Glue para usar o AWS Glue 5.0.
Condições e limitações
-
Se uma tabela do Hive for criada usando um trabalho que não tem acesso total à tabela habilitado e nenhum registro for inserido, as leituras ou gravações subsequentes de um trabalho com acesso total à tabela falharão. Isso ocorre porque o Spark do AWS Glue sem acesso total à tabela adiciona o sufixo $folder$ ao nome da pasta da tabela. Para resolver isso, você tem as seguintes opções:
-
Insira pelo menos uma linha na tabela diretamente de um trabalho no qual o FTA não esteja habilitado.
-
Configure o trabalho no qual o FTA não está habilitado para não usar o sufixo $folder$ no nome da pasta no S3. É possível fazer isso definindo a configuração
spark.hadoop.fs.s3.useDirectoryHeaderAsFolderObject=true
do Spark. -
Crie uma pasta do Amazon S3 no local de tabela
s3://path/to/table/table_name
usando o console do Amazon S3 ou a CLI do Amazon S3.
-
-
O acesso total à tabela funciona exclusivamente com EMR Filesystem (EMRFS). O sistema de arquivos S3A não é compatível.
-
O acesso total à tabela é compatível com tabelas do Hive e do Iceberg. Ainda não há suporte para tabelas do Hudi e do Delta.
-
Os trabalhos que mencionam tabelas com regras de controle de acesso de alta granularidade (FGAC) do AWS Lake Formation ou visualizações do catálogo de dados do AWS Glue falharão. Para consultar uma tabela com regras de FGAC ou uma visualização do Catálogo de Dados do AWS Glue, você precisará usar o modo FGAC. Você pode habilitar o modo FGAC seguindo as etapas descritas na documentação do AWS: como usar o AWS Glue com o AWS Lake Formation para controle de acesso de alta granularidade.
-
O acesso total à tabela não é compatível com Spark Streaming.
-
Não pode ser usado simultaneamente com FGAC.