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 término para priorizar quais instâncias serão terminadas primeiro ao diminuir o tamanho do seu grupo do Auto Scaling (referido como redução de escala na horizontal). 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ê aprenderá como criar uma política de término personalizada usando uma função do AWS Lambda que o Amazon EC2 Auto Scaling chama em resposta a determinados eventos. A função do Lambda que você cria processa as informações nos dados de entrada enviados pelo Amazon EC2 Auto Scaling e devolve uma lista de instâncias que estão prontas para término.

Uma política de término personalizada fornece melhor controle sobre quais instâncias são terminadas e quando. Por exemplo, quando seu grupo do Auto Scaling sofre redução de escala na horizontal, o Amazon EC2 Auto Scaling não pode determinar se há workloads em execução que não devem ser interrompidas. Com uma função do Lambda, você pode validar a solicitação de término e aguardar até que a workload seja concluída antes de retornar o ID da instância ao Amazon EC2 Auto Scaling para término.

Dados de entrada

O Amazon EC2 Auto Scaling gera uma carga JSON 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 carga JSON para a escala de eventos que ele 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 terminar, uma lista de instâncias sugeridas para término e o evento que iniciou o término.

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 útil inclui o nome do grupo do Auto Scaling, seu nome do recurso da Amazon (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.

  • Instances representa as instâncias que o Amazon EC2 Auto Scaling sugere para término com base nas informações em 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 em como o Amazon EC2 Auto Scaling gera as Instances nos dados de entrada:

  • A manutenção do equilíbrio entre as zonas de disponibilidade tem precedência quando uma instância é 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 devolvido quando sua função do Lambda for chamada, o Amazon EC2 Auto Scaling avaliará cada instância em relação às outras políticas de término especificadas para seu grupo do 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 devolvida ou se sua função do Lambda expirar, o Amazon EC2 Auto Scaling aguardará um curto período de tempo antes de chamar 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 duração máxima da instância, o Amazon EC2 Auto Scaling continua tentando terminar 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 com sua própria lista de instâncias a serem terminadas, e o término dessas instâncias deixar as zonas de disponibilidade fora de equilíbrio, o Amazon EC2 Auto Scaling reequilibrará gradualmente a distribuição de capacidade entre 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 escala 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 ter 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 do Lambda, para que você possa especificar seu nome do recurso da Amazon (ARN) nas políticas de término do seu grupo do 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. Neste caso, o principal será a função vinculada ao serviço do Amazon EC2 Auto Scaling que está associada ao grupo do 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 o ARN da função vinculada a 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 que você tiver seguido essas instruções, prossiga para especificar o ARN de sua função nas políticas de término do grupo do Auto Scaling como próxima etapa. Para ter 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 EC2 Auto 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 do Lambda usando um ARN não qualificado (sem um sufixo) ou um ARN qualificado que tenha uma versão ou um alias como sufixo. Se um ARN não qualificado for usado (por exemplo, function:my-function), sua política baseada em recurso deve ser criada na versão não publicada da sua função. Se um ARN qualificado for usado (por exemplo, function:my-function:1 ou function:my-function:prod), sua política baseada em recurso deve ser criada na versão publicada específica da sua função.

  • Você não pode usar um ARN qualificado com o sufixo $LATEST. Se você tentar adicionar uma política de término personalizada que se refira a um ARN qualificado com o sufixo $LATEST, 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.