

# Etapa 3: implantar em produção usando o serviço DynamoDB
<a name="TicTacToe.Phase3"></a>

**Topics**
+ [3.1: criar um perfil do IAM para oAmazon EC2](#TicTacToe.DeployInProd.IAMCreateRole)
+ [3.2: criar a tabela de jogos no Amazon DynamoDB](#TicTacToe.DeployInProd.CreateTable)
+ [3.3: empacotar e implantar o código da aplicação Jogo da velha](#TicTacToe.DeployInProd.IAMBundleDeployCode)
+ [3.4: configurar o ambiente do AWS Elastic Beanstalk](#TicTacToe.DeployInProd.SetUpElasticBeanstalk)

Em seções anteriores, você implantou e testou a aplicação Jogo da velha localmente no seu computador usando o DynamoDB local. Agora, você implanta o aplicativo em produção da seguinte forma:
+ Implante o aplicativo usando o AWS Elastic Beanstalk, um serviço fácil de usar para implantação e escalabilidade de aplicativos web e web services. Para obter mais informações, consulte [Implantar uma aplicação Flask no AWS Elastic Beanstalk](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/create-deploy-python-flask.html).

  O Elastic Beanstalk inicia uma ou mais instâncias do Amazon Elastic Compute Cloud (Amazon EC2), as quais você configura por meio do Elastic Beanstalk, nas quais sua aplicação Jogo da velha será executada.
+ Usando o serviço Amazon DynamoDB, crie uma tabela `Games` que resida na AWS em vez de localmente em seu computador. 

Além disso, você também tem que configurar as permissões. Todos os recursos da AWS que você cria, como a tabela `Games` no DynamoDB, são privados por padrão. Somente o proprietário do recurso, que é a conta da AWS que criou a tabela `Games`, pode acessar essa tabela. Assim, por padrão, seu aplicativo Jogo da velha não pode atualizar a tabela `Games`. 

Para conceder permissões necessárias, crie uma função do AWS Identity and Access Management (IAM) e conceda a essa função permissões para acessar a tabela `Games`. Sua instância do Amazon EC2; primeiro assume essa função. Em resposta, a AWS retorna credenciais de segurança temporárias que a instância do Amazon EC2 pode usar para atualizar a tabela `Games` em nome da aplicação Jogo da velha. Ao configurar sua aplicação Elastic Beanstalk, você especifica a função do IAM que a instância ou as instâncias do Amazon EC2 podem assumir. Para obter mais informações sobre os perfis do IAM, consulte [Funções do IAM para Amazon EC2](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/iam-roles-for-amazon-ec2.html) no *Guia do usuário do Amazon EC2*.

**nota**  
Antes de criar instâncias do Amazon EC2 para a aplicação Jogo da velha, você deve primeiro decidir a região da AWS onde deseja que o Elastic Beanstalk crie as instâncias. Depois de criar a aplicação Elastic Beanstalk, você deve fornecer os mesmos nomes de região e endpoint em um arquivo de configuração. A aplicação Jogo da velha usa informações desse arquivo para criar a tabela `Games` e enviar as solicitações subsequentes em uma região da AWS específica. Tanto a tabela `Games` do DynamoDB quanto as instâncias do Amazon EC2 iniciadas pelo Elastic Beanstalk devem estar na mesma região. Para obter uma lista das regiões disponíveis, acesse [Amazon DynamoDB ](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) no *Referência geral da Amazon Web Services*.

Resumindo, você faz o seguinte para implantar o aplicativo Jogo da velha em produção:

1. Crie uma função do IAM usando o serviço IAM. Você poderá anexar uma política a essa função, concedendo permissões para as ações do DynamoDB acessarem a tabela `Games`. 

1. Empacote o código do aplicativo Jogo da velha e um arquivo de configuração, e crie um arquivo `.zip`. Use o arquivo `.zip` para fornecer o código da aplicação Jogo da velha para o Elastic Beanstalk inserir em seus servidores. Para obter mais informações sobre a criação de um pacote, acesse [Criar um pacote de origem da aplicação](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/using-features.deployment.source.html) no *Guia do desenvolvedor do AWS Elastic Beanstalk*.

   No arquivo de configuração (`beanstalk.config`), você fornece informações sobre a região e o endpoint da AWS. A aplicação Jogo da velha usa essas informações para determinar com qual região do DynamoDB ela se comunicará. 

1. Configure o ambiente do Elastic Beanstalk. O Elastic Beanstalk inicia uma ou mais instâncias do Amazon EC2 e implanta o pacote da sua aplicação nessas instâncias. Depois que o ambiente do Elastic Beanstalk estiver pronto, você fornecerá o nome do arquivo de configuração, adicionando a variável de ambiente `CONFIG_FILE`.

1. Crie uma tabela do DynamoDB. Usando o serviço Amazon DynamoDB, crie a tabela `Games` na AWS em vez de localmente em seu computador. Lembre-se: essa tabela tem uma chave primária simples que consiste na chave de partição `GameId` do tipo string. 

1. Teste o jogo em produção. 

## 3.1: criar um perfil do IAM para oAmazon EC2
<a name="TicTacToe.DeployInProd.IAMCreateRole"></a>

Criar uma função do IAM do tipo **Amazon EC2** permitirá que a instância do Amazon EC2 que está executando sua aplicação Jogo da velha assuma a função correta e faça solicitações da aplicação para acessar a tabela `Games`. Ao criar a função, selecione a opção **Custom Policy (Política personalizada)**, copie e cole a política a seguir.

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

****  

```
{
   "Version":"2012-10-17",		 	 	 
   "Statement":[
      {
         "Action":[
            "dynamodb:ListTables"
         ],
         "Effect":"Allow",
         "Resource":"*"
      },
      {
         "Action":[
            "dynamodb:*"
         ],
         "Effect":"Allow",
         "Resource":[
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games",
            "arn:aws:dynamodb:us-west-2:922852403271:table/Games/index/*"
         ]
      }
   ]
}
```

------

Para obter instruções adicionais, consulte [Criação de uma função para um serviço da AWS (Console de gerenciamento da AWS)](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_roles_create_for-service.html) no *Guia do usuário do IAM*.

## 3.2: criar a tabela de jogos no Amazon DynamoDB
<a name="TicTacToe.DeployInProd.CreateTable"></a>

A tabela `Games` no DynamoDB armazena os dados do jogo. Se a tabela não existir, o aplicativo criará a tabela para você. Nesse caso, deixe o aplicativo criar a tabela `Games`.

## 3.3: empacotar e implantar o código da aplicação Jogo da velha
<a name="TicTacToe.DeployInProd.IAMBundleDeployCode"></a>

Se você seguiu as etapas deste exemplo, então, já fez download do aplicativo Jogo da velha. Caso contrário, faça download e extraia todos os arquivos para uma pasta no seu computador local. Para instruções, consulte [Etapa 1: implantar e testar localmente](TicTacToe.Phase1.md).

Após extrair todos os arquivos, você terá uma pasta `code`. Para fazer o handoff dessa pasta para o Elastic Beanstalk, você empacotará o conteúdo dessa pasta como um arquivo `.zip`. Primeiramente, você precisa adicionar um arquivo de configuração a essa pasta. Sua aplicação usa as informações da região e do endpoint para criar uma tabela do DynamoDB na região especificada e fará solicitações de operação de tabela subsequentes usando o endpoint especificado.

1. Alterne para a pasta na qual você fez download do aplicativo Jogo da velha.

1. Na pasta raiz do aplicativo, crie um arquivo de texto chamado `beanstalk.config` com o conteúdo a seguir.

   ```
   [dynamodb]
   region={{<AWS region>}}
   endpoint={{<DynamoDB endpoint>}}
   ```

   Por exemplo, você pode usar o conteúdo a seguir.

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   ```

   Para obter uma lista de regiões disponíveis, acesse [Amazon DynamoDB](https://docs.aws.amazon.com/general/latest/gr/rande.html#ddb_region) na *Referência geral da Amazon Web Services*. 
**Importante**  
A região especificada no arquivo de configuração é o local onde a aplicação Jogo da velha cria a tabela `Games` no DynamoDB. Você deve criar a aplicação Elastic Beanstalk discutida na próxima seção na mesma região. 
**nota**  
Ao criar sua aplicação Elastic Beanstalk, você pede para iniciar um ambiente no qual pode escolher o tipo de ambiente. Para testar o aplicativo de exemplo Jogo da velha, você pode escolher o tipo de ambiente **Single Instance (Instância única)**, ignorar o seguinte, e ir para a próxima etapa.   
No entanto, o tipo de ambiente **Load balancing, autoscaling (Balanceamento de carga, escalabilidade automática)** oferece um ambiente de alta disponibilidade e escalável, algo que você deve considerar ao criar e implantar outros aplicativos. Se você escolher esse tipo de ambiente, também será necessário gerar um UUID e adicioná-lo ao arquivo de configuração, como mostrado a seguir.  

   ```
   [dynamodb]
   region=us-west-2
   endpoint=dynamodb.us-west-2.amazonaws.com
   [flask]
   secret_key= 284e784d-1a25-4a19-92bf-8eeb7a9example
   ```
No comunicação entre cliente e servidor, quando o servidor envia a resposta, por segurança, o servidor envia um cookie assinado que o cliente envia de volta para o servidor na próxima solicitação. Quando há apenas um servidor, o servidor pode gerar localmente uma chave de criptografia quando ele for iniciado. Quando há vários servidores, todos eles precisam saber a mesma chave de criptografia; caso contrário, eles não poderão ler os cookies definidos pelos servidores do mesmo nível. Ao adicionar `secret_key` ao arquivo de configuração, todos os servidores são informados para usar essa chave de criptografia.

1. Compacte o conteúdo da pasta raiz do aplicativo (que inclui o arquivo `beanstalk.config`), por exemplo, `TicTacToe.zip`. 

1. Faça upload do arquivo `.zip` para um bucket do Amazon Simple Storage Service (Amazon S3) Na próxima seção, você fornece este arquivo `.zip` para o Elastic Beanstalk para fazer upload no servidor ou servidores.

   Para obter instruções sobre como fazer upload para um bucket do Amazon S3, consulte [Criar um bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/CreatingABucket.html) e [Adicionar um objeto a um bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/PuttingAnObjectInABucket.html) no *Guia do usuário do Amazon Simple Storage Service*.

## 3.4: configurar o ambiente do AWS Elastic Beanstalk
<a name="TicTacToe.DeployInProd.SetUpElasticBeanstalk"></a>

Nesta etapa, você cria uma aplicação Elastic Beanstalk, que é um conjunto de componentes, incluindo ambientes. Para este exemplo, você inicia uma instância do Amazon EC2 para implantar e executar sua aplicação Jogo da velha.

1. Insira o seguinte URL personalizado para configurar um console do Elastic Beanstalk para configurar o ambiente.

   ```
   https://console.aws.amazon.com/elasticbeanstalk/?region={{<AWS-Region>}}#/newApplication
   ?applicationName=TicTacToe{{your-name}}
   &solutionStackName=Python
   &sourceBundleUrl=https://s3.amazonaws.com/{{<bucket-name>}}/{{TicTacToe.zip}}
   &environmentType=SingleInstance
   &instanceType=t1.micro
   ```

   Para obter mais informações sobre URLs personalizados, acesse [Construção de um URL de início imediato](https://docs.aws.amazon.com/elasticbeanstalk/latest/dg/launch-now-url.html) no *Guia do desenvolvedor do AWS Elastic Beanstalk*. Para obter o URL, observe o seguinte:
   + Você precisará fornecer um nome de região da AWS (o mesmo que o fornecido no arquivo de configuração), um nome de bucket do Amazon S3 e o nome do objeto. 
   + Para testes, o URL solicita o tipo de ambiente **SingleInstance** e `t1.micro` como o tipo de instância.
   + O nome do aplicativo precisa ser exclusivo. Assim, no URL anterior, sugerimos que você insira seu nome ao `applicationName`.

   Essa ação abre o console do Elastic Beanstalk. Em alguns casos, talvez seja necessário fazer login.

1. No console do Elastic Beanstalk, escolha **Revisar e iniciar** e, em seguida, selecione **Iniciar**. 

1. Anote o URL para referência futura. Este URL abre a página inicial do seu aplicativo Jogo da velha.   
![Captura de tela do aplicativo mostrando a mensagem do ambiente que está sendo criado na página inicial.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-50.png)

1. Configure o aplicativo Jogo da velha para que ele saiba a localização do arquivo de configuração.

   Após o Elastic Beanstalk criar o aplicativo, escolha **Configuração**. 

   1. Selecione o ícone de engrenagem ao lado de **Software Configuration (Configuração de software)**, conforme mostrado na captura de tela a seguir.  
![Captura de tela do aplicativo Jogo da velha mostrando o ícone de engrenagem ao lado da configuração do software.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-60.png)

   1. No final da seção **Environment Properties (Propriedades do ambiente)**, digite **CONFIG\_FILE** e seu valor **beanstalk.config** e depois selecione **Save (Salvar)**.

      Pode levar alguns minutos para a atualização deste ambiente ser concluída.   
![Captura de tela do aplicativo mostrando a seção de propriedades do ambiente.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-beanstalk-setup-70.png)

   Depois que a atualização for concluída, você poderá jogar o jogo.

1. No navegador, digite o URL que você copiou na etapa anterior, como mostrado no exemplo a seguir. 

   ```
   http://{{<pen-name>}}.elasticbeanstalk.com
   ```

   Essa ação abre a página inicial do aplicativo.  
![Captura de tela da página inicial do aplicativo mostrando o botão de criação, convites, jogos em andamento e histórico recente.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-10.png)

1. Faça login como testuser1 e selecione **CREATE (Criar)** para iniciar um novo jogo da velha. 

1. Digite **testuser2** na caixa **Choose an Opponent (Escolher um oponente)**.  
![Captura de tela do aplicativo mostrando a caixa para escolha de um oponente.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-20.png)

1. Abra outra janela do navegador. 

   Certifique-se de limpar todos os cookies em sua janela do navegador, de modo que você não se conecte como o mesmo usuário.

1. Digite o mesmo URL para abrir a página inicial do aplicativo, como mostrado no exemplo a seguir:

   ```
   http://{{<env-name>}}.elasticbeanstalk.com
   ```

1. Faça login como testuser2.

1. Para o convite de testuser1 na lista de convites pendentes, selecione **accept (aceitar)**.  
![Captura de tela do aplicativo mostrando o convite testuser1 na lista de convites.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-30.png)

1. Agora a página do jogo aparece.  
![Captura de tela do aplicativo mostrando uma tabela de jogo da velha vazia.](http://docs.aws.amazon.com/pt_br/amazondynamodb/latest/developerguide/images/tic-tac-toe-inprod-playgame-40.png)

   testuser1 e testuser2 pode jogar o jogo. Para cada movimento, o aplicativo salva a movimentação no item correspondente na tabela `Games`. 