

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á.

# Arquivar automaticamente itens no Amazon S3 usando o DynamoDB TTL
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl"></a>

*Tabby Ward, Amazon Web Services*

## Resumo
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-summary"></a>

Este padrão fornece etapas para remover dados antigos de uma tabela do Amazon DynamoDB e arquivá-los em um bucket do Amazon Simple Storage Service (Amazon S3) no Amazon Web Services (AWS) sem precisar gerenciar uma frota de servidores. 

Este padrão usa a configuração de vida útil (TTL) do Amazon DynamoDB para excluir automaticamente itens antigos e o Amazon DynamoDB Streams para capturar itens com TTL expirado. Ele então conecta o DynamoDB Streams ao AWS Lambda, que executa o código sem provisionar ou gerenciar nenhum servidor. 

Quando novos itens são adicionados ao fluxo do DynamoDB, a função do Lambda é inicializada e grava os dados em um fluxo de entrega do Amazon Data Firehose. O Firehose fornece uma solução simples e totalmente gerenciada para carregar os dados como um arquivo no Amazon S3.

O DynamoDB é frequentemente usado para armazenar dados de séries temporais, como dados de fluxo de cliques em páginas da Web ou dados da Internet das Coisas (IoT) de sensores e dispositivos conectados. Em vez de excluir itens acessados com menos frequência, muitos clientes desejam arquivá-los para fins de auditoria. O TTL simplifica esse arquivamento excluindo automaticamente os itens com base no atributo timestamp. 

