Como configurar um aplicativo Rails 4.1 no AWS com o Elansch Beanstalk e o PostgreSQL

Amazon Web Services

Atualização: esta publicação está agora desactualizada. Existe uma NOVA VERSÃO desta publicação que atualizou as instruções para o novo Elastic Beanstalk e Rails 4.2.

O gerenciamento de operações em uma equipe pequena pode ser uma dor real. Na WillCall nossa infra-estrutura é bastante simples, mas ainda temos que girar para cima e para baixo muitos servidores todos os dias para lidar com o tráfego variado em nossos serviços. Três anos atrás, quando acabávamos de começar a empresa, fazíamos isso manualmente com o chef , mas poderia ser propenso a erros e começou a se sentir como um emprego a tempo inteiro.

Para projetos simples, ferramentas como o heroku podem ser perfeitas. Ótimo para protótipos de aplicativos e testar idéias diferentes sem muita dificuldade. Mas quando seu projeto se torna mais complicado e você quer ter mais controle de seus servidores, balanceadores de carga, trabalhadores, condições de auto-dimensionamento, etc., você também sentirá essa dor.

Existem muitos serviços que oferecem a capacidade de obter um aplicativo Rails funcionando rapidamente, mantendo o controle total da sua infra-estrutura, e meu favorito atual é o Elans Bekskk da Amazon. O serviço é apropriadamente descrito pela Amazon da seguinte forma:

O AWS Elastic Beanstalk torna ainda mais fácil para os desenvolvedores implantar rapidamente e gerenciar aplicativos na nuvem AWS. Os desenvolvedores simplesmente carregam sua aplicação e o Elastic Beanstalk administra automaticamente os detalhes de implementação do provisionamento de capacidade, balanceamento de carga, auto-dimensionamento e monitoramento de saúde de aplicativos.

Agora que a Amazon suporta o PostgreSQL via RDS com um aplicativo Rails totalmente gerenciado com versões anteriores, nunca foi tão fácil!

Você pode encontrar todo o código para esta postagem em github.com/jtescher/example-rails-elasticbeanstalk-blog

Se você ficar preso ou ter outras questões, a documentação para Elastic Beanstalk é muito boa.

Começando:

Inscreva-se para uma conta AWS através das instruções em console.aws.amazon.com/elasticbeanstalk e depois baixe as Ferramentas de linha de comando Elastic Beanstalk via Homebrew (ou aqui para PC)

 $ brew update 
$ brew install aws-elasticbeanstalk

Crie o aplicativo:

A versão mais atual dos trilhos no momento desta escrita é 4.1.0.rc1, então é isso que vamos usar agora.

 $ gem install rails -v 4.1.0.rc1 
$ rails new blog -database = postgresql
$ cd blog
$ git init && git add -A && git commit -m "Começo inicial"

Inicializar o ambiente beanstalk

 $ eb init 

Eu escolheria as seguintes configurações, mas para uma descrição de cada opção, veja o exemplo da AWS aqui

 Digite sua ID da chave de acesso AWS (o valor atual é "AKIAIOSEXAMPLE"): 
 Digite sua chave de acesso secreto AWS (o valor atual é "PfiCYEXAMPLE"): 
 Selecione uma região do serviço AWS Elastic Beanstalk. 
2) oeste dos EUA (Oregon)
 Insira o nome do aplicativo AWS Elastic Beanstalk 
(o valor gerado automaticamente é "blog"):
 Digite um nome de ambiente AWS Elastic Beanstalk 
(o valor atual é "blog-env"):
 Selecione um nível de ambiente. 
1) WebServer :: Standard :: 1.0
 Selecione uma pilha de soluções. 
44) 64bit Amazon Linux 2013.09 executando Ruby 1.9.3
 Selecione um tipo de ambiente. 
1) LoadBalanced
 Criar uma instância RDS DB? [y / n]: y 
 Crie uma Instância RDS BD de (o valor atual é "[Sem instantâneo]"): 1 
 Digite uma senha mestre do RDS DB: 
