Como associar uma instância RDS existente a um ambiente Elastic Beanstalk?
22
Criei minha instância do RDS antes de criar o ambiente do Elastic Beanstalk. Os dois estão trabalhando juntos sem nenhum problema, mas eu gostaria que eles fossem vinculados e tenham os parâmetros do RDS acessíveis por RDS_*meio das variáveis de ambiente.
A página de configuração do Elastic Beanstalk diz:
Embora o primeiro link crie uma instância do RDS no local e a vincule ao ambiente atual, o segundo link apenas redireciona para esta página de documentação. , que infelizmente explica apenas como criar uma nova instância do RDS, mas não como vincular uma instância existente.
Como associar uma instância RDS existente ao meu ambiente Elastic Beanstalk?
A resposta "selecionada" está correta, mas eu queria adicionar algumas informações extras, pois a maioria das pessoas que usam EB e RDS juntas também deve ter o mesmo requisito - mesmo que ainda não o conheçam.
Primeira pergunta : Por que você deseja que a instância do RDS exista fora do ambiente EB?
Resposta : para que o tempo de vida da instância do RDS não esteja vinculado ao tempo de vida do ambiente EB. ou seja, quando você remove um ambiente, não deseja destruir o banco de dados com ele. Existem muito poucas razões pelas quais você deseja realmente vincular sua instância do RDS ao seu ambiente.
Um problema com a configuração do RDS independentemente do EB é que você não obtém as variáveis RDS_ * preenchidas automaticamente e, portanto, precisa recuperar seus valores e preenchê-los por meio do console da web ou extensões. Não é recomendável adicionar credenciais ao seu código, pois isso pode ser uma falha de segurança.
Mas, então, o próximo problema é que, se você deseja criar ambientes de programação (como implantações de tempo de inatividade zero em azul e verde), precisa de uma solução para preencher os valores sensíveis do RDS (por exemplo, senha) todas as vezes. Infelizmente, isso exige que você desça ainda mais a pilha da AWS e use um modelo CloudFormation.
A solução ideal é um aprimoramento do EB, para que o link "use a existente database" mencionado na pergunta permita associar manualmente um banco de dados RDS existente e, em seguida, tenha as variáveis de ambiente RDS_ * preenchidas automaticamente novamente, em vez de redirecioná-lo para a documentação inútil . O Suporte da AWS disse que isso foi levantado como uma solicitação de recurso, mas é claro que não há prazo previsto.
Etapas para adicionar rds docs.aws.amazon.com/elasticbeanstalk/latest/dg/… (apenas para completar pessoas como eu pesquisando). Você não cria uma configuração de ambiente e carrega-a através de um arquivo de configuração na criação. Isso deve adicionar ambientes, portanto, desde que eles não mudem, isso deve estar ok?
Para associar um banco de dados existente a um ambiente EB, você deve tirar uma foto instantânea dele através do Console de gerenciamento e escolher "criar um novo banco de dados RDS" na Camada de dados. Não parece haver uma maneira de associar uma instância RDS em execução a um ambiente EB existente sem iniciar uma nova a partir de uma captura instantânea devido à maneira como a instância RDS está vinculada à pilha Cloudformation subjacente do ambiente Beanstalk. Se você tirar um instantâneo da sua instância atual do RDS, poderá iniciá-lo novamente no EB, se desejar.
Se você deseja que a instância do RDS exista fora do ambiente, basta fornecer os parâmetros de conexão como variáveis de ambiente por meio do EB Console: Configuração -> Camada da Web -> Configuração de software. Então, você pode ler a variável de ambiente via PHP .
Adotei a segunda abordagem, definindo variáveis de ambiente com os nomes RDS_ * para seguir a convenção. Os grupos de segurança são definidos com bastante rigidez, mas ainda é um pouco solto colocar uma senha de banco de dados em uma variável de ambiente.
quer
@velotron O mesmo para mim, mas me acostumei!
Benjamin
2
Eu precisava disso recentemente e também queria automatizar as etapas usando o AWS CLI / EB CLI. De qualquer forma, aqui estão basicamente as etapas que segui (assumindo que você já criou uma instância do RDS):
Verifique se você tem uma configuração de grupo de segurança diferente para sua instância do RDS (não o grupo padrão da VPC). Você pode usar aws ec2 create-security-group(AWS CLI) para isso e associá-lo à instância do RDS usando aws rds modify-db-instance(AWS CLI).
Inicialize seu aplicativo beanstalk (eu usei eb init(EB CLI) para isso).
Leia os dados de configuração relevantes do seu banco de dados RDS (nome do banco de dados, nome do host, porta etc.). Eu usei aws rds describe-db-instancespara isso.
O uso desses dados define as RDS_*variáveis de ambiente na instância EB quando você cria o ambiente (ou implementa o ambiente posteriormente). Você pode fazer isso com eb create/ eb deploy(EB CLI). Quando você cria o ambiente inicialmente, ele é degradado, pois os grupos de segurança para acessar o banco de dados do RDS não estão configurados corretamente.
Obtenha os grupos de segurança relevantes da configuração da EB. Você precisa do grupo de dimensionamento automático e do balanceador de carga elástico. Você pode usar aws elasticbeanstalk describe-configuration-settings(AWS CLI) para isso.
Autorize seu grupo de dimensionamento automático para tráfego de entrada no banco de dados para o grupo de segurança que você configurou na etapa 1. Eu usei aws ec2 authorize-security-group-ingress(AWS CLI) para isso, que usa grupos de segurança VPC (não grupos de segurança de banco de dados). Provavelmente, você pode conseguir o mesmo com os grupos de segurança do banco de dados, se houver suporte na sua região. Ao configurar a regra de tráfego de entrada, use a porta e o protocal certos para o seu mecanismo de banco de dados.
Adicione o grupo do balanceador de carga elástico aos grupos de segurança da sua instância do RDS (novamente usando aws rds modify-db-instance(AWS CLI)).
Reinicialize ou reimplemente o aplicativo Elastic Beanstalk (por exemplo, usando eb deploy(EB CLI)). Eu tive que fazer uma reimplantação, pois executo migrações nas implantações.
É isso mesmo. Agora você deve poder aumentar / diminuir as instâncias do RDS sem cuidar das instâncias do EB, desde que mantenha o nome do host e as credenciais do banco de dados iguais. Você também pode fazer implantações em azul / verde com essa abordagem (mas pode ser necessário executar algumas etapas extras para também revogar o acesso ao grupo de segurança).
crie RDS sob Elastic; adicionará novo grupo de segurança correto; modificar grupo de segurança do antigo RDS existente; defina a string de conexão correta na configuração da web e todo o trabalho ...
Resposta do suporte da AWS :
fonte
Eu precisava disso recentemente e também queria automatizar as etapas usando o AWS CLI / EB CLI. De qualquer forma, aqui estão basicamente as etapas que segui (assumindo que você já criou uma instância do RDS):
aws ec2 create-security-group
(AWS CLI) para isso e associá-lo à instância do RDS usandoaws rds modify-db-instance
(AWS CLI).eb init
(EB CLI) para isso).aws rds describe-db-instances
para isso.RDS_*
variáveis de ambiente na instância EB quando você cria o ambiente (ou implementa o ambiente posteriormente). Você pode fazer isso comeb create
/eb deploy
(EB CLI). Quando você cria o ambiente inicialmente, ele é degradado, pois os grupos de segurança para acessar o banco de dados do RDS não estão configurados corretamente.aws elasticbeanstalk describe-configuration-settings
(AWS CLI) para isso.aws ec2 authorize-security-group-ingress
(AWS CLI) para isso, que usa grupos de segurança VPC (não grupos de segurança de banco de dados). Provavelmente, você pode conseguir o mesmo com os grupos de segurança do banco de dados, se houver suporte na sua região. Ao configurar a regra de tráfego de entrada, use a porta e o protocal certos para o seu mecanismo de banco de dados.aws rds modify-db-instance
(AWS CLI)).eb deploy
(EB CLI)). Eu tive que fazer uma reimplantação, pois executo migrações nas implantações.É isso mesmo. Agora você deve poder aumentar / diminuir as instâncias do RDS sem cuidar das instâncias do EB, desde que mantenha o nome do host e as credenciais do banco de dados iguais. Você também pode fazer implantações em azul / verde com essa abordagem (mas pode ser necessário executar algumas etapas extras para também revogar o acesso ao grupo de segurança).
fonte
O mais fácil de adicionar um grupo de segurança existente às instâncias do EB EC2 por configuração é usar o arquivo simples descrito em https://github.com/awsdocs/elastic-beanstalk-samples/blob/master/configuration-files/aws-provided/ security-configuration / securitygroup-addexisting.config
Por exemplo:
fonte
Eu estava enfrentando o mesmo problema e corrigido usando as seguintes etapas:
1) Vá para a instância do EC2 e observe o exemplo do seu grupo de segurança "sg-121212121212"
2) Vá para anúncio do grupo de segurança RDS = tráfego de entrada
3) Editar regra, selecione todo o tráfego e adicione seu novo grupo de segurança ebs "sg-121212121212"
Espero que seja útil
fonte
crie RDS sob Elastic; adicionará novo grupo de segurança correto; modificar grupo de segurança do antigo RDS existente; defina a string de conexão correta na configuração da web e todo o trabalho ...
fonte