Tutorial: Interromper automaticamente EC2 as instâncias da Amazon que não têm as tags obrigatórias - AWS Recursos de marcação e editor de tags

AWS moveu a funcionalidade de gerenciamento de tags do Tag Editor do AWS Resource Groups console para o Explorador de recursos da AWS console. Com o Resource Explorer, você pode pesquisar e filtrar recursos e, em seguida, gerenciar tags de recursos em um único console. Para saber mais sobre o gerenciamento de tags de recursos no Resource Explorer, consulte Gerenciando recursos no guia do usuário do Resource Explorer.

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á.

Tutorial: Interromper automaticamente EC2 as instâncias da Amazon que não têm as tags obrigatórias

À medida que seu pool de AWS recursos e o Contas da AWS que você gerencia cresce, você pode usar tags para facilitar a categorização de seus recursos. As tags são comumente usadas para casos de uso críticos, como alocação de custos e segurança. Para gerenciar AWS recursos de forma eficaz, seus recursos precisam ser marcados de forma consistente. Muitas vezes, quando um recurso é provisionado, ele recebe todas as tags apropriadas. No entanto, um processo posterior pode resultar em uma alteração de tag que resulta em um desvio da política de tag corporativa. Ao monitorar as alterações em suas tags, você pode identificar um desvio de tag e responder imediatamente. Isso lhe dá mais confiança de que os processos que dependem da categorização adequada de seus recursos produzirão os resultados desejados.

O exemplo a seguir demonstra como monitorar as alterações de tags nas EC2 instâncias da Amazon para verificar se uma instância específica continua com as tags necessárias. Se as tags da instância mudarem e a instância não tiver mais as tags necessárias, uma função do Lambda será invocada para desligar a instância automaticamente. Por que você faria isso? Isso garante que todos os recursos sejam marcados de acordo com sua política corporativa de tags, para uma alocação efetiva de custos ou para poder confiar na segurança com base no controle de acesso por atributo (ABAC).

Importante

É altamente recomendável que você execute este tutorial em uma conta que não seja de produção, na qual não seja possível desligar inadvertidamente instâncias importantes.

O código de exemplo neste tutorial limita intencionalmente o impacto desse cenário somente às instâncias em uma lista de instâncias IDs. Você deve atualizar a lista com a instância IDs que deseja encerrar para o teste. Isso ajuda a garantir que você não possa desligar acidentalmente todas as instâncias em uma região do seu Conta da AWS.

Após o teste, verifique se todas as suas instâncias estão marcadas de acordo com a estratégia de marcação da sua empresa. Em seguida, você pode remover o código que limita a função somente à instância IDs na lista.

Este exemplo usa JavaScript e a versão 16.x do Node.js. O exemplo usa o Conta da AWS ID de exemplo 123456789012 e o Leste dos Região da AWS EUA (Norte da Virgínia) (). us-east-1 Substitua essas informações por seu próprio ID e região da conta de teste.

nota

Se seu console usa uma região diferente como padrão, mude a região que você está usando neste tutorial sempre que mudar de console. Uma causa comum da falha desse tutorial é ter a instância e a função em duas regiões diferentes.

Se você usar uma região diferente de us-east-1, altere todas as referências nos exemplos de código a seguir para a região escolhida.

Etapa 1. Criar a função do Lambda

