Criar uma política de término personalizada com o Lambda - Amazon EC2 Auto Scaling

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Criar uma política de término personalizada com o Lambda

O Amazon EC2 Auto Scaling usa políticas de encerramento para priorizar quais instâncias serão encerradas primeiro ao diminuir o tamanho do seu grupo de Auto Scaling (chamado de escalabilidade). O grupo do Auto Scaling usa uma política de término padrão, mas você pode, opcionalmente, escolher ou criar suas próprias políticas de término. Para obter mais informações sobre como escolher uma política de término predefinida, consulte Configurar políticas de rescisão para o Amazon EC2 Auto Scaling.

Neste tópico, você aprende a criar uma política de rescisão personalizada usando uma AWS Lambda função que o Amazon EC2 Auto Scaling invoca em resposta a determinados eventos. A função Lambda que você cria processa as informações nos dados de entrada enviados pelo Amazon Auto EC2 Scaling e retorna uma lista de instâncias que estão prontas para serem encerradas.

Uma política de término personalizada fornece melhor controle sobre quais instâncias são terminadas e quando. Por exemplo, quando seu grupo de Auto Scaling se expande, o Amazon Auto EC2 Scaling não pode determinar se há cargas de trabalho em execução que não devem ser interrompidas. Com uma função Lambda, você pode validar a solicitação de encerramento e esperar até que a carga de trabalho seja concluída antes de devolver o ID da instância ao Amazon Auto Scaling EC2 para encerramento.

Dados de entrada

O Amazon EC2 Auto Scaling gera uma JSON carga útil para escalar eventos e também faz isso quando as instâncias estão prestes a ser encerradas como resultado da vida útil máxima da instância ou dos recursos de atualização da instância. Ele também gera uma JSON carga útil para a escala de eventos que pode iniciar ao reequilibrar seu grupo nas zonas de disponibilidade.

Essa carga contém informações sobre a capacidade que o Amazon EC2 Auto Scaling precisa encerrar, uma lista de instâncias que ele sugere para rescisão e o evento que iniciou a rescisão.

Esta é uma carga útil de exemplo:

