Automatize a implementação de guerra na sub-rede privada da VPC no tomcat7

5

Eu tenho um VPC com sub-redes públicas e privadas.

  • A sub-rede pública contém minhas Nating e Bastion instâncias
  • A sub-rede privada contém meus servidores de aplicativos (3 ec2 instâncias executando tomcat7 com meu arquivo war project). Essas 3 instâncias são codificadas como ELB

Sempre que eu quiser atualizar o arquivo de guerra, posso fazê-lo de duas maneiras.

Manual

  1. eu carrego um novo arquivo war no bucket S3
  2. SSH para Bastion server (somente isso pode ser SSHed)
  3. daqui SSH para instância privada
  4. Faça o download do arquivo war do S3, pare o tomcat7 substitua o war antigo (e exclua o diretório)
  5. Iniciar o tomcat

Repito os passos acima para cada instância (atualmente 3 instâncias)

Semi-manual Aqui estão os passos

  1. Carregar nova guerra para o bucket S3
  2. Mate uma instância (no painel de controle do site da AWS)
  3. A configuração de dimensionamento e inicialização entra em ação automaticamente para manter o número mínimo de instâncias. Isso inicia uma nova instância e executa um script que realmente faz o download do war do S3 e de algumas outras configurações e pastas do ambiente, etc.
  4. Quando vejo a nova instância criada, em execução e adicionada ao ELB, mato outra instância antiga.
  5. Dessa forma, eu mato todas as instâncias antigas, uma a uma, e elas foram substituídas por novas instâncias com as atualizações mais recentes.

First method is quick but lots of manual steps. SSH in-and-out of the instances (SSH on instances is only allowed from BASTION server). download, stop, replace, start.

Second method is slow and not actually automatic. Old instance termination time + New instance launch time + Deploying the new war

Eu quero alcançar as seguintes coisas

  1. Automatize o processo de atualização (clique de um botão)
  2. O não-desenvolvedor gosta de QA e o pessoal de suporte pode atualizar sem ter acesso ao site da AWS ou às chaves SSH
  3. Atualização rápida
  4. Reversão em caso de falha

One may think why don't I use Beanstalk, its simple and just upload new war file, automatically upgrade all the instances with roll back feature if anything goes wrong?

Aqui estão minhas razões (algumas coisas podem ser apenas minha suposição ou falta de conhecimento).

  1. A arquitetura geral do aplicativo é complexa , a VPC contém 9 sub-redes e muitas instâncias ec2 em sub-redes privadas e públicas. e configuração de segurança complexa usando grupos de segurança
  2. Minha própria nomenclatura convenção para as sub-redes (Public_Subnet_A, Public_Subnet_B, Private_WEB_A, Private_WEB_B, Private_API_A, SG_GLOBAL, SG_BASTION, SG_BASTION e muito mais). Eu não vejo uma maneira de fazer isso no ElasticBeanstalk.
  3. O Beanstalk suporta apenas modelos predefinidos limitados para ambientes predefinidos. Como eu quero minhas instâncias baseadas no Ubuntu, tendo o Tomcat7, rodando o Java6 ou 7 e poucas outras.
  4. O aplicativo Beanstalk para Java executa o tomcat8, amazon-instance, ele também mantém o tomcat atrás do Apache (e acho que a ponte é feita através de mode_jk ) e, em seguida, esse Apache está por trás do ELB. E eu acho que coisa do tipo ELB- > Apache-mode_jk- > é um pouco exagerada (estou errado).
  5. Estou usando a abordagem de tomcat do & ldb; >
  6. Meu tráfego de saída é através do servidor NATing . Não há como, teoricamente, o mundo externo conhecer instâncias.
  7. Nas instâncias do beanstalk podem ser acessadas diretamente. mas no meu ambiente não é possível você só pode ssh instância BASTION de IP específico com uma chave ssh e algum nome de usuário sudo-aleatório (eu acho que é difícil de adivinhar), e instâncias privadas podem ser SSHed somente através de BASTION (configuração do grupo de segurança personalizada).
  8. Da mesma forma, minha instância do RDS também está em uma das minhas sub-redes privadas nomeadas e somente as instâncias de API do aplicativo podem se conectar ao banco de dados (disseram a você muita configuração personalizada).
  9. E há alguns outros também.

Agora você conhece o plano de fundo. Vamos ficar com a versão simples do exemplo que expliquei no topo.

Eu quero que a atualização seja rápida e automática, também não use ferramentas de terceiros para compartilhar minhas credenciais com essas ferramentas (ouvi falar de algumas ferramentas baseadas na nuvem que podem oferecer transparência e executar todas as tarefas em sua escolha de ambiente de nuvem).

A única coisa em que consigo pensar é escrever um script ANT ou algum código Java que possa executar todas as etapas explicadas no primeiro método. embora não tenha certeza de que seriam autorizados a realizar essas operações no aws.

    
por PHP Avenger 03.09.2016 / 13:41

1 resposta

0

O mesmo problema, depois de passar mais de dois dias, percebi que há um plugin chamado Publicar artefatos sobre SSH para jenkins (se você tiver CI) e fazer algumas alterações de configuração para permitir que o NAT converse com o servidor Jenkins, pelo menos o truque para mim.

Eu tenho a mesma configuração, como servidores em sub-rede privada e NAT em sub-rede pública, de onde eu ssh para implantar a guerra em máquinas privadas.

Espero que isso ajude!

    
por 04.04.2017 / 16:27