Para criar a função do Lambda
  1. Abra o console de gerenciamento do AWS Lambda.

  2. Selecione Criar função e Criar do zero.

  3. Em Nome da função, insira AutoEC2Termination.

  4. Em Runtime, selecione Node.js 16.x.

  5. Deixe todos os outros campos nos valores padrão e escolha Criar função.

  6. Na guia Código da página de detalhes de AutoEC2Termination, abra o arquivo index.js para visualizar seu código.

    • Se uma guia com index.js abrir, você poderá escolher a caixa de edição nessa guia para editar seu código.

    • Se uma guia com index.js não estiver aberta, clique com o botão direito do mouse no arquivo index.js na pasta Auto EC2 Terminator no painel de navegação. Em seguida, escolha Abrir.

  7. Na guia index.js, cole o código a seguir na caixa do editor, substituindo tudo o que já estiver presente.

    Substitua o valor RegionToMonitor pela região na qual deseja executar essa função.

    // Set the following line to specify which Region's instances you want to monitor // Only instances in this Region are succesfully stopped on a match const RegionToMonitor = "us-east-1" // Specify the instance ARNs to check. // This limits the function for safety to avoid the tutorial shutting down all instances in account // The first ARN is a "dummy" that matches the test event you create in Step 3. // Replace the second ARN with one that matches a real instance that you want to monitor and that you can // safely stop const InstanceList = [ "i-0000000aaaaaaaaaa", "i-05db4466d02744f07" ]; // The tag key name and value that marks a "valid" instance. Instances in the previous list that // do NOT have the following tag key and value are stopped by this function const ValidKeyName = "valid-key"; const ValidKeyValue = "valid-value"; // Load and configure the AWS SDK const AWS = require('aws-sdk'); // Set the AWS Region AWS.config.update({region: RegionToMonitor}); // Create EC2 service object. const ec2 = new AWS.EC2({apiVersion: '2016-11-15'}); exports.handler = (event, context, callback) => { // Retrieve the details of the reported event. var detail = event.detail; var tags = detail["tags"]; var service = detail["service"]; var resourceType = detail["resource-type"]; var resource = event.resources[0]; var resourceSplit = resource.split("/"); var instanceId = resourceSplit[resourceSplit.length - 1]; // If this event is not for an EC2 resource, then do nothing. if (!(service === "ec2")) { console.log("Event not for correct service -- no action (", service, ")" ); return; } // If this event is not about an instance, then do nothing. if (!(resourceType === "instance")) { console.log("Event not for correct resource type -- no action (", resourceType, ")" ); return; } // CAUTION - Removing the following 'if' statement causes the function to run against // every EC2 instance in the specified Region in the calling Conta da AWS. // If you do this and an instance is not tagged with the approved tag key // and value, this function stops that instance. // If this event is not for the ARN of an instance in our include list, then do nothing. if (InstanceList.indexOf(instanceId)<0) { console.log("Event not for one of the monitored instances -- no action (", resource, ")"); return; } console.log("Tags changed on monitored EC2 instance (",instanceId,")"); // Check attached tags for expected tag key and value pair if ( tags.hasOwnProperty(ValidKeyName) && tags[ValidKeyName] == "valid-value"){ // Required tags ARE present console.log("The instance has the required tag key and value -- no action"); callback(null, "no action"); return; } // Required tags NOT present console.log("This instance is missing the required tag key or value -- attempting to stop the instance"); var params = { InstanceIds: [instanceId], DryRun: true }; // call EC2 to stop the selected instances ec2.stopInstances(params, function(err, data) { if (err && err.code === 'DryRunOperation') { // dryrun succeeded, so proceed with "real" stop operation params.DryRun = false; ec2.stopInstances(params, function(err, data) { if (err) { console.log("Failed to stop instance"); callback(err, "fail"); } else if (data) { console.log("Successfully stopped instance", data.StoppingInstances); callback(null, "Success"); } }); } else { console.log("Dryrun attempt failed"); callback(err); } }); };
  8. Escolha Implantar para salvar suas alterações e ativar a nova versão da função.

Essa função Lambda verifica as tags de uma EC2 instância da Amazon, conforme relatado pelo evento de alteração de tag em. EventBridge Neste exemplo, se a instância do evento não tiver a chave de tag necessária valid-key ou se essa tag não tiver o valor valid-value, a função tentará interromper a instância. Você pode alterar essa verificação lógica ou os requisitos de tag para seus próprios casos de uso específicos.

Mantenha a janela do console do Lambda aberta no navegador.

Etapa 2. Configurar as permissões necessárias do IAM

Para que a função possa ser executada com sucesso, você deve conceder à função a permissão para interromper uma EC2 instância. A função AWS fornecida lambda_basic_executionnão tem essa permissão. Neste tutorial, você modifica a política de permissão padrão do IAM que está anexada ao perfil de execução da função chamada AutoEC2Termination-role-uniqueid. A permissão adicional mínima necessária para este tutorial é ec2:StopInstances.

Para obter mais informações sobre a criação de políticas de IAM EC2 específicas da Amazon, consulte Amazon EC2: Permite iniciar ou interromper uma EC2 instância e modificar um grupo de segurança, programaticamente e no console no Guia do usuário do IAM.

