

# Usar o AWS Glue com AWS Lake Formation para controle de acesso refinado
<a name="security-lf-enable"></a>

## Visão geral
<a name="security-lf-enable-overview"></a>

Com o AWS Glue versão 5.0 e superior, você pode usar o AWS Lake Formation para aplicar controles de acesso refinados em tabelas do Catálogo de Dados com suporte do S3. Esse recurso permite configurar controles de acesso em nível de tabela, linha, coluna e célula para consultas read nos trabalhos do AWS Glue para Apache Spark. Consulte as seções a seguir para saber mais sobre o Lake Formation e como usá-lo com o AWS Glue.

O controle de acesso em nível de tabela baseado no `GlueContext` com permissões AWS Lake Formation compatíveis com o Glue 4.0 ou anteriores não é compatível com o Glue 5.0. Use o novo controle de acesso refinado (FGAC) nativo do Spark no Glue 5.0. Observe os detalhes a seguir:
+ Se precisar de controle de acesso refinado (FGAC) para controle de acesso em linha/coluna/célula, você precisará migrar do `GlueContext`/Glue DynamicFrame no Glue 4.0 e versões anteriores para o Spark dataframe no Glue 5.0. Para obter exemplos, consulte [Migração de GlueContext/Glue DynamicFrame para Spark DataFrame](security-lf-migration-spark-dataframes.md)
+  Se você precisar do controle de acesso total à tabela (FTA), poderá aproveitar o FTA com DynamicFrames no AWS Glue 5.0. Você também pode migrar para a abordagem nativa do Spark a fim de obter 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. Para exemplos, consulte [Migrar do AWS Glue 4.0 to AWS Glue 5.0](https://docs.aws.amazon.com/glue/latest/dg/migrating-version-50.html). 
+ Se não precisar do FGAC, nenhuma migração para dataframes do Spark será necessária, e os recursos `GlueContext`, como marcadores de tarefas e predicados push-down, continuarão funcionando.
+ Os trabalhos com o FGAC exigem no mínimo 4 operadores: um driver de usuário, um driver de sistema, um executor de sistema e um executor de usuário em espera.

Utilizar o AWS Glue com o AWS Lake Formation gera cobranças adicionais.

## Como o AWS Glue funciona com o AWS Lake Formation
<a name="security-lf-enable-how-it-works"></a>

Usar o AWS Glue com o Lake Formation permite impor uma camada de permissões em cada trabalho do Spark para aplicar o controle de permissões do Lake Formation quando o AWS Glue executa trabalhos. O AWS Glue usa [perfis de recursos do Spark](https://spark.apache.org/docs/latest/api/java/org/apache/spark/resource/ResourceProfile.html) para criar dois perfis para executar trabalhos de forma efetiva. O perfil do usuário executa o código fornecido pelo usuário, enquanto o perfil do sistema impõe as políticas do Lake Formation. Para obter mais informações, consulte [What is AWS Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) e [Considerations and limitations](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable-considerations.html).

Veja a seguir uma visão geral de alto nível sobre como o AWS Glue obtém acesso aos dados protegidos pelas políticas de segurança do Lake Formation.

![\[O diagrama mostra como o controle de acesso refinado funciona com a API StartJoBrun do AWS Glue.\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/images/glue-50-fgac-start-job-run-api-diagram.png)


1. Um usuário chama a API `StartJobRun` em uma tarefa do AWS Glue habilitada para AWS Lake Formation.

1. O AWS Glue envia o trabalho para um driver de usuário e executa o trabalho no perfil do usuário. O driver do usuário executa uma versão enxuta do Spark que não tem a capacidade de iniciar tarefas, solicitar executores, acessar o S3 ou o Glue Catalog. Ele cria um plano de trabalho.

1. O AWS Glue configura um segundo driver chamado driver do sistema e o executa no perfil do sistema (com uma identidade privilegiada). O AWS Glue configura um canal TLS criptografado entre os dois drivers para comunicação. O driver do usuário usa o canal para enviar os planos de trabalho ao driver do sistema. O driver do sistema não executa o código enviado pelo usuário. Ele executa o Spark completo e se comunica com o S3 e com o Data Catalog para acesso aos dados. Ele solicita executores e compila o plano de trabalho em uma sequência de estágios de execução. 

1. Em seguida, o AWS Glue executa os estágios nos executores com o driver do usuário ou o driver do sistema. O código do usuário em qualquer estágio é executado exclusivamente nos executores do perfil do usuário.

1. Os estágios que lêem dados das tabelas do Data Catalog protegidas pelo AWS Lake Formation ou que aplicam filtros de segurança são delegados aos executores do sistema.

## Requisito mínimo de operadores
<a name="security-lf-enable-permissions"></a>

Um trabalho habilitado para Lake Formation no AWS Glue requer no mínimo 4 operadores: um driver de usuário, um driver de sistema, um executor de sistema e um executor de usuário em espera. Isso é mais do que o mínimo de 2 operadores necessários para jobs padrão do AWS Glue.

Um trabalho habilitado para Lake Formation no AWS Glue utiliza dois drivers do Spark, um para o perfil do sistema e outro para o perfil do usuário. Da mesma forma, os executores também são divididos em dois perfis:
+ Executores do sistema: lidam com tarefas nas quais os filtros de dados do Lake Formation são aplicados.
+ Executores do usuário: são solicitados pelo driver do sistema conforme necessário.

Como os trabalhos do Spark são lentos por natureza, o AWS Glue reserva 10% do total de operadores (mínimo de 1), após deduzir os dois drivers, para os executores de usuário.

Todos os trabalhos habilitados para Lake Formation têm o ajuste de escala automático ativado, o que significa que os executores de usuário só iniciarão quando necessário.

Para ver um exemplo de configuração, consulte [Considerações e limitações](https://docs.aws.amazon.com/glue/latest/dg/security-lf-enable-considerations.html).

## Permissões do IAM do perfil de runtime do trabalho
<a name="security-lf-enable-permissions"></a>

As permissões do Lake Formation controlam o acesso aos recursos do Catálogo de Dados do AWS Glue, aos locais do Amazon S3 e aos dados subjacentes nesses locais. As permissões do IAM controlam o acesso às APIs e aos recursos do Lake Formation e do AWS Glue. Embora você possa ter a permissão do Lake Formation para acessar uma tabela no Data Catalog (SELECT), a operação falhará se você não tiver a permissão do IAM na operação de API `glue:Get*`. 

Confira a seguir um exemplo de política de como fornecer permissões do IAM para acesso a um script no S3, upload de logs no S3, permissões da API do AWS Glue e permissão para acessar o Lake Formation.

------
#### [ JSON ]

****  

```
{
  "Version":"2012-10-17",		 	 	 
  "Statement": [
    {
      "Sid": "ScriptAccess",
      "Effect": "Allow",
      "Action": [
        "s3:GetObject",
        "s3:ListBucket"
      ],
      "Resource": [
        "arn:aws:s3:::*.amzn-s3-demo-bucket/scripts",
        "arn:aws:s3:::*.amzn-s3-demo-bucket/*"
      ]
    },
    {
      "Sid": "LoggingAccess",
      "Effect": "Allow",
      "Action": [
        "s3:PutObject"
      ],
      "Resource": [
        "arn:aws:s3:::amzn-s3-demo-bucket/logs/*"
      ]
    },
    {
      "Sid": "GlueCatalogAccess",
      "Effect": "Allow",
      "Action": [
        "glue:Get*",
        "glue:Create*",
        "glue:Update*"
      ],
      "Resource": [
        "*"
      ]
    },
    {
      "Sid": "LakeFormationAccess",
      "Effect": "Allow",
      "Action": [
        "lakeformation:GetDataAccess"
      ],
      "Resource": [
        "*"
      ]
    }
  ]
}
```

------

## Configuração de permissões do Lake Formation para perfil de runtime do trabalho
<a name="security-lf-enable-set-up-grants-for-role"></a>

Primeiro, registre a localização da tabela do Hive no Lake Formation. Em seguida, crie permissões para o perfil de runtime do trabalho na tabela desejada. Para obter mais detalhes sobre o Lake Formation, consulte [What is AWS Lake Formation?](https://docs.aws.amazon.com/lake-formation/latest/dg/what-is-lake-formation.html) no *Guia do desenvolvedor do AWS Lake Formation*.

Depois de configurar as permissões do Lake Formation, você pode enviar trabalhos do Spark no AWS Glue.

## Envio da execução de um trabalho
<a name="security-lf-enable-submit-job"></a>

Depois de concluir a configuração das concessões do Lake Formation, você pode enviar trabalhos do Spark no AWS Glue. Para executar trabalhos do Iceberg, é necessário fornecer as configurações do Spark a seguir. Para configurar por meio dos parâmetros de trabalho do Glue, inclua o seguinte parâmetro:
+ Chave:

  ```
  --conf
  ```
+ Valor:

  ```
  spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog 
  					  --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.account-id=<ACCOUNT_ID> 
  					  --conf spark.sql.catalog.spark_catalog.client.region=<REGION> 
  					  --conf spark.sql.catalog.spark_catalog.glue.endpoint=https://glue.<REGION>.amazonaws.com
  ```

## Uso de uma sessão interativa
<a name="security-lf-using-interactive-session"></a>

 Após concluir a configuração das permissões do AWS Lake Formation, é possível usar as sessões interativas no AWS. As configurações do Spark apresentadas a seguir devem ser fornecidas por meio do comando mágico `%%configure` antes da execução do código. 

```
%%configure
{
    "--enable-lakeformation-fine-grained-access": "true",
    "--conf": "spark.sql.catalog.spark_catalog=org.apache.iceberg.spark.SparkSessionCatalog --conf spark.sql.catalog.spark_catalog.warehouse=<S3_DATA_LOCATION> --conf spark.sql.catalog.spark_catalog.catalog-impl=org.apache.iceberg.aws.glue.GlueCatalog --conf spark.sql.catalog.spark_catalog.io-impl=org.apache.iceberg.aws.s3.S3FileIO --conf spark.sql.extensions=org.apache.iceberg.spark.extensions.IcebergSparkSessionExtensions --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.endpoint=https://glue.<REGION>.amazonaws.com"
}
```

## FGAC aplicado a cadernos e sessões interativas no AWS Glue 5.0
<a name="security-lf-fgac"></a>

Para habilitar o controle de acesso refinado (FGAC, na sigla em inglês) no AWS, é necessário especificar as configurações do Spark requeridas pelo Lake Formation por meio do comando mágico %%configure, antes da criação da primeira célula.

Caso essas configurações sejam fornecidas posteriormente usando as chamadas `SparkSession.builder().conf("").get()` e `SparkSession.builder().conf("").create()`, o controle não será aplicado corretamente. Trata-se de uma alteração em relação ao comportamento observado na versão AWS Glue 4.0.

## Suporte ao formato de tabela aberta
<a name="security-lf-enable-open-table-format-support"></a>

O AWS Glue versão 5.0 ou posterior inclui suporte ao controle de acesso refinado com base no Lake Formation. O AWS Glue é compatível com os tipos de tabela do Hive e do Iceberg. A tabela a seguir descreve todas as operações compatíveis.

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/glue/latest/dg/security-lf-enable.html)

# Migração de GlueContext/Glue DynamicFrame para Spark DataFrame
<a name="security-lf-migration-spark-dataframes"></a>

Veja a seguir exemplos em Python e Scala da migração de `GlueContext`/Glue `DynamicFrame` no Glue 4.0 para Spark `DataFrame` no Glue 5.0.

**Python**  
Antes:

```
escaped_table_name= '`<dbname>`.`<table_name>`'

additional_options = {
  "query": f'select * from {escaped_table_name} WHERE column1 = 1 AND column7 = 7'
}

# DynamicFrame example
dataset = glueContext.create_data_frame_from_catalog(
    database="<dbname>",
    table_name=escaped_table_name, 
    additional_options=additional_options)
```

Depois:

```
table_identifier= '`<catalogname>`.`<dbname>`.`<table_name>`"' #catalogname is optional

# DataFrame example
dataset = spark.sql(f'select * from {table_identifier} WHERE column1 = 1 AND column7 = 7')
```

**Scala**  
Antes:

```
val escapedTableName = "`<dbname>`.`<table_name>`"

val additionalOptions = JsonOptions(Map(
    "query" -> s"select * from $escapedTableName WHERE column1 = 1 AND column7 = 7"
    )
)

# DynamicFrame example
val datasource0 = glueContext.getCatalogSource(
    database="<dbname>", 
    tableName=escapedTableName, 
    additionalOptions=additionalOptions).getDataFrame()
```

Depois:

```
val tableIdentifier = "`<catalogname>`.`<dbname>`.`<table_name>`" //catalogname is optional

# DataFrame example
val datasource0 = spark.sql(s"select * from $tableIdentifier WHERE column1 = 1 AND column7 = 7")
```

# Considerações e limitações
<a name="security-lf-enable-considerations"></a>

Confira as considerações e limitações a seguir ao usar o Lake Formation com o AWS Glue. 

O AWS Glue com o Lake Formation está disponível em todas as regiões compatíveis, exceto AWS GovCloud (Leste dos EUA) e AWS GovCloud (Oeste dos EUA).
+ O AWS Glue oferece suporte ao controle de acesso refinado por meio do Lake Formation somente para tabelas do Apache Hive e do Apache Iceberg. Os formatos do Apache Hive incluem Parquet, ORC e CSV. 
+ Você só pode usar o Lake Formation com trabalhos do Spark.
+ O AWS Glue com Lake Formation oferece suporte apenas a uma única sessão do Spark durante todo o trabalho.
+ Quando o Lake Formation está habilitado, o AWS Glue requer um número maior de operadores, pois exige um driver de sistema, executores de sistema, um driver de usuário e, opcionalmente, executores de usuários (necessários quando o trabalho tem UDFs ou `spark.createDataFrame`).
+ O AWS Glue com Lake Formation só oferece suporte a consultas de tabelas entre contas compartilhadas por meio de links de recursos. O link de recurso precisa ser nomeado de maneira idêntica ao recurso da conta de origem.
+ Para habilitar o controle de acesso refinado para trabalhos do AWS Glue, passe o parâmetro de trabalho `--enable-lakeformation-fine-grained-access`.
+ É possível configurar suas tarefas do AWS Glue para funcionar com a hierarquia de vários catálogos do AWS Glue. Para obter informações sobre os parâmetros de configuração a serem usados com a API `StartJobRun` do AWS Glue, consulte [Como trabalhar com a hierarquia de vários catálogos do AWS Glue no EMR sem servidor](https://docs.aws.amazon.com/emr/latest/EMR-Serverless-UserGuide/external-metastore-glue-multi.html).
+ As seguintes opções não são compatíveis:
  + Conjuntos de dados distribuídos resilientes (RDD)
  + Streaming do Spark
  + Gravação com as permissões concedidas pelo Lake Formation
  + Controle de acesso para colunas aninhadas
+ O AWS Glue bloqueia funcionalidades que podem prejudicar o isolamento completo do driver do sistema, incluindo as seguintes:
  + UDTs, HiveUDFs e qualquer função definida pelo usuário que envolva classes personalizadas
  + Fontes de dados personalizadas
  + Fornecimento de JARs adicionais para extensão, conector ou metastore do Spark
  + `ANALYZE TABLE`Comando 
+ Para impor controles de acesso, `EXPLAIN PLAN` e operações de DDL, como `DESCRIBE TABLE`, não expõem informações restritas.
+ O AWS Glue restringe o acesso aos logs do Spark do driver do sistema em aplicações habilitadas para Lake Formation. Como o driver do sistema é executado com mais acesso, os eventos e logs que o driver do sistema gera podem incluir informações confidenciais. Para evitar que usuários ou códigos não autorizados acessem esses dados confidenciais, o AWS Glue desabilitou o acesso aos logs do driver do sistema. Para solucionar problemas, entre em contato com o suporte da AWS.
+ Se você registrou uma localização de tabela no Lake Formation, o caminho de acesso aos dados passa pelas credenciais armazenadas do Lake Formation, independentemente da permissão do IAM para o perfil de runtime do trabalho do AWS Glue. Se você configurar incorretamente o perfil registrado com a localização da tabela, os trabalhos enviados que usam o perfil com a permissão do IAM para o S3 na localização da tabela falharão.
+ Gravar em uma tabela do Lake Formation usa a permissão do IAM em vez das permissões concedidas pelo Lake Formation. Se o runtime do trabalho tiver as permissões necessárias do S3, será possível usá-lo para executar operações de gravação.

Observe estas considerações e limitações ao usar o Apache Iceberg:
+ Você só pode usar o Apache Iceberg com o catálogo de sessões e não com catálogos nomeados arbitrariamente.
+ As tabelas do Iceberg registradas no Lake Formation oferecem suporte apenas às tabelas de metadados `history`, `metadata_log_entries`, `snapshots`, `files`, `manifests` e `refs`. O AWS Glue oculta as colunas que podem conter dados confidenciais, como `partitions`, `path` e `summaries`. Essa limitação não se aplica às tabelas do Iceberg que não estão registradas no Lake Formation.
+ As tabelas que você não registra no Lake Formation oferecem suporte a todos os procedimentos armazenados do Iceberg. Os procedimentos `register_table` e `migrate` não são compatíveis com nenhuma tabela.
+ Recomendamos usar o Iceberg DataFrameWriterV2 em vez do V1.

## Exemplo de alocação de operadores
<a name="security-lf-considerations-worker-allocation"></a>

Para um trabalho configurado com os seguintes parâmetros:

```
--enable-lakeformation-fine-grained-access=true  
--number-of-workers=20
```

A alocação de operadores seria:
+ Um operador para o driver do usuário.
+ Um operador para o driver do sistema.
+ 10% dos 18 operadores restantes (ou seja, 2 trabalhadores) reservados para os executores do usuário.
+ Até 16 operadores alocados para executores do sistema.

Com o ajuste de escala automático ativado, os executores do usuário podem utilizar qualquer capacidade não alocada dos executores do sistema, se necessário.

## Controlar a alocação de executores do usuário
<a name="security-lf-considerations-user-exec-allocation"></a>

Você pode ajustar a porcentagem de reserva para executores do usuário usando a seguinte configuração:

```
--conf spark.dynamicAllocation.maxExecutorsRatio=<value between 0 and 1>
```

Essa configuração permite um controle preciso sobre quantos executores do usuário são reservados em relação à capacidade total disponível.

# Solução de problemas
<a name="security-lf-troubleshooting"></a>

Consulte as seções a seguir para soluções de problemas.

## Registro em log
<a name="security-lf-troubleshooting-logging"></a>

O AWS Glue usa perfis de recursos do Spark para dividir a execução do trabalho. O AWS Glue usa o perfil do usuário para executar o código fornecido, enquanto o perfil do sistema impõe as políticas do Lake Formation. Você pode acessar os logs das tarefas executadas como perfil de usuário.

## Interface do usuário do Live e servidor de histórico do Spark
<a name="security-lf-troubleshooting-live-ui"></a>

A interface de usuário do Live e o servidor de histórico do Spark têm todos os eventos do Spark gerados no perfil do usuário e os eventos editados gerados pelo driver do sistema.

Você pode ver todas as tarefas dos drivers do usuário e do sistema na guia **Executores**. No entanto, os links de logs estão disponíveis somente para o perfil do usuário. Além disso, algumas informações são retiradas da interface de usuário do Live, como o número de registros de saída.

## O trabalho falhou com permissões insuficientes do Lake Formation
<a name="security-lf-troubleshooting-insufficient-lf-permissions"></a>

Certifique-se de que o perfil de runtime do trabalho tenha as permissões para executar SELECT e DESCRIBE na tabela que você está acessando.

## Falha na execução do trabalho com RDD
<a name="security-lf-troubleshooting-rdd-execution"></a>

No momento, o AWS Glue não oferece suporte a operações de conjunto de dados resilientes distribuídos (RDD) em trabalhos habilitados para o Lake Formation.

## Não é possível acessar arquivos de dados no Amazon S3
<a name="security-lf-troubleshooting-s3-access-failure"></a>

Certifique-se de ter registrado a localização do data lake no Lake Formation.

## Exceção de validação de segurança
<a name="security-lf-troubleshooting-security-validation"></a>

O AWS Glue detectou um erro de validação de segurança. Entre em contato com o suporte da AWS para obter ajuda.

## Compartilhamento do AWS Glue Data Catalog e de tabelas entre contas
<a name="security-lf-troubleshooting-cross-account"></a>

Você pode compartilhar bancos de dados e tabelas entre contas e ainda usar o Lake Formation. Para obter mais informações, consulte [Compartilhamento de dados entre contas no Lake Formation](https://docs.aws.amazon.com/lake-formation/latest/dg/cross-account-permissions.html) e [Como faço para compartilhar o Catálogo de Dados e tabelas do AWS Glue entre contas?](https://repost.aws/knowledge-center/glue-lake-formation-cross-account).