Amazon EFS como repositório de código para EC2s com dimensionamento automático

2

tl; dr: preciso configurar uma sincronização automática rápida do EFS para vários EC2s

Eu configurei um EC2 Auto-Scaling Group na AWS e estou procurando a melhor maneira de gerenciar implantações de código em minhas instâncias, com o mínimo de interrupção de serviço possível (de preferência nenhuma) e com pouco escopo para humanos erro quanto possível (de preferência nenhum, hahaha) ...

Isto é para um site do Magento. Inicialmente, olhei para armazenar todo o conteúdo da Web no EFS (Elastic File System) e fazer com que meu EC2 o montasse na inicialização, portanto, havia apenas uma base de código centralizada à qual cada um deles teria acesso. Eu rapidamente descobri que essa era uma Idéia Muito Ruim - servir conteúdo da web de um site do tamanho do Magento em um compartilhamento de rede é basicamente impraticável, e com a latência no EFS é ainda pior do que seu compartilhamento médio de NFS.

O que eu estou tentando alcançar agora é ter uma base de código centralizada no EFS, com uma sincronização quase em tempo real de lá para um diretório "local" (EBS) em cada instância.

Eu tentei rsync , usando uma abordagem "pull", tendo cada instância arquivos rsync do EFS para ela mesma. No início, parecia bom, mas parece que gradualmente fica mais lento a cada exame (mais de uma hora no último teste).

Eu tentei find , resultado semelhante.

Eu experimentei o transportador de symlink_or_copy do fileconveyor , mas isso ainda parece lento - talvez porque por uma razão ou outro não está usando inotify para descobrir mudanças e está voltando para a pesquisa.

Em última análise, o objetivo é permitir que um desenvolvedor implante arquivos novos e alterados em um único local e que esses arquivos sejam replicados de maneira rápida e automática em todas as instâncias em execução. O desenvolvedor não precisa saber ou se importar com quantas instâncias estão em execução - é provável que varie de hora em hora.

Esta resposta a uma pergunta semelhante é muito boa e é a abordagem que estou usando atualmente - uma instância protegida do EC2 é atualizado, novo AMI é criado, instâncias restantes são eliminadas e substituições são inicializadas com base na nova imagem. O EFS basicamente se torna redundante.

Mas a intervenção manual necessária é realmente muito mais trabalhosa, e mais propensa a erros humanos, do que eu posso ficar com o longo prazo. Eu não quero ter que criar uma nova AMI e iniciar a configuração, e atualizar o Auto Scaling Group para usar esse novo LC, toda vez que eu fizer uma implantação.

Então ... como faço para sincronizar rápida e automaticamente do EFS para vários EC2s?

Se eu conseguir um colaborador trabalhando em conjunto com o inotify, isso resolverá isso? Ou isso é uma perseguição selvagem, alguém sabe?

    
por Doug McLean 06.06.2018 / 13:32

2 respostas

2

Veja o que eu faria:

  • Crie uma "imagem dourada" AMI que tenha tudo a partir de agora. O ideal seria configurar usando uma combinação de CloudFormation e Opsworks .
  • Configure o AWS Code Commit para armazenar seu código-fonte
  • Configure o AWS Code Deploy para implantar o código-fonte atualizado em suas instâncias. Isso significa que você não precisa reconstruir a AMI para cada alteração do código fonte, é uma implementação simples. Usando a imagem dourada em vez de construir do zero, você obtém o benefício da nova instância surgindo rapidamente com apenas um pequeno atraso para atualizar o código. Esta é uma atualização bastante trivial, portanto, provavelmente poderia ser feita com Dados do usuário do EC2 se você quero fazê-lo rapidamente.
  • Se você quiser automatizar ambientes de teste / pré-produção, testes e implantações de produção (com aprovação manual opcional), consulte Pipeline de código da AWS .
  • Você pode fazer azul / verde (gradual) usando implantações Route53 / Nginx / HAProxy ou vermelho / preto (cut-over) usando uma variedade de métodos.

Este material não é ciência de foguetes para começar a trabalhar, mas pode levar um pouco de tempo se você não estiver familiarizado com isso. Depois que você fizer a automação, poderá economizar um bom tempo para testes e implementações.

    
por 06.06.2018 / 22:20
1

O AWS CodeDeploy pode ser uma opção para isso. Você poderia criar um artefato a partir de uma instância do EC2, enviá-lo para o S3 e implementá-lo usando o CodeDeploy . Citação:

Finally, the AWS CodeDeploy agent on each instance pulls the target revision from the specified Amazon S3 bucket or GitHub repository and, using the instructions in the AppSpec file, deploys the contents to the instance.

O CodeDeploy suporta implementações Blue / Green e permite revisões e reversões, o que pode ser útil para o seu caso.

    
por 06.06.2018 / 17:17