Para criar uma política de permissão do IAM e anexá-la ao perfil de execução da função do Lambda
  1. Em outra guia ou janela do navegador, abra a página Perfis do console do IAM.

  2. Comece digitando o nome do perfil AutoEC2Termination e, quando ele aparecer na lista, escolha o nome do perfil.

  3. Na página Resumo do perfil, escolha a guia Permissões e escolha o nome da política que já está anexada.

  4. Na página Resumo da política, escolha Editar política.

  5. Na guia Editor visual, escolha Adicionar mais permissões.

  6. Em Service (Serviço), escolha EC2.

  7. Em Ações, escolha StopInstances. Você pode digitar Stop na barra de pesquisa e escolher StopInstances quando aparecer.

  8. Em Recursos, escolha Todos os recursos, escolha Revisar política e, em seguida, selecione Salvar alterações.

    Isso cria automaticamente uma nova versão da política e define essa versão como padrão.

    Sua política final deve ser semelhante ao exemplo a seguir.

    { "Version": "2012-10-17", "Statement": [ { "Sid": "VisualEditor0", "Effect": "Allow", "Action": "ec2:StopInstances", "Resource": "*" }, { "Sid": "VisualEditor1", "Effect": "Allow", "Action": "logs:CreateLogGroup", "Resource": "arn:aws:logs:us-east-1:123456789012:*" }, { "Sid": "VisualEditor2", "Effect": "Allow", "Action": [ "logs:CreateLogStream", "logs:PutLogEvents" ], "Resource": "arn:aws:logs:us-east-1:123456789012:log-group:/aws/lambda/AutoEC2Termination:*" } ] }

Etapa 3. Fazer um teste preliminar da sua função do Lambda

Nesta etapa, você envia um evento de teste para a sua função. A funcionalidade de teste do Lambda é feita enviando um evento de teste fornecido manualmente. A função processa o evento de teste como se o evento tivesse vindo EventBridge. Você pode definir vários eventos de teste com valores diferentes para exercitar todas as diferentes partes do seu código. Nesta etapa, você envia um evento de teste que indica que as tags de uma EC2 instância da Amazon foram alteradas e que as novas tags não incluem a chave e o valor da tag necessários.

