

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Acesse, consulte e una tabelas do Amazon DynamoDB usando o Athena
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena"></a>

*Moinul Al-Mamun, Amazon Web Services*

## Resumo
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-summary"></a>

Este padrão mostra como configurar uma conexão entre o Amazon Athena e o Amazon DynamoDB usando o conector Amazon Athena DynamoDB. O conector usa uma função do AWS Lambda para consultar os dados no DynamoDB. Não é necessário escrever nenhum código para configurar a conexão. Depois que a conexão for estabelecida, você poderá acessar e analisar rapidamente as tabelas do DynamoDB usando o [Athena Federated Query](https://docs.aws.amazon.com/athena/latest/ug/connect-to-a-data-source.html) para executar comandos SQL do Athena. Você também pode unir uma ou mais tabelas do DynamoDB entre si ou com outras fontes de dados, como Amazon Redshift ou Amazon Aurora.

## Pré-requisitos e limitações
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-prereqs"></a>

**Pré-requisitos **
+ Uma conta ativa AWS com permissões para gerenciar tabelas do DynamoDB, fontes de dados do Athena, Lambda e perfis do AWS Identity and Access Management (IAM)
+ Um bucket do Amazon Simple Storage Service (Amazon S3) no qual o Athena poderá armazenar resultados de consultas
+ Um bucket do S3 em que o Athena DynamoDB Connector pode salvar os dados no curto prazo
+ Uma região da AWS que fornece suporte à [versão 2 do mecanismo Athena](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference-0002.html)
+ Permissões do IAM para acessar o Athena e os buckets do S3 necessários
+ [Conector do DynamoDB no Amazon Athena](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb), instalado

**Limitações**

Há um custo para consultar tabelas do DynamoDB. Tamanhos de tabela que excedam alguns gigabytes (GBs) podem gerar um custo alto. Recomendamos que você considere o custo antes de realizar qualquer operação de VERIFICAÇÃO de tabela completa. Para obter mais informações, consulte a [Definição de preço do Amazon DynamoDB](https://aws.amazon.com/dynamodb/pricing/). Para reduzir custos e alcançar alto desempenho, recomendamos que você sempre use LIMIT em sua consulta (por exemplo, `SELECT * FROM table1 LIMIT 10`). Além disso, antes de realizar uma consulta JOIN ou GROUP BY em um ambiente de produção, considere o tamanho de suas tabelas. Se suas tabelas forem muito grandes, considere opções alternativas, como [migrar a tabela para o Amazon S3](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/).

## Arquitetura
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-architecture"></a>

O diagrama a seguir mostra como um usuário pode executar uma consulta SQL em uma tabela do DynamoDB do Athena.

![Fluxo de trabalho para conectar o Athena e o DynamoDB para executar uma consulta SQL.](https://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/e6ff94af-d208-40c7-94e4-af257755a603/images/bc8e0132-b578-463b-bf55-3c39ce359c17.png)


O diagrama mostra o seguinte fluxo de trabalho:

1. Para consultar uma tabela do DynamoDB, um usuário executa uma consulta SQL do Athena.

1. O Athena inicia uma função do Lambda.

1. A função do Lambda consulta os dados solicitados na tabela do DynamoDB.

1. O DynamoDB retorna os dados solicitados para a função do Lambda. Em seguida, a função transfere os resultados da consulta para o usuário por meio do Athena.

1. A função do Lambda armazena dados no bucket do S3.

**Pilha de tecnologia**
+ Amazon Athena
+ Amazon DynamoDB
+ Amazon S3
+ AWS Lambda

## Ferramentas
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-tools"></a>
+ O [Amazon Athena](https://docs.aws.amazon.com/athena/latest/ug/what-is.html) é um serviço de consultas interativas que facilita a análise de dados no Amazon S3 usando SQL padrão.
+ O [Amazon Athena DynamoDB Connector](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) é uma ferramenta da AWS que permite que o Athena se conecte ao DynamoDB e acesse suas tabelas usando consultas SQL.
+ O [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html) é um serviço de banco de dados NoSQL totalmente gerenciado que fornece performance rápida, previsível e escalável.
+ O [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html) é um serviço de computação que ajuda você a executar código sem exigir provisionamento ou gerenciamento de servidores. Ele executa o código somente quando necessário e dimensiona automaticamente, assim, você paga apenas pelo tempo de computação usado.

## Épicos
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-epics"></a>

### Criar exemplos de tabelas do DynamoDB
<a name="create-sample-dynamodb-tables"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie a primeira tabela de exemplo.  | 1. Faça login no Console de Gerenciamento da AWS e abra o [console do DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Escolha **Criar tabela**.<br />3. Em **Nome da tabela**, insira **dydbtable1**.<br />4. Em **Chave de partição**,** **insira **PK1**.<br />5. Em **Chave de classificação**, insira **SK1**.<br />6. Na seção **Configurações da tabela**, selecione **Personalizar configurações**.<br />7. Na seção **Classe de tabela**, escolha **DynamoDB Standard**.<br />8. Na seção **Read/write de configurações de capacidade**, em **Modo de capacidade**, escolha **On-demand**.<br />9. Na seção **Criptografia em repouso**, escolha **Propriedade do Amazon DynamoDB**.<br />10. Escolha **Criar tabela**. | Desenvolvedor | 
| Insira dados de exemplo na primeira tabela. | 1. Abra o [console do DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. No painel de navegação, selecione **Tabela** e selecione sua tabela na coluna **Nome**.<br />3. Escolha **Ações** e, em seguida, **Criar item**.<br />4. Escolha **Visualização JSON**.<br />5. Na barra de título do editor **Attributes**, desative **Visualizar DynamoDB JSON**.<br />6. No editor **Atributos**, insira os seguintes dados de exemplo, um por um:<pre>{<br />  "PK1": "1234",<br />  "SK1": "info",<br />  "Salary": "5000"<br /> }</pre><pre>{<br />  "PK1": "1235",<br />  "SK1": "info",<br />  "Salary": "5200"<br /> }</pre> | Desenvolvedor | 
| Crie a segunda tabela de exemplo.  | 1. Abra o [console do DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. Escolha **Criar tabela**.<br />3. Em **Nome da tabela**, insira **dydbtable2**.<br />4. Em **Chave de partição**, insira **PK2**.<br />5. Em **Chave de classificação**, insira **SK2**.<br />6. Na seção **Configurações da tabela**, selecione **Personalizar configurações**.<br />7. Na seção **Classe de tabela**, escolha **DynamoDB Standard**.<br />8. Na seção **Read/write de configurações de capacidade**, em **Modo de capacidade**, escolha **On-demand**.<br />9. Na seção **Criptografia em repouso**, escolha **Propriedade do Amazon DynamoDB**.<br />10. Escolha **Criar tabela**. | Desenvolvedor | 
| Insira dados de exemplo na segunda tabela. | 1. Abra o [console do DynamoDB](https://console.aws.amazon.com/dynamodb/).<br />2. No painel de navegação, selecione **Tabela** e selecione sua tabela na coluna **Nome**.<br />3. Escolha **Ações** e, em seguida, **Criar item**.<br />4. Na barra de título do editor **Attributes**, desative **Visualizar DynamoDB JSON**.<br />5. No editor **Atributos**, insira os seguintes dados de exemplo, um por um:<pre>{<br />  "PK2": "1234",<br /> "SK2": "bonus",<br /> "Bonus": "500"<br />}</pre><pre>{<br />  "PK2": "1235",<br /> "SK2": "bonus",<br /> "Bonus": "1000"<br />}</pre> | Desenvolvedor | 

### Crie uma fonte de dados no Athena para DynamoDB
<a name="create-a-data-source-in-athena-for-dynamodb"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Configure o conector da fonte de dados. | Crie uma fonte de dados para o DynamoDB e, em seguida, uma função do Lambda para se conectar a essa fonte de dados.1. Faça login no Console de Gerenciamento da AWS e abra o [console do Athena](https://console.aws.amazon.com/athena/).<br />2. No painel de navegação, escolha **Fontes de dados** e, em seguida, **Criar fonte de dados**.<br />3. Escolha a fonte de dados do **Amazon DynamoDB** e, em seguida, **Avançar**.<br />4. Na seção **Detalhes da fonte de dados**, em **Nome da fonte de dados**, insira **testDynamoDB**.<br />5. Na seção **Detalhes da conexão**, selecione uma função do Lambda que já esteja implantada ou escolha **Criar função do Lambda** se você não tiver uma função do Lambda para usar nesse padrão. **Observação**: Para obter mais informações sobre como criar uma função do Lambda, consulte [Conceitos básicos do AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/getting-started.html) no Guia do desenvolvedor do Lambda.<br />6. (Opcional) Se você escolher a **função Create Lambda**, deverá configurar o CloudFormation modelo da AWS incluído pelo aplicativo Java antes de implantar essa pilha. O modelo inclui ApplicationName, SpillBucket, AthenaCatalogName, e outras configurações do aplicativo. **Observação**: depois de implantar esse Java-based aplicativo, a pilha cria uma função Lambda que permite que o Athena se comunique com o DynamoDB. Isso torna suas tabelas acessíveis por meio de comandos SQL.<br />7. Implantação da função do Lambda.<br />8. Escolha **Próximo**. | Desenvolvedor | 
| Verifique se a função do Lambda pode acessar o bucket de vazamento do S3. | 1. Abra o [console do lambda](https://console.aws.amazon.com/lambda/).<br />2. No painel de navegação, escolha **Funções** e, em seguida, escolha a função que você criou anteriormente.<br />3. Escolha a guia **Configuração**.<br />4. No painel esquerdo, escolha **Variáveis de ambiente** e confirme se o valor da chave é `spill_bucket`.<br />5. No painel esquerdo, escolha **Permissões** e, na seção **Perfil de execução**, escolha o perfil do IAM anexo. **Observação**: você é direcionado para o perfil do IAM anexo à sua função do Lambda no console do IAM.<br />6. Confirme se você tem permissão de gravação no bucket `spill_bucket`.Se ocorrerem erros, consulte a seção *Informações adicionais* neste padrão para obter orientação. | Desenvolvedor | 

### Acessar tabelas do DynamoDB a partir do Athena
<a name="access-dynamodb-tables-from-athena"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Consultar as tabelas do DynamoDB. | 1. Faça login no Console de Gerenciamento da AWS e abra o [console do Athena](https://console.aws.amazon.com/athena/).<br />2. No painel de navegação, escolha **Fontes de dados** e, em seguida, **Criar fonte de dados**.<br />3. No painel de navegação, selecione **Editor de consultas**.<br />4. Na guia **Editor**, na seção **Dados**, em **Fonte de dados**, escolha sua fonte de dados em **Fonte de dados**.<br />5. Em **Banco de dados**, escolha seu banco de dados.<br />6. Para Consulta 1, insira a seguinte consulta: `SELECT * FROM dydbtable1 t1;`<br />7. Escolha **Executar** e, em seguida, verifique o resultado na tabela.<br />8. Para Consulta 2, insira a seguinte consulta: `SELECT * FROM dydbtable2 t2;`<br />9. Escolha **Executar** e, em seguida, verifique o resultado na tabela. | Desenvolvedor | 
| Unir duas tabelas do DynamoDB. | O DynamoDB é um armazenamento de dados NoSQL e não fornece suporte à operação de junção de SQL. Consequentemente, você deve realizar uma operação de junção em duas tabelas do DynamoDB:1. Selecione o ícone de adição para criar uma nova consulta.<br />2. Para Consulta 3, insira a seguinte consulta: <pre>SELECT pk1, salary, bonus FROM dydbtable1 t1<br /> JOIN dydbtable2 t2 ON t1.pk1 = t2.pk2;</pre> | Desenvolvedor | 

## Recursos relacionados
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-resources"></a>
+ [Conector do Amazon Athena para o DynamoDB](https://github.com/awslabs/aws-athena-query-federation/tree/master/athena-dynamodb) (AWS Labs)
+ [Consulte qualquer fonte de dados com a nova consulta federada do Amazon Athena](https://aws.amazon.com/blogs/big-data/query-any-data-source-with-amazon-athenas-new-federated-query/) (blog do AWS Big Data)
+ [Referência da versão do mecanismo Athena](https://docs.aws.amazon.com/athena/latest/ug/engine-versions-reference.html) (Guia do usuário do Athena)
+ [Simplifique a extração e a análise de dados do Amazon DynamoDB usando o AWS Glue e o Amazon Athena](https://aws.amazon.com/blogs/database/simplify-amazon-dynamodb-data-extraction-and-analysis-by-using-aws-glue-and-amazon-athena/) (blog do banco de dados da AWS)

## Mais informações
<a name="access-query-and-join-amazon-dynamodb-tables-using-athena-additional"></a>

Se você executar uma consulta no Athena com `spill_bucket` no formato `{bucket_name}/folder_name/`, poderá receber a seguinte mensagem de erro:

```
"GENERIC_USER_ERROR: Encountered an exception[java.lang.RuntimeException] from your LambdaFunction[arn:aws:lambda:us-east-1:xxxxxx:function:testdynamodb] executed in context[retrieving meta-data] with message[You do NOT own the spill bucket with the name: s3://DOC-EXAMPLE-BUCKET/athena_dynamodb_spill_data/]
This query ran against the "default" database, unless qualified by the query. Please post the error message on our forum  or contact customer support with Query Id: [query-id]"
```

Para solucionar esse erro, atualize a variável de ambiente da função do Lambda `spill_bucket` para `{bucket_name_only}` e, em seguida, atualize a seguinte política do IAM do Lambda para obter acesso de gravação no bucket:

```
{
             "Action": [
                 "s3:GetObject",
                 "s3:ListBucket",
                 "s3:GetBucketLocation",
                 "s3:GetObjectVersion",
                 "s3:PutObject",
                 "s3:PutObjectAcl",
                 "s3:GetLifecycleConfiguration",
                 "s3:PutLifecycleConfiguration",
                 "s3:DeleteObject"
            ],
             "Resource": [
                 "arn:aws:s3:::spill_bucket",
                 "arn:aws:s3:::spill_bucket/*"
            ],
             "Effect": "Allow"
        }
```

Como alternativa, você pode remover o conector da fonte de dados do Athena criado anteriormente e recriá-lo usando somente `{bucket_name}` para `spill_bucket`.