Os itens excluídos pelo TTL podem ser identificados no DynamoDB Streams, que captura uma sequência em ordem temporal de modificações em nível de item e armazena a sequência em um log por até 24 horas. Esses dados podem ser consumidos por uma função do Lambda e arquivados em um bucket do Amazon S3 para reduzir o custo de armazenamento. [Para reduzir ainda mais os custos, as [regras de ciclo de vida do Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/userguide/object-lifecycle-mgmt.html) podem ser criadas para fazer a transição automática dos dados (assim que forem criados) para as classes de armazenamento de menor custo.](https://aws.amazon.com/s3/storage-classes/)

## Pré-requisitos e limitações
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-prereqs"></a>

**Pré-requisitos **
+ Uma conta AWS ativa
+ [AWS Command Line Interface (AWS CLI) 1.7 ou mais recente](https://docs.aws.amazon.com/cli/latest/userguide/install-cliv1.html), instalada e configurada em macOS, Linux ou Windows.
+ [Python 3.7](https://www.python.org/downloads/release/python-370/) ou mais recente.
+ [Boto3](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html), instalado e configurado. Se o Boto3 ainda não estiver instalado, execute o comando `python -m pip install boto3` para instalá-lo.

## Arquitetura
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-architecture"></a>

**Pilha de tecnologia**
+ Amazon DynamoDB
+ Amazon DynamoDB Streams
+ Amazon Data Firehose
+ AWS Lambda
+ Amazon S3

![\[Processo em quatro etapas do DynamoDB para o bucket do S3.\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/images/pattern-img/9dbc833f-cf3c-4574-8f09-d0b81134fe41/images/50d9da65-5398-4a99-bc8f-58afc80e9d7b.png)


1. Os itens são excluídos pelo TTL.

1. O trigger do DynamoDB Streams invoca a função de processador de fluxo do Lambda.

1. A função do Lambda insere registros no fluxo de entrega do Firehose em formato de lote.

1. Os registros de dados são arquivados no bucket do S3.

## Ferramentas
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-tools"></a>
+ [AWS CLI](https://docs.aws.amazon.com/cli/latest/userguide/cli-chap-install.html): o AWS Command Line Interface (AWS CLI) é uma ferramenta unificada para gerenciar os serviços da AWS.
+ [Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Introduction.html): o Amazon DynamoDB é um banco de dados de documentos e de chave-valor e documentos que oferece desempenho de um dígito em milissegundos em qualquer escala.
+ [Vida útil (TTL) do Amazon DynamoDB](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/howitworks-ttl.html): o Amazon DynamoDB ajuda a definir uma marca de hora por item para determinar quando um item não é mais necessário.
+ [Amazon DynamoDB Streams](https://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_Types_Amazon_DynamoDB_Streams.html): o Amazon DynamoDB Streams captura uma sequência em ordem temporal de modificações em nível de item em qualquer tabela do DynamoDB e armazena essas informações em um log por até 24 horas.
+ [Amazon Data Firehose](https://docs.aws.amazon.com/firehose/latest/dev/what-is-this-service.html): o Amazon Data Firehose é a maneira mais fácil de carregar dados de streaming com confiabilidade em data lakes, repositórios de dados e serviços de analytics.
+ [AWS Lambda](https://docs.aws.amazon.com/lambda/latest/dg/welcome.html): o AWS Lambda executa código sem a necessidade de provisionar ou gerenciar servidores. É cobrado apenas o tempo de computação consumido.
+ [Amazon S3](https://docs.aws.amazon.com/AmazonS3/latest/dev/Welcome.html): o Amazon Simple Storage Service (Amazon S3) é um serviço de armazenamento de objetos que oferece escalabilidade líder do setor, disponibilidade de dados, segurança e performance.

**Código **

O código desse padrão está disponível no GitHub [Arquivamento de itens no S3 usando o repositório TTL do DynamoDB](https://github.com/aws-samples/automatically-archive-items-to-s3-using-dynamodb-ttl).

## Épicos
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-epics"></a>

### Configure uma tabela do DynamoDB, TTL e um DynamoDB Streams
<a name="set-up-a-dynamodb-table-ttl-and-a-dynamodb-stream"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie uma tabela do DynamoDB. | Use a AWS CLI para criar uma tabela no DynamoDB chamada `Reservation`. Escolha a unidade de capacidade de leitura aleatória (random read capacity unit, RCU) e a unidade de capacidade de gravação (write capacity unit, WCU) e atribua à sua tabela dois atributos: `ReservationID` e `ReservationDate`. <pre>aws dynamodb create-table \<br />--table-name Reservation \<br />--attribute-definitions AttributeName=ReservationID,AttributeType=S AttributeName=ReservationDate,AttributeType=N \<br />--key-schema AttributeName=ReservationID,KeyType=HASH AttributeName=ReservationDate,KeyType=RANGE \<br />--provisioned-throughput ReadCapacityUnits=100,WriteCapacityUnits=100 </pre>`ReservationDate` é um timestamp de época que será usado para ativar o TTL. | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Ative o TTL do DynamoDB | Use a AWS CLI para ativar o TTL do DynamoDB para o atributo `ReservationDate`.<pre>aws dynamodb update-time-to-live \<br />--table-name Reservation\<br />  --time-to-live-specification Enabled=true,AttributeName=ReservationDate</pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Ative um DynamoDB Streams. | Use a AWS CLI para ativar um DynamoDB Streams para a tabela `Reservation` usando o tipo de fluxo `NEW_AND_OLD_IMAGES`. <pre>aws dynamodb update-table \<br />--table-name Reservation \<br />  --stream-specification StreamEnabled=true,StreamViewType=NEW_AND_OLD_IMAGES</pre>Esse fluxo conterá registros de novos itens, itens atualizados, itens excluídos e itens excluídos pelo TTL. Os registros dos itens excluídos pelo TTL contêm um atributo de metadados adicional para diferenciá-los dos itens que foram excluídos manualmente. O campo `userIdentity` para exclusões de TTL indica que o serviço do DynamoDB executou a ação de exclusão. Nesse padrão, somente os itens excluídos pelo TTL são arquivados, mas você pode arquivar somente os registros onde `eventName` é `REMOVE` e `userIdentity` contém `principalId` igual a `dynamodb.amazonaws.com`. | Arquiteto de nuvem, desenvolvedor de aplicativos | 

### Criação e configuração de um bucket do S3
<a name="create-and-configure-an-s3-bucket"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Criar um bucket do S3. | Use a AWS CLI para criar um bucket S3 de destino na sua região da AWS, `us-east-1` substituindo-o pela sua região e amzn-s3- demo-destination-bucket pelo nome do seu bucket. <pre>aws s3api create-bucket \<br />--bucket amzn-s3-demo-destination-bucket \<br />--region us-east-1</pre>Certifique-se de que o nome do seu bucket do S3 seja globalmente exclusivo, pois o namespace é compartilhado por todas as contas da AWS. | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Crie uma política de ciclo de vida de 30 dias para o bucket do S3. | [\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/prescriptive-guidance/latest/patterns/automatically-archive-items-to-amazon-s3-using-dynamodb-ttl.html) | Arquiteto de nuvem, desenvolvedor de aplicativos | 

### Criação de um fluxo de entrega do Firehose
<a name="create-a-akf-delivery-stream"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie e configure um fluxo de entrega do Firehose. | Baixe e edite o exemplo de `CreateFireHoseToS3.py` código do GitHub repositório. Este código está escrito em Python e mostra como criar um fluxo de entrega do Firehose e um perfil do AWS Identity and Access Management (IAM). O perfil do IAM terá uma política que pode ser usada pelo Firehose para gravar no bucket do S3 de destino.Para executar o script, use o comando abaixo e os seguintes argumentos da linha de comando.Argumento 1=`<Your_S3_bucket_ARN>`, que é o nome do recurso da Amazon (ARN) do bucket criado anteriormenteArgumento 2 = o nome do seu Firehose (este teste experimental está usando `firehose_to_s3_stream`.)Argumento 3= nome do seu perfil do IAM (este piloto está usando`firehose_to_s3`.)<pre>python CreateFireHoseToS3.py <Your_S3_Bucket_ARN> firehose_to_s3_stream firehose_to_s3</pre>Se o perfil do IAM especificado não existir, o script criará um perfil assumido com uma política de relacionamento confiável, bem como uma política que conceda permissão suficiente ao Amazon S3. Para obter exemplos dessas políticas, consulte a seção *Informações adicionais*. | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Verifique o fluxo de entrega do Firehose. | Descreva o fluxo de entrega do Firehose usando a AWS CLI para verificar se o fluxo de entrega foi criado com êxito.<pre>aws firehose describe-delivery-stream --delivery-stream-name firehose_to_s3_stream </pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 

### Criação de uma função do Lambda para processar o fluxo de entrega do Firehose
<a name="create-a-lambda-function-to-process-the-akf-delivery-stream"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Crie uma política de confiança para a função do Lambda. | Crie um arquivo da política de confiança com as seguintes informações.<pre> {<br />     "Version": "2012-10-17",		 	 	 <br />     "Statement": [<br />      {<br />          "Effect": "Allow",<br />          "Principal": {<br />              "Service": "lambda.amazonaws.com"<br />           },<br />           "Action": "sts:AssumeRole"<br />      }<br />    ]<br />  } </pre>Isso dá ao seu perfil permissão para acessar recursos da AWS. | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Crie um perfil de execução para a função do Lambda | Para criar o perfil de execução, execute o seguinte código.<pre>aws iam create-role --role-name lambda-ex --assume-role-policy-document file://TrustPolicy.json</pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Adicione permissões ao perfil. | Para adicionar permissão para o perfil, use o comando `attach-policy-to-role`.<pre>aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaBasicExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/service-role/AWSLambdaDynamoDBExecutionRole<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/AmazonKinesisFirehoseFullAccess<br />aws iam attach-role-policy --role-name lambda-ex --policy-arn arn:aws:iam::aws:policy/IAMFullAccess </pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Crie uma função do Lambda. | Comprima o arquivo `LambdaStreamProcessor.py` do repositório de código executando o comando a seguir.<pre>zip function.zip LambdaStreamProcessor.py</pre>Ao criar a função do Lambda, você precisará do ARN do perfil de execução do Lambda. Para obter o ARN, execute o código a seguir.<pre>aws iam get-role \<br />--role-name lambda-ex </pre>Para criar a função do Lambda, execute o seguinte código.<pre># Review the environment variables and replace them with your values.<br /><br />aws lambda create-function --function-name LambdaStreamProcessor \<br />--zip-file fileb://function.zip --handler LambdaStreamProcessor.handler --runtime python3.8 \<br />--role {Your Lamda Execution Role ARN}\<br />  --environment Variables="{firehose_name=firehose_to_s3_stream,bucket_arn = <Your_S3_bucket_ARN>,iam_role_name = firehose_to_s3, batch_size=400}"</pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 
| Configure o trigger da função do Lambda. | Use a AWS CLI para configurar o trigger (DynamoDB Streams), que invoca a função do Lambda. O tamanho do lote ser de 400 é para evitar problemas de simultaneidade do Lambda.<pre>aws lambda create-event-source-mapping --function-name LambdaStreamProcessor \<br />--batch-size 400 --starting-position LATEST \<br />--event-source-arn <Your Latest Stream ARN From DynamoDB Console></pre> | Arquiteto de nuvem, desenvolvedor de aplicativos | 

### Teste a funcionalidade
<a name="test-the-functionality"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Adicione itens com timestamps expirados à tabela de reservas. | Para testar a funcionalidade, adicione itens com timestamps de época expirados à tabela `Reservation`. O TTL excluirá automaticamente os itens com base no timestamp. A função do Lambda é inicializada nas atividades do DynamoDB Stream e filtra o evento para identificar a atividade `REMOVE` ou itens excluídos. Em seguida, a função insere os registros no fluxo de entrega do Firehose em formato de lote.O fluxo de entrega do Firehose transfere os itens para um bucket do S3 de destino com o prefixo `firehosetos3example/year=current year/month=current month/ day=current day/hour=current hour/`.Para otimizar a recuperação de dados, configure o Amazon S3 com `Prefix` e o `ErrorOutputPrefix`, conforme detalhado na seção *Informações adicionais*. | Arquiteto de nuvem  | 

### Limpe os recursos
<a name="clean-up-the-resources"></a>


| Tarefa | Description | Habilidades necessárias | 
| --- | --- | --- | 
| Excluir todos os recursos. | Excluir todos os recursos para garantir que não será cobrado por nenhum serviço que não esteja usando.   | Arquiteto de nuvem, desenvolvedor de aplicativos | 

## Recursos relacionados
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-resources"></a>
+ [Gerenciando seu ciclo de vida de armazenamento](https://docs.aws.amazon.com/AmazonS3/latest/user-guide/create-lifecycle.html)
+ [Classes de armazenamento do Amazon S3](https://aws.amazon.com/s3/storage-classes/)
+ [AWS SDK para Python (Boto3) documentation](https://boto3.amazonaws.com/v1/documentation/api/latest/index.html) 

## Mais informações
<a name="automatically-archive-items-to-amazon-s3-using-dynamodb-ttl-additional"></a>

**Criação e configuração de um fluxo de entrega do Firehose: exemplos de políticas**

*Documento de exemplo de política de relacionamento confiável do Firehose*

```
firehose_assume_role = {
        'Version': '2012-10-17',
        'Statement': [
            {
                'Sid': '',
                'Effect': 'Allow',
                'Principal': {
                    'Service': 'firehose.amazonaws.com'
                },
                'Action': 'sts:AssumeRole'
            }
        ]
    }
```

*Exemplo de política de permissões do S3*

```
s3_access = {
        "Version": "2012-10-17",		 	 	 
        "Statement": [
            {
                "Sid": "",
                "Effect": "Allow",
                "Action": [
                    "s3:AbortMultipartUpload",
                    "s3:GetBucketLocation",
                    "s3:GetObject",
                    "s3:ListBucket",
                    "s3:ListBucketMultipartUploads",
                    "s3:PutObject"
                ],
                "Resource": [
                    "{your s3_bucket ARN}/*",
                    "{Your s3 bucket ARN}"
                ]
            }
        ]
    }
```

**Teste a funcionalidade — configuração do Amazon S3**

A configuração do Amazon S3 com os seguintes `Prefix` e `ErrorOutputPrefix` é escolhida para otimizar a recuperação de dados. 

*prefix*

```
firehosetos3example/year=! {timestamp: yyyy}/month=! {timestamp:MM}/day=! {timestamp:dd}/hour=!{timestamp:HH}/
```

Primeiro, o Firehose cria uma pasta base denominada `firehosetos3example` diretamente no bucket do S3. Em seguida, ele avalia as expressões `!{timestamp:yyyy}``!{timestamp:MM}`,`!{timestamp:dd}`,, e `!{timestamp:HH}` para ano, mês, dia e hora usando o [DateTimeFormatter](https://docs.oracle.com/javase/8/docs/api/java/time/format/DateTimeFormatter.html)formato Java.

Por exemplo, um timestamp de chegada aproximado de 1604683577 no Unix epoch time avaliado como `year=2020`, `month=11`, `day=06` e `hour=05`. Portanto, a localização no Amazon S3, onde os registros de dados são entregues, é avaliada como `firehosetos3example/year=2020/month=11/day=06/hour=05/`.

*ErrorOutputPrefix*

```
firehosetos3erroroutputbase/!{firehose:random-string}/!{firehose:error-output-type}/!{timestamp:yyyy/MM/dd}/
```

Os resultados `ErrorOutputPrefix` em uma pasta base chamada `firehosetos3erroroutputbase` diretamente abaixo do bucket do S3. A expressão `!{firehose:random-string}` é avaliada como uma string aleatória de 11 caracteres, como `ztWxkdg3Thg`. A localização de um objeto do Amazon S3 onde os registros com falha são entregues pode ser avaliada como `firehosetos3erroroutputbase/ztWxkdg3Thg/processing-failed/2020/11/06/`.