Para testar a função do Lambda
  1. Volte para a janela ou guia com o console Lambda e abra a guia Teste para sua função de EC2terminação automática.

  2. Escolha Criar evento.

  3. Em Nome do evento, insira SampleBadTagChangeEvent.

  4. No Evento JSON, substitua o texto pelo evento de amostra apresentado no texto de exemplo a seguir. Você não precisa modificar as contas, a região ou o ID da instância para que esse evento de teste funcione corretamente.

    { "version": "0", "id": "bddcf1d6-0251-35a1-aab0-adc1fb47c11c", "detail-type": "Tag Change on Resource", "source": "aws.tag", "account": "123456789012", "time": "2018-09-18T20:41:38Z", "region": "us-east-1", "resources": [ "arn:aws:ec2:us-east-1:123456789012:instance/i-0000000aaaaaaaaaa" ], "detail": { "changed-tag-keys": [ "valid-key" ], "tags": { "valid-key": "NOT-valid-value" }, "service": "ec2", "resource-type": "instance", "version": 3 } }
  5. Escolha Salvar e, em seguida, escolha Teste.

    O teste parece falhar, mas tudo bem.

    Você deve ver o seguinte erro na guia Resultados da execução, em Resposta.

    { "errorType": "InvalidInstanceID.NotFound", "errorMessage": "The instance ID 'i-0000000aaaaaaaaaa' does not exist", ... }

    O erro ocorre porque a instância especificada no evento de teste não existe.

    As informações na guia Resultados da execução, na seção Registros de funções, demonstram que sua função Lambda tentou interromper EC2 uma instância com sucesso. No entanto, falhou porque o código inicialmente tentou uma operação DryRun para interromper a instância, o que indicava que o ID da instância não era válido.

    START RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44 Version: $LATEST 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-11-30T20:17:30.427Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T20:17:31.206Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 INFO Dryrun attempt failed 2022-11-30T20:17:31.207Z 390c1f8d-0d9b-4b44-b087-8de64479ab44 ERROR Invoke Error {"errorType":"InvalidInstanceID.NotFound","errorMessage":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","code":"InvalidInstanceID.NotFound","message":"The instance ID 'i-0000000aaaaaaaaaa' does not exist","time":"2022-11-30T20:17:31.205Z","requestId":"a5192c3b-142d-4cec-bdbc-685a9b7c7abf","statusCode":400,"retryable":false,"retryDelay":36.87870631147607,"stack":["InvalidInstanceID.NotFound: The instance ID 'i-0000000aaaaaaaaaa' does not exist"," at Request.extractError (/var/runtime/node_modules/aws-sdk/lib/services/ec2.js:50:35)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:106:20)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:78:10)"," at Request.emit (/var/runtime/node_modules/aws-sdk/lib/request.js:686:14)"," at Request.transition (/var/runtime/node_modules/aws-sdk/lib/request.js:22:10)"," at AcceptorStateMachine.runTo (/var/runtime/node_modules/aws-sdk/lib/state_machine.js:14:12)"," at /var/runtime/node_modules/aws-sdk/lib/state_machine.js:26:10"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:38:9)"," at Request.<anonymous> (/var/runtime/node_modules/aws-sdk/lib/request.js:688:12)"," at Request.callListeners (/var/runtime/node_modules/aws-sdk/lib/sequential_executor.js:116:18)"]} END RequestId: 390c1f8d-0d9b-4b44-b087-8de64479ab44
  6. Para provar que o código não tenta interromper a instância quando a tag correta é usada, você pode criar e enviar outro evento de teste.

    Escolha a guia Teste acima da Origem do código. O console exibe seu evento SampleBadTagChangeEventde teste existente.

  7. Escolha Criar evento.

  8. Em Nome do evento, digite SampleGoodTagChangeEvent.

  9. Na linha 17, exclua NOT- para alterar o valor para valid-value.

  10. Na parte superior da janela Evento de teste, escolha Salvar e, em seguida, escolha Teste.

    A saída exibe o seguinte, o que demonstra que a função reconhece a tag válida e não tenta desligar a instância.

    START RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4 Version: $LATEST 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO Tags changed on monitored EC2 instance ( i-0000000aaaaaaaaaa ) 2022-12-01T23:24:12.244Z 53631a49-2b54-42fe-bf61-85b9e91e86c4 INFO The instance has the required tag key and value -- no action END RequestId: 53631a49-2b54-42fe-bf61-85b9e91e86c4

    Mantenha o console do Lambda aberto em seu navegador.

Etapa 4. Crie a EventBridge regra que inicia a função

Agora você pode criar uma EventBridge regra que corresponda ao evento e aponte para sua função Lambda.

Para criar a EventBridge regra
  1. Em outra guia ou janela do navegador, abra o EventBridge console na página Criar regra.

  2. Em Nome, digite ec2-instance-rule e escolha Próximo.

  3. Role para baixo até Método de criação e escolha Padrão personalizado (editor JSON).

  4. Na caixa de edição, cole o texto padrão a seguir e escolha Próximo.

    { "source": [ "aws.tag" ], "detail-type": [ "Tag Change on Resource" ], "detail": { "service": [ "ec2" ], "resource-type": [ "instance" ] } }

    Essa regra combina Tag Change on Resource eventos para EC2 instâncias da Amazon e invoca tudo o que você especificar como alvo na próxima etapa.

  5. Em seguida, adicione a função do Lambda como destino. Na caixa Alvo 1, em Selecionar um destino, escolha Função do Lambda.

  6. Em Função, escolha a função de EC2encerramento automático que você criou anteriormente e, em seguida, escolha Avançar.

  7. Na página Configurar tags, escolha Próximo. Na página Revisar e criar, escolha Criar regra. Isso também concede automaticamente permissão para EventBridge invocar a função Lambda especificada.

Etapa 5. Testar a solução completa

Você pode testar seu resultado final criando uma EC2 instância e observando o que acontece quando você altera suas tags.

