Existe uma maneira de criar ganchos de ciclo de vida de escalonamento automático da AWS com o CloudFormation sem uma condição de corrida?

2

Estou tentando usar os ganchos do ciclo de vida do autoescala da AWS em um modelo que encapsula as seguintes coisas:

  1. AWS::AutoScaling::AutoScalingGroup com políticas de up / down de escala associadas, configuração de lançamento, função do IAM, etc.
  2. 2 de AWS::AutoScaling::LifecycleHook para eventos de lançamento / término do EC2.
  3. AWS::SQS::Queue (em um exemplo simplificado) onde as notificações do ciclo de vida são postadas.
  4. AWS::IAM::Role role para o grupo de escalonamento automático para postar notificações na fila do SQS.

Quando um ASG é iniciado, a fila termina com duas notificações de teste da criação de ganchos do ciclo de vida, mas nenhuma notificação é lançada.

E aqui está a condição de corrida.

AWS::AutoScaling::LifecycleHook object referencia AWS::AutoScaling::AutoScalingGroup (e, portanto, depende disso). Isso determina a ordem na qual o CloudFormation cria recursos (o grupo é criado primeiro).

O problema é que o grupo inicia o lançamento de instâncias antes que a criação do gancho seja concluída (o lançamento da instância não faz parte do modelo, portanto, ele é executado em paralelo). No momento em que o gancho é criado, não há mais eventos para postar, pois as instâncias já foram criadas.

Existe alguma maneira de contornar isso e pegar eventos de lançamento no momento do lançamento da pilha?

    
por Alex B 20.11.2015 / 11:38

3 respostas

4

Não é uma solução ideal, mas uma criação de pilha de duas passagens seria uma solução válida?

  1. Defina a propriedade DesiredCapacity no recurso AutoScalingGroup para 0 na criação da pilha inicial. Isso permite que os recursos LaunchConfiguration , AutoScalingGroup e LifecycleHook sejam criados sem realmente iniciar nenhuma instância.
  2. Defina DesiredCapacity como sua contagem desejada (> 0 ) em uma atualização de pilha subsequente. Isso deve iniciar suas instâncias desejadas depois que o LifecycleHook for criado.
por 06.05.2016 / 20:56
1

Outra solução alternativa é fazer algo semelhante ao que o Will Jordan está propondo, mas que pode fazer parte da mesma atualização do Stack do CloudFormation:

  1. Defina a propriedade DesiredCapacity no recurso AutoScalingGroup como 0 na criação inicial da pilha. Isso permite que os recursos LaunchConfiguration, AutoScalingGroup e LifecycleHook sejam criados sem iniciar nenhuma instância.
  2. Crie um AWS :: AutoScaling :: ScheduledAction dependente do LifecycleHook com os tamanhos desejados e Recorrência definida como: * * * * *

Esses recursos podem fazer parte de um único script do Cloudformation e não há necessidade de executar várias atualizações na pilha.

[Edit]: Infelizmente, esta abordagem leva a instâncias sempre que a expressão cron recorrência é satisfeita. O grupo AutoScaling precisa definir IgnoreUnmodifiedGroupSizeProperties como 'true' em AutoScalingScheduledAction do grupo AutoScaling UpdatePolicy ( link ).

    
por 21.02.2018 / 19:06
0

Não tenho certeza se isso funcionará, mas parece que você pode obter um resultado semelhante usando NotificationConfiguration dentro do recurso ASG.

O NotificationConfiguration pode enviar um aviso para um tópico do SNS que tenha a fila SQS assinada. Obviamente, o ciclo de vida irá progredir além de pending com essa abordagem e não esperar por um complete-lifecycle-action , mas pelo menos todos os lançamentos de instâncias estarão disponíveis na fila.

HTH

editar

Outra opção pode ser usar um WaitCondition ou um CreationPolicy - não tenho certeza se isso seria aplicado antes de os ganchos do ciclo de vida serem processados.

    
por 19.07.2016 / 13:35