Andreas Wittig Michael Wittig Novatec
Original English language edition published by Manning Publications Co., Copyright 2015 by Manning Publications. Portuguese-language edition for Brazil copyright 2015 by Novatec Editora. All rights reserved. Edição original em Inglês publicada pela Manning Publications Co., Copyright 2015 pela Manning Publications. Edição em Português para o Brasil copyright 2015 pela Novatec Editora. Todos os direitos reservados. Novatec Editora Ltda. 2015. Todos os direitos reservados e protegidos pela Lei 9.610 de 19/02/1998. É proibida a reprodução desta obra, mesmo parcial, por qualquer processo, sem prévia autorização, por escrito, do autor e da Editora. Editor: Rubens Prates IG20151203 Assistente editorial: Priscila A. Yoshimatsu Tradução: Aldir José Coelho Corrêa da Silva Revisão gramatical: Smirna Cavalheiro Editoração eletrônica: Carolina Kuwabata ISBN: 978-85-7522-469-4 Histórico de impressões: Janeiro/2016 Primeira edição Novatec Editora Ltda. Rua Luís Antônio dos Santos 110 02460-000 São Paulo, SP Brasil Tel.: +55 11 2959-6529 E-mail: novatec@novatec.com.br Site: novatec.com.br Twitter: twitter.com/novateceditora Facebook: facebook.com/novatec LinkedIn: linkedin.com/in/novatec
Sumário Apresentação...13 Prefácio... 15 Agradecimentos...17 Sobre o livro...19 Sobre os autores... 22 Sobre a ilustração da capa... 23 Parte I Introdução... 24 Capítulo 1 O que é a Amazon Web Services?...25 1.1 O que é computação em nuvem?... 26 1.2 O que você pode fazer com a AWS?... 28 1.2.1 Hospedando uma loja web...28 1.2.2 Executando uma aplicação Java EE em sua rede privada...30 1.2.3 Atendendo requisitos legais e empresariais de arquivamento de dados... 31 1.2.4 Implementando uma arquitetura de sistema tolerante a falhas...32 1.3 Como você pode se beneficiar do uso da AWS... 33 1.3.1 Plataforma inovadora e em rápido crescimento...33 1.3.2 Os serviços resolvem problemas comuns...34 1.3.3 Beneficiando-se da automação...34 1.3.4 Capacidade flexível (escalabilidade)...34 1.3.5 Construa protegendo-se contra falhas (confiabilidade)...35 1.3.6 Reduzindo o tempo de distribuição para o mercado...35 1.3.7 Beneficiando-se de economias de escala...36 1.3.8 Abrangência mundial...36 1.3.9 Parceira profissional...36 1.4 Quanto custa?... 37 1.4.1 Nível gratuito... 37 1.4.2 Exemplo de cobrança...38 1.4.3 Oportunidades do modelo pay-per-use...40 5
6 Amazon Web Services em Ação 1.5 Comparando alternativas... 40 1.6 Explorando os serviços AWS... 42 1.7 Interagindo com a AWS... 45 1.7.1 Console de Gerenciamento...46 1.7.2 Interface de linha de comando...47 1.7.3 SDKs...47 1.7.4 Blueprints...48 1.8 Criando uma conta AWS... 49 1.8.1 Inscrevendo-se...50 1.8.2 Entrando...54 1.8.3 Criando um par de chaves...56 1.8.4 Criando um alarme de cobrança...60 1.9 Resumo... 60 Capítulo 2 Um exemplo simples: o WordPress em cinco minutos...61 2.1 Criando sua infraestrutura... 62 2.2 Examinando sua infraestrutura... 68 2.2.1 Grupos de recursos...68 2.2.2 Servidores web...69 2.2.3 Balanceador de carga... 71 2.2.4 Banco de dados MySQL...73 2.3 Quanto custa?...74 2.4 Excluindo sua infraestrutura... 76 2.5 Resumo... 77 Parte II Construindo uma infraestrutura virtual com servidores e rede... 78 Capítulo 3 Usando servidores virtuais: EC2...79 3.1 Examinando um servidor virtual... 80 3.1.1 Iniciando um servidor virtual...80 3.1.2 Conectando-se com um servidor virtual... 91 3.1.3 Instalando e executando softwares manualmente...94 3.2 Monitorando e depurando um servidor virtual... 95 3.2.1 Exibindo logs a partir de um servidor virtual...96 3.2.2 Monitorando a carga de um servidor virtual...97 3.3 Encerrando um servidor virtual... 98 3.4 Alterando o tamanho de um servidor virtual... 99 3.5 Iniciando um servidor virtual em outro datacenter...103 3.6 Alocando um endereço IP público...106
Sumário 7 3.7 Adicionando outra interface de rede a um servidor virtual...109 3.8 Otimizando os custos dos servidores virtuais... 113 3.8.1 Reserve servidores virtuais...113 3.8.2 Dando lances por servidores virtuais não usados...114 3.9 Resumo... 119 Capítulo 4 Programando sua infraestrutura: a linha de comando, os SDKs e o CloudFormation...121 4.1 Infraestrutura como código...123 4.1.1 Automação e o movimento DevOps... 123 4.1.2 Inventando uma linguagem de infraestrutura: o JIML... 124 4.2 Usando a interface de linha de comando...128 4.2.1 Instalando a CLI... 129 4.2.2 Configurando a CLI... 130 4.2.3 Usando a CLI... 135 4.3 Programando com o SDK... 141 4.3.1 Controlando servidores virtuais com o SDK: nodecc... 142 4.3.2 Como o nodecc cria um servidor... 143 4.3.3 Como o nodecc lista servidores e exibe seus detalhes...145 4.3.4 Como o nodecc encerra um servidor... 146 4.4 Usando um blueprint para iniciar um servidor virtual... 147 4.4.1 Anatomia de um template CloudFormation... 148 4.4.2 Criando seu primeiro template... 154 4.5 Resumo... 161 Capítulo 5 Automatizando a implantação: CloudFormation, Elastic Beanstalk e OpsWorks...163 5.1 Implantando aplicações em um ambiente de nuvem flexível...165 5.2 Executando um script na inicialização do servidor usando o CloudFormation...165 5.2.1 Usando dados de usuário para executar um script na inicialização do servidor... 166 5.2.2 Implantando o OpenSwan como servidor VPN em um servidor virtual... 166 5.2.3 Iniciando a partir do zero em vez de atualizar... 173 5.3 Implantando um aplicativo web simples com o Elastic Beanstalk... 174 5.3.1 Componentes do Elastic Beanstalk...174 5.3.2 Usando o Elastic Beanstalk para implantar o Eherpad, um aplicativo Node.js...175 5.4 Implantando um aplicativo multicamada com o OpsWorks...180 5.4.1 Componentes do OpsWorks...181 5.4.2 Usando o OpsWorks para implantar um aplicativo de chat do IRC... 183 5.5 Comparando ferramentas de desenvolvimento...193 5.5.1 Classificando as ferramentas de implantação... 193 5.5.2 Comparando os serviços de implantação... 194 5.6 Resumo...195
8 Amazon Web Services em Ação Capítulo 6 Protegendo seu sistema: IAM, grupos de segurança e VPC...196 6.1 Quem é responsável pela segurança?...198 6.2 Mantendo seu software atualizado...198 6.2.1 Procurando atualizações de segurança... 199 6.2.2 Instalando atualizações de segurança na inicialização do servidor...200 6.2.3 Instalando atualizações de segurança em servidores em execução... 202 6.3 Protegendo sua conta... 203 6.3.1 Protegendo o usuário root de sua conta AWS...204 6.3.2 Serviço Identity and Access Management...205 6.3.3 Políticas de autorização...206 6.3.4 Usuários na autenticação e grupos para organizar usuários...209 6.3.5 Funções para autenticação de recursos AWS...210 6.4 Controlando o tráfego de rede enviado de e para seu servidor virtual... 213 6.4.1 Controlando tráfego enviado para servidores virtuais com grupos de segurança...214 6.4.2 Permitindo a entrada de tráfego ICMP... 216 6.4.3 Permitindo tráfego SSH...218 6.4.4 Permitindo a entrada de tráfego SSH proveniente de um endereço IP de origem...218 6.4.5 Permitindo tráfego SSH proveniente de um grupo de segurança...220 6.4.6 Encaminhamento de agente com o PuTTY... 223 6.5 Criando uma rede privada na nuvem: a rede virtual privada (VPC, virtual private cloud)...224 6.5.1 Criando a VPC e o gateway de internet (IGW, Internet gateway)...226 6.5.2 Definindo a sub-rede pública do bastion host... 227 6.5.3 Adicionando a sub-rede privada do servidor web Apache...231 6.5.4 Iniciando servidores nas sub-redes... 232 6.5.5 Acessando a internet a partir de sub-redes privadas via servidor NAT... 233 6.6 Resumo...236 Parte III Armazenando dados na nuvem...237 Capítulo 7 Armazenando seus objetos: S3 e Glacier...239 7.1 Conceito de um armazenamento de objetos...239 7.2 Amazon S3...240 7.3 Fazendo o backup de seus dados...242 7.4 Arquivando objetos para otimizar custos... 244 7.4.1 Criando um bucket S3 para ser usado com o Glacier... 245 7.4.2 Adicionando uma regra de ciclo de vida a um bucket... 245 7.4.3 Fazendo testes com o Glacier e com sua regra de ciclo de vida... 248
Sumário 9 7.5 Armazenando objetos por meio de programas...250 7.5.1 Configurando um bucket S3...251 7.5.2 Instalando um aplicativo web que usa o S3...251 7.5.3 Tendo acesso ao código: S3 com SDK... 252 7.6 Usando o S3 para a hospedagem estática na Web...255 7.6.1 Criando um bucket e fazendo o upload de um site estático...256 7.6.2 Configurando um bucket para a hospedagem estática na web... 257 7.6.3 Acessando um site hospedado no S3... 258 7.7 Funcionamento interno do armazenamento de objetos...259 7.7.1 Assegurando a consistência dos dados... 259 7.7.2 Selecionando as chaves certas...260 7.8 Resumo... 261 Capítulo 8 Armazenando seus dados em unidades de disco rígido: EBS e armazenamento de instância..263 8.1 Armazenamento anexado à rede... 264 8.1.1 Criando um volume EBS e anexando-o ao seu servidor...265 8.1.2 Usando o Elastic Block Store...266 8.1.3 Ajustando o desempenho...269 8.1.4 Fazendo o backup de seus dados...271 8.2 Armazenamentos de instância...273 8.2.1 Usando um armazenamento de instância...277 8.2.2 Testando o desempenho... 278 8.2.3 Fazendo o backup de seus dados... 279 8.3 Comparando soluções de armazenamento de nível de bloco...279 8.4 Hospedando um sistema de arquivos compartilhado suportado por um armazenamento de instância e pelo EBS... 280 8.4.1 Grupos de segurança do NFS...282 8.4.2 Servidor e volume NFS...284 8.4.3 Script de instalação e configuração do servidor NFS...285 8.4.4 Clientes NFS...289 8.4.5 Compartilhando arquivos via NFS...289 8.5 Resumo... 290 Capítulo 9 Usando um serviço de banco de dados relacional: RDS...291 9.1 Iniciando um banco de dados MySQL... 294 9.1.1 Iniciando uma plataforma WordPress com um banco de dados Amazon RDS...294 9.1.2 Examinando uma instância de banco de dados RDS com um mecanismo MySQL.299 9.1.3 Preço do Amazon RDS...303 9.2 Importando dados para um banco de dados... 303
10 Amazon Web Services em Ação 9.3 Fazendo o backup e restaurando seu banco de dados... 306 9.3.1 Configurando snapshots automatizados...306 9.3.2 Criando snapshots manualmente...308 9.3.3 Restaurando um banco de dados...309 9.3.4 Copiando um banco de dados em outra região...310 9.3.5 Calculando o custo dos snapshots... 311 9.4 Controlando o acesso a um banco de dados... 312 9.4.1 Controlando o acesso à configuração de um banco de dados RDS...313 9.4.2 Controlando o acesso de rede a um banco de dados RDS...314 9.4.3 Controlando o acesso aos dados...315 9.5 Usando um banco de dados altamente disponível... 316 9.5.1 Ativando a instalação de alta disponibilidade para um banco de dados RDS...317 9.6 Ajustando o desempenho do banco de dados... 319 9.6.1 Aumentando os recursos do banco de dados...319 9.6.2 Usando a replicação para melhorar o desempenho da leitura... 322 9.7 Monitorando um banco de dados...325 9.8 Resumo...327 Capítulo 10 Programando para o serviço de banco de dados NoSQL: DynamoDB...328 10.1 Operando o DynamoDB...330 10.1.1 Administração... 330 10.1.2 Preço...331 10.1.3 Comparação com o RDS...331 10.2 DynamoDB para desenvolvedores...332 10.2.1 Tabelas, itens e atributos... 332 10.2.2 Chaves primárias... 333 10.2.3 Comparação de bancos de dados NoSQL... 333 10.2.4 DynamoDB Local... 334 10.3 Programando um aplicativo de tarefas pendentes...334 10.4 Criando tabelas...337 10.4.1 Usuários com chaves hash... 338 10.4.2 Tarefas com chaves de hash e intervalo...340 10.5 Adicionando dados...342 10.5.1 Adicionando um usuário...344 10.5.2 Adicionando uma tarefa... 345 10.6 Recuperando dados...347 10.6.1 Capturando por chave... 347 10.6.2 Consultando por chave e filtro... 349 10.6.3 Usando índices secundários para fornecer consultas mais flexíveis... 352 10.6.4 Percorrendo e filtrando todos os dados de sua tabela... 355
Sumário 11 10.6.5 Recuperação de dados eventualmente consistente... 357 10.7 Removendo dados...358 10.8 Modificando dados...359 10.9 Dimensionando a capacidade... 360 10.10 Resumo... 363 Parte IV Projetando na AWS...365 Capítulo 11 Alcançando a alta disponibilidade: zonas de disponibilidade, autoescalonamento e CloudWatch.367 11.1 Recuperando-se de falha no servidor com o CloudWatch... 369 11.1.1 Criando um alarme do CloudWatch...371 11.1.2 Monitorando e recuperando um servidor virtual com base em um alarme do CloudWatch... 373 11.2 Recuperando-se da interrupção em um datacenter...379 11.2.1 Zonas de disponibilidade: vários datacenters por região... 379 11.2.2 Usando o autoescalonamento para assegurar que um servidor virtual esteja sempre em execução...384 11.2.3 Recuperando um servidor virtual defeituoso em outra zona de disponibilidade com a ajuda do autoescalonamento...388 11.2.4 Armadilha: recuperação de armazenamento anexado à rede... 393 11.2.5 Armadilha: recuperação de interface de rede... 398 11.3 Analisando os requisitos da recuperação em caso de desastre... 403 11.3.1 Comparação entre RTO e RPO para um único servidor virtual...404 11.4 Resumo... 405 Capítulo 12 Desacoplando sua infraestrutura: ELB e SQL...406 12.1 Desacoplamento síncrono com balanceadores de carga... 407 12.1.1 Definindo um balanceador de carga com servidores virtuais...409 12.1.2 Armadilha: conectando um servidor cedo demais...412 12.1.3 Mais casos de uso...414 12.2 Desacoplamento assíncrono com filas de mensagens...422 12.2.1 Transformando um processo síncrono em um assíncrono... 423 12.2.2 Arquitetura do aplicativo URL2PNG... 424 12.2.3 Definindo uma fila de mensagens... 425 12.2.4 Produzindo mensagens programaticamente... 425 12.2.5 Consumindo mensagens programaticamente... 427 12.2.6 Limitações da troca de mensagens com o SQS... 432 12.3 Resumo...433
12 Amazon Web Services em Ação Capítulo 13 Projetando para tolerância a falhas...435 13.1 Usando instâncias EC2 redundantes para aumentar a disponibilidade... 438 13.1.1 A redundância pode eliminar um ponto de falha individual... 439 13.1.2 Redundância requer desacoplamento... 441 13.2 Considerações para tornar seu código tolerante a falhas... 442 13.2.1 Deixe falhar, mas tente de novo...442 13.2.2 A repetição idempotente torna possível a tolerância a falhas...443 13.3 Projetando um aplicativo web tolerante a falhas: Imagery... 446 13.3.1 A máquina de estados de imagem idempotentes... 450 13.3.2 Implementando um web service tolerante a falhas... 452 13.3.3 Implementando um worker tolerante a falhas para consumir mensagens SQS... 461 13.3.4 Implantando o aplicativo...466 13.4 Resumo...477 Capítulo 14 Escalonamento para cima e para baixo: autoescalonamento e CloudWatch...478 14.1 Gerenciando um pool de servidores dinâmico...481 14.2 Usando métricas e schedules para acionar o escalonamento... 486 14.2.1 Escalonamento baseado em um schedule...488 14.2.2 Escalonamento baseado em métricas do CloudWatch...490 14.3 Desacoplando seu pool de servidores dinâmico... 495 14.3.1 Dimensionando um pool de servidores dinâmico sincronamente desacoplado por um balanceador de carga...496 14.3.2 Dimensionando um pool de servidores dinâmico assincronamente desacoplado por uma fila...505 14.4 Resumo... 509