Para testar a solução de monitoramento com uma instância real
  1. Abra o EC2console da Amazon na página Instâncias.

  2. Crie uma EC2 instância da Amazon. Antes de iniciá-la, anexe uma tag com a chave valid-key e o valor valid-value. Para obter informações sobre como criar e iniciar uma instância, consulte Etapa 1: Executar uma instância no Guia EC2 do usuário da Amazon. No procedimento Para iniciar uma instância, na etapa 3, em que você insere a tag Nome, escolha também Adicionar tags adicionais, escolha Adicionar tag e, em seguida, insira a Chave de valid-key e o Valor de valid-value. Você pode continuar sem um par de chaves se essa instância for exclusivamente para os propósitos deste tutorial e você planeja excluí-la depois de finalizado. Retorne a este tutorial quando chegar ao final da Etapa 1; você não precisa fazer a Etapa 2: Conectar-se à sua instância.

  3. Copie o InstanceIddo console.

  4. Mude do EC2 console da Amazon para o console Lambda. Escolha sua função de EC2terminação automática, escolha a guia Código e, em seguida, escolha a guia index.js para editar seu código.

  5. Altere a segunda entrada no InstanceList colando o valor que você copiou do console da Amazon EC2 . Verifique se o valor de RegionToMonitor corresponde à região que contém a instância que você colou.

  6. Escolha Implantar para tornar suas alterações ativas. A função agora está pronta para ser ativada por meio de alterações de tag nessa instância na região especificada.

  7. Mude do console Lambda para o console da Amazon EC2 .

  8. Altere as tags anexadas à instância excluindo a tag de chave válida ou alterando o valor dessa chave.

    nota

    Para obter informações sobre como alterar as tags em uma EC2 instância da Amazon em execução, consulte Adicionar e excluir tags em um recurso individual no Guia EC2 do usuário da Amazon.

  9. Aguarde alguns segundos e, em seguida, atualize o console. A instância deve mudar seu estado de instância para Interrompendo e depois para Interrompida.

  10. Mude do EC2 console da Amazon para o console Lambda com sua função e escolha a guia Monitor.

  11. Escolha a guia Registros e, na tabela Invocações recentes, escolha a entrada mais recente na LogStreamcoluna.

    O CloudWatch console da Amazon abre a página Registrar eventos para a última invocação da sua função Lambda. A última entrada deve ser semelhante ao exemplo a seguir.

    2022-11-30T12:03:57.544-08:00 START RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac Version: $LATEST 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Tags changed on monitored EC2 instance ( arn:aws:ec2:us-west-2:123456789012:instance/i-1234567890abcdef0 ) 2022-11-30T12:03:57.548-08:00 2022-11-30T20:03:57.548Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO This instance is missing the required tag key or value -- attempting to stop the instance 2022-11-30T12:03:58.488-08:00 2022-11-30T20:03:58.488Z b5befd18-2c41-43c8-a320-3a4b2317cdac INFO Successfully stopped instance [ { CurrentState: { Code: 64, Name: 'stopping' }, InstanceId: 'i-1234567890abcdef0', PreviousState: { Code: 16, Name: 'running' } } ] 2022-11-30T12:03:58.546-08:00 END RequestId: b5befd18-2c41-43c8-a320-3a4b2317cdac

Resumo do Tutorial

Este tutorial demonstrou como criar uma EventBridge regra para comparar com uma alteração de tag em um evento de recurso para EC2 instâncias da Amazon. A regra apontava para uma função do Lambda que desliga automaticamente a instância se ela não tiver a tag necessária.

O EventBridge suporte da Amazon para alterações de tags em AWS recursos abre possibilidades para criar automação orientada por eventos em muitos. Serviços da AWS A combinação desse recurso AWS Lambda fornece ferramentas para criar soluções sem servidor que acessam AWS recursos com segurança, escalam sob demanda e são econômicas.

Outros casos de uso possíveis para o tag-change-on-resource EventBridge evento incluem:

  • Lançar um aviso se alguém acessar seu recurso a partir de um endereço IP incomum: use uma tag para armazenar o endereço IP de origem de cada visitante que acessa o seu recurso. Alterações na tag geram um CloudWatch evento. Você pode usar esse evento para comparar o endereço IP de origem com uma lista de endereços IP válidos e ativar um e-mail de aviso se o endereço IP de origem não for válido.

  • Monitore se há alterações no controle de acesso baseado em tags de um recurso — Se você configurou o acesso a um recurso usando o controle de acesso baseado em atributos (tag) (ABAC), você pode usar EventBridge eventos gerados por qualquer alteração na tag para solicitar uma auditoria por sua equipe de segurança.