Digite novamente a senha para confirmar:
 Se você encerrar seu ambiente, sua Instância do RDS DB será excluída e você perderá seus dados. 
Criar instantâneo? [y / n]: y
 Anexe um perfil de instância (o valor atual é "[Criar um perfil de instância padrão]"): 1 

Em seguida, crie um arquivo optionsettings no diretório .elasticbeanstalk recém-criado chamado optionsettings.blog-env (ou seu nome env personalizado como a extensão se você personalizou)

 # .elasticbeanstalk / optionsettings.blog-env 
[aws: autoscaling: asg]
Zonas de disponibilidade personalizadas =
MaxSize = 4
MinSize = 1
 [aws: autoscaling: configuração de lançamento] 
EC2KeyName =
InstanceType = t1.micro
 [aws: autoscaling: updatepolicy: rollingupdate] 
RollingUpdateEnabled = false
 [aws: ec2: vpc] 
ELBScheme = public
ELBSubnets =
Subnações =
VPCId =
 [aws: elasticbeanstalk: aplicação] 
URL do Healthcheck do aplicativo =
 [aws: elasticbeanstalk: aplicação: ambiente] 
BUNDLE_WITHOUT = teste: desenvolvimento
RAILS_SKIP_ASSET_COMPILATION = false
RAILS_SKIP_MIGRATIONS = false
 [aws: elasticbeanstalk: hostmanager] 
LogPublicationControl = false
 [aws: elasticbeanstalk: monitoramento] 
Terminar automaticamente instâncias pouco saudáveis ??= true
 [aws: elasticbeanstalk: sns: topics] 
Ponto final da notificação =
Protocolo de notificação = email
 [aws: rds: dbinstance] 
DBDeletionPolicy = Instantâneo
DBEngine = postgres
DBInstanceClass = db.t1.micro
DBSnapshotIdentifier =
DBUser = ebroot

Então você pode testar que tudo funcionou:

 $ eb status 
Ambiente "blog-env" não está sendo executado.

Iniciando o aplicativo

Para iniciar o ambiente, execute: (vamos começar o aplicativo sem o aplicativo rails primeiro para garantir que tudo esteja configurado corretamente)

 $ eb start 
Gostaria de implantar o último compromisso do Git em seu ambiente? [y / n]: n
Esperando o ambiente "blog-env" para iniciar.
INFO createEnvironment está começando.
INFO Usando elasticbeanstalk-us-west-2-whatever como Amazon S3 s ...
Grupo de segurança criado pela INFO nomeado: sg-aebgroupid
INFO criou balanceador de carga chamado: awseb-em-AWSEBLoa-xloadid ...
Grupo de segurança criado pela INFO nomeado: sg-cebgroupid
Configuração de inicialização de criação de auto criada criada pelo nome: awseb-e ...
INFO Criando banco de dados RDS chamado: apdbnamez. Isso pode levar um ...
Banco de Dados RDS criado pela INFO nomeado: apdbnamez
INFO Esperando instâncias EC2 para iniciar. Isso pode levar alguns ...
Grupo de escala automotiva criado pela INFO chamado: awseb-e-dse-stack-AWSE ...
Política de grupo de criação automática criada pela INFO chamada: arn: aws: autosca ...
Política de grupo de criação automática criada pela INFO chamada: arn: aws: autosca ...
Ícone Criado CloudWatch chamado chamado: awseb-e-dv-stack-AWSEBCl ...
Ícone Criado CloudWatch chamado chamado: awseb-e-dv-stack-AWSEBCl ...

O ambiente agora deve estar em execução. Para ver o status e url:

 $ eb status -verbose 