{ "AutoScalingGroupARN": "arn:aws:autoscaling:us-east-1:<account-id>:autoScalingGroup:d4738357-2d40-4038-ae7e-b00ae0227003:autoScalingGroupName/my-asg", "AutoScalingGroupName": "my-asg", "CapacityToTerminate": [ { "AvailabilityZone": "us-east-1b", "Capacity": 2, "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1b", "Capacity": 1, "InstanceMarketOption": "spot" }, { "AvailabilityZone": "us-east-1c", "Capacity": 3, "InstanceMarketOption": "on-demand" } ], "Instances": [ { "AvailabilityZone": "us-east-1b", "InstanceId": "i-0056faf8da3e1f75d", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-02e1c69383a3ed501", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, { "AvailabilityZone": "us-east-1c", "InstanceId": "i-036bc44b6092c01c7", "InstanceType": "t2.nano", "InstanceMarketOption": "on-demand" }, ... ], "Cause": "SCALE_IN" }

A carga inclui o nome do grupo Auto Scaling, seu Amazon Resource Name ARN () e os seguintes elementos:

  • CapacityToTerminate descreve o quanto da sua capacidade spot ou sob demanda está definida para ser terminada em uma determinada zona de disponibilidade.

  • Instancesrepresenta as instâncias que o Amazon EC2 Auto Scaling sugere para rescisão com base nas informações contidas. CapacityToTerminate

  • Cause descreve o evento que acionou o término SCALE_IN, INSTANCE_REFRESH, MAX_INSTANCE_LIFETIME ou REBALANCE.

As informações a seguir descrevem os fatores mais significativos na forma como o Amazon EC2 Auto Scaling gera Instances os dados de entrada:

  • A manutenção do equilíbrio entre as zonas de disponibilidade tem precedência quando uma instância está sendo encerrada devido à escala de eventos e encerramentos baseados em atualização de instâncias. Dessa forma, se uma zona de disponibilidade tiver mais instâncias que as outras que são usadas pelo grupo, os dados de entrada contêm instâncias qualificáveis para término somente a partir da zona de disponibilidade desbalanceada. Se as zonas de disponibilidade usadas pelo grupo forem balanceadas, os dados de entrada conterão instâncias de todas as zonas de disponibilidade do grupo.

  • Ao usar uma política de instâncias mistas, a manutenção das suas capacidades spot e sob demanda em equilíbrio com base nos percentuais desejados para cada opção de compra também tem precedência. Primeiro, identificamos qual dos dois tipos (spot ou sob demanda) deve ser terminado. Em seguida, identificamos quais instâncias (dentro da opção de compra identificada) em que zonas de disponibilidade serão terminadas que resultarão no maior equilíbrio das zonas de disponibilidade.

Dados de resposta

Os dados de entrada e os dados de resposta trabalham juntos para restringir a lista de instâncias a serem terminadas.

Com a entrada dada, a resposta de sua função do Lambda deve se parecer com o exemplo a seguir:

{ "InstanceIDs": [ "i-02e1c69383a3ed501", "i-036bc44b6092c01c7", ... ] }

Os InstanceIDs na resposta representam as instâncias que estão prontas para sere terminadas.

Como alternativa, você pode devolver um conjunto diferente de instâncias que estão prontas para serem terminadas, o que substitui as instâncias nos dados de entrada. Se nenhuma instância estiver pronta para ser terminada quando sua função do Lambda for chamada, você também pode optar por não devolver nenhuma instância.

Quando não houver nenhuma instância pronta para encerramento, a resposta de sua função do Lambda deverá se parecer com o exemplo a seguir:

{ "InstanceIDs": [ ] }

Considerações

Observe as seguintes considerações ao usar uma política de término personalizada:

  • Devolver uma instância primeiro nos dados de resposta não garante seu término. Se mais do que o número necessário de instâncias for retornado quando sua função Lambda for invocada, o Amazon EC2 Auto Scaling avaliará cada instância em relação às outras políticas de encerramento que você especificou para seu grupo de Auto Scaling. Quando há várias diretivas de término, ele tenta aplicar a próxima diretiva de término na lista e, se houver mais instâncias do que as necessárias para término, ele passa para a próxima diretiva de término, e assim por diante. Se nenhuma outra política de término for especificada, a política de término padrão será usada para determinar quais instâncias serão terminadas.

  • Se nenhuma instância for retornada ou sua função Lambda expirar, o Amazon Auto EC2 Scaling aguardará um pouco antes de invocar sua função novamente. Para qualquer balança, ela continua tentando, desde que a capacidade desejada do grupo seja menor que a capacidade atual. Por exemplo, términos baseados em atualização, ele continua tentando por uma hora. Depois disso, se continuar a falhar ao terminar quaisquer instâncias, a operação de atualização da instância falhará. Com a vida útil máxima da instância, o Amazon EC2 Auto Scaling continua tentando encerrar a instância identificada como excedendo sua vida útil máxima.

  • Como sua função é repetida continuamente, certifique-se de testar e corrigir quaisquer erros permanentes em seu código antes de usar uma função do Lambda como uma política de término personalizada.

  • Se você substituir os dados de entrada por sua própria lista de instâncias a serem encerradas e o encerramento dessas instâncias desequilibrar as zonas de disponibilidade, o Amazon EC2 Auto Scaling gradualmente reequilibrará a distribuição da capacidade entre as zonas de disponibilidade. Primeiro, ele invoca sua função do Lambda para ver se existem instâncias que estão prontas para serem terminadas para que ele possa determinar se deseja iniciar o rebalanceamento. Se houver instâncias prontas para serem terminadas, ele iniciará novas instâncias primeiro. Quando as instâncias terminam de ser iniciadas, ela detecta que a capacidade atual do seu grupo é maior do que a capacidade desejada e inicia uma escalabilidade no evento.

  • Uma política de rescisão personalizada não afeta sua capacidade de também usar a escala na proteção para evitar que determinadas instâncias sejam encerradas. Para obter mais informações, consulte Use a proteção de escalabilidade da instância para controlar o encerramento da instância.

Criar a função do Lambda

Comece criando a função Lambda, para que você possa especificar seu Amazon Resource Name (ARN) nas políticas de encerramento do seu grupo de Auto Scaling.

Para criar uma função do Lambda (console)
  1. Abra a página Functions (Funções) no console do Lambda.

  2. Na barra de navegação na parte superior da tela, escolha a mesma região usada ao criar o grupo do Auto Scaling.

  3. Escolha Create function (Criar função) e Author from scratch (Criar desde o início).

  4. Em Basic information (Informações básicas), para Function name (Nome da função), insira um nome para a função.

  5. Escolha a opção Criar função. Você é retornado ao código e configuração da função.

  6. Com sua função ainda aberta no console, em Function code (Código da função), cole seu código no editor.

  7. Escolha Implantar.

  8. Opcionalmente, crie uma versão publicada da função do Lambda escolhendo a guia Versions (Versões), e depois, Publish new version (Publicar nova versão). Para saber mais sobre controle de versões no Lambda, consulte Versões de função do Lambda no Guia do desenvolvedor do AWS Lambda .

  9. Se você optou por publicar uma versão, escolha a guia Aliases caso deseje associar um alias a essa versão da função do Lambda. Para saber mais sobre aliases no Lambda, consulte Aliases de função do Lambda no Guia do desenvolvedor do AWS Lambda .

  10. Em seguida, escolha a guia Configuration (Configuração) e, depois, Permissions (Permissões).

  11. Role para baixo até Resource-based policy (Política baseada em recurso) e, em seguida, escolha Add permissions (Adicionar permissões). Uma política baseada em recurso é usada para conceder permissões para invocar sua função no principal que é especificado na política. Nesse caso, o principal será a função vinculada ao serviço Amazon EC2 Auto Scaling associada ao grupo Auto Scaling.

  12. Na seção Policy statement (Declaração da política), configure suas permissões:

    1. Selecione Conta da AWS.

    2. Em Principal, insira a ARN função vinculada ao serviço de chamada, por exemplo,. arn:aws:iam::<aws-account-id>:role/aws-service-role/autoscaling.amazonaws.com/AWSServiceRoleForAutoScaling

    3. Para Ação, escolha lambda: InvokeFunction.

    4. Em Statement ID (ID da instrução), insira um ID de instrução exclusivo, como AllowInvokeByAutoScaling.

    5. Escolha Salvar.

  13. Depois de seguir essas instruções, continue especificando sua função nas políticas ARN de rescisão do seu grupo de Auto Scaling como próxima etapa. Para obter mais informações, consulte Alterar a política de rescisão de um grupo do Auto Scaling.

nota

Para exemplos que você pode usar como referência para desenvolver sua função Lambda, consulte o GitHub repositório do Amazon Auto EC2 Scaling.

Limitações

  • Você só pode especificar uma função do Lambda nas políticas de término para um grupo do Auto Scaling. Se houver várias políticas de término especificadas, a função do Lambda deve ser especificada primeiro.

  • Você pode referenciar sua função Lambda usando uma não qualificada ARN (sem sufixo) ou uma qualificada ARN que tenha uma versão ou um alias como sufixo. Se um não qualificado ARN for usado (por exemplo,function:my-function), sua política baseada em recursos deverá ser criada na versão não publicada de sua função. Se um qualificado ARN for usado (por exemplo, function:my-function:1 oufunction:my-function:prod), sua política baseada em recursos deverá ser criada nessa versão específica publicada de sua função.

  • Você não pode usar um qualificado ARN com o $LATEST sufixo. Se você tentar adicionar uma política de rescisão personalizada que se refira a um qualificado ARN com o $LATEST sufixo, isso resultará em um erro.

  • O número de instâncias fornecidas nos dados de entrada é limitado a 30.000 instâncias. Se houver mais de 30.000 instâncias que possam ser terminadas, os dados de entrada incluirão "HasMoreInstances": true para indicar que o número máximo de instâncias é devolvido.

  • O tempo máximo de execução para sua função do Lambda é de dois segundos (2000 milissegundos). Como prática recomendada, você deve definir o valor de tempo-limite da função do Lambda com base no tempo de execução esperado. As funções do Lambda têm um tempo limite padrão de três segundos, mas isso pode ser reduzido.

  • Se o tempo de execução exceder o limite de 2 segundos, qualquer escala em ação ficará suspensa até que o tempo de execução fique abaixo desse limite. Para funções do Lambda com tempos de execução consistentemente mais longos, encontre uma maneira de reduzir o tempo de execução, como armazenar em cache os resultados onde eles possam ser recuperados durante as invocações subsequentes do Lambda.