Recuperando o status do ambiente "blog-env".
URL: blog-env-hkdpsewdfsd.elasticbeanstalk.com
Status: pronto
Saúde: Verde
Nome do ambiente: blog-env
ID do ambiente: e-jlksjdf8d8s
Nível de ambiente: WebServer :: Standard :: 1.0
Pilha de solução: 64 bits Amazon Linux 2013.09 executando Ruby 1.9.3
Etiqueta da versão: Exemplo de aplicação
Data de criação: 2014-01-20 18:45:40
Data de Atualização: 2014-01-20 19:03:13
Descrição :
 Base de dados RDS: AWSEBRDSDatabase | sdfjlsdkflsk.sdfkjlsdkjf.us ... 
Mecanismo de banco de dados: postgres 9.3.1
Armazenamento alocado: 10
Classe de instância: db.t1.micro
Multi AZ: Falso
Nome de usuário principal: ebroot
Tempo de criação: 2014-01-20 18:53:06
Status da instância DB: disponível

Se você abrir o URL que é retornado por este comando (deve ser URL: your-app-env.elasticbeanstalk.com) você deve ver a página de boas-vindas do Elastic Beanstalk:

Página de boas-vindas Elastic Beanstalk

Obtendo a gema pg para trabalhar em elástico

O pacote postgresql-devel yum é necessário para instalar a gema pg no amazon linux e a configuração de pacotes nas instâncias Elastic Beanstalk é tão simples como deixar um arquivo .config formatado com YAML em uma pasta .ebextensions de nível superior.

 # .ebextensions / packages.config 
pacotes:
yum:
postgresql-devel: []

Configurando database.yml para trabalhar com RDS postgres

As credenciais de banco de dados nunca devem ser codificadas e o Elastic Beanstalk torna as variáveis ??de gerenciamento de ambiente bastante simples. As variáveis ??RDS são configuradas e atualizadas automaticamente para que sua seção de produção do database.yml possa ser atualizada para ser a seguinte:

 Produção: 
<<: * padrão
banco de dados: <% = ENV ['RDS_DB_NAME']%>
nome de usuário: <% = ENV ['RDS_USERNAME']%>
senha: <% = ENV ['RDS_PASSWORD']%>
host: <% = ENV ['RDS_HOSTNAME']%>
porta: <% = ENV ['RDS_PORT']%>

Configurando secrets.yml

Por padrão, Rails agora inclui um arquivo secrets.yml e suas chaves e configurações de produção devem ser definidas como variáveis ??de ambiente. O ambiente padrão requer apenas uma variável SECRET_KEY_BASE a ser definida, então vamos adicionar isso ao seu ambiente. Primeira corrida:

 $ bundle exec rake secret 
5387fca6a0a69d945bb57e8be5bce3a119292216dfc95b270275c518641aa3e8db14a5ead261b1d50332a92ed860c544ef24356100ccb391507b1c5b8d46f39b

Em seguida, vá para console.aws.amazon.com/elasticbeanstalk/home e no blog-env à esquerda, sob configuração, clique na roda dentada próxima à 'Configuração de software'. Na parte inferior, entre SECRET_KEY_BASE à esquerda e a saída do segredo do rake à direita.

Depois de salvar, deve ser assim:

Variáveis ??de ambiente Elastic Beanstalk

Adicionando alguns andaimes

Para terminar, vamos adicionar um recurso de publicação para que possamos começar a blogar:

 $ rails geram título do post do andaime: corpo da corda: texto 
$ bundle exec rake db: migrate

Implantando o aplicativo ao AWS

Cometer todas as mudanças que acabamos de fazer:

 $ git add -A && git commit -am "Adicionar recurso de publicação, configure database.yml para produção" 

Em seguida, implante com:

 $ git aws.push 

Se você visitar https://console.aws.amazon.com/elasticbeanstalk/home, você deve ver o progresso do seu aplicativo à medida que ele se implanta.

Uma vez que você termine, você possui seu aplicativo funcional executando Rails e postgres! Vá para o seu-app-env.elasticbeanstalk.com/posts e você terminou !:

Demonstração final onde você pode editar postagens