Cloud Intelligence™Cloud Intelligence™

Cloud Intelligence™

Tagging automático de instâncias e volumes EC2 da AWS

By Avi KeinanMar 17, 20214 min read

Esta página também está disponível em English, Deutsch, Español, Français, Italiano e 日本語.

Aloque os gastos da AWS aplicando tags automaticamente nos seus workloads EC2

Instâncias "Fulano de Tal"

Ao revisar o uso do EC2 na sua AWS, você pode se deparar com instâncias ou volumes sem nome ou, pior ainda, com um nome que não diz nada. Esses recursos podem ser puro desperdício de dinheiro ou estar sustentando workloads críticos de produção.

Instância m3.2xlarge "NÃO APAGAR" em us-east-1 custando US$ 388/mês

Pode ser que essas instâncias tenham vários anos de existência e que ninguém na empresa tenha informações sobre elas nem as credenciais para acessá-las.

Para evitar esse problema, as empresas adotam políticas de tagging em que toda instância provisionada precisa ter uma tag de Name/Owner/Project/etc.

Não há custo adicional para aplicar tags em instâncias e volumes EC2…

…porém, como pessoas sobem instâncias manualmente e também escrevem scripts de automação para isso, esse processo é suscetível a erros.

Para evitar esses casos, escrevi uma solução para a AWS (e uma parecida para o Google Cloud) que aplica automaticamente a tag Owner nas instâncias e as tags Owner e AttachedInstance nos volumes.

Assim, no futuro, quando alguém esbarrar em uma instância ou volume sem saber para que serve, essas tags vão facilitar a identificação de quem fez a configuração.

**Como funciona o auto-tagging?**

  1. O usuário cria uma instância EC2 na AWS.
  2. O AWS CloudTrail rastreia as chamadas de API e aciona o AWS EventBridge.
  3. O AWS EventBridge dispara a função Lambda.
  4. O AWS Lambda aplica as tags na instância e nos seus volumes.

Assim que a função AWS Lambda é disparada com as informações de criação da instância, ela aplica a tag Owner na instância, e essa tag conterá um dos seguintes valores:

  1. Usuário IAM
  2. Assume Role (por exemplo, AutoScaling Role, usuário SSO etc.)
  3. Usuário Root

Página de instâncias, tag na parte de baixo

Na etapa seguinte, o Lambda aplica as tags 'Owner' e 'AttachedInstance' em todos os volumes da instância. A tag 'Owner' terá as mesmas informações da tag 'Owner' da instância, e a tag 'AttachedInstance' conterá o instance-id e o nome da instância, caso ela tenha um.

Página de volumes, tags na parte de baixo

Como implementar:

  1. Acesse a página do CloudTrail e clique em "Create trail".

2. Dê um nome ao trail.

3. Role a página para baixo e defina um nome para o bucket S3 do CloudTrail. Em seguida, clique em Create.

4. Vá até o dashboard do Lambda e clique em "Create function".

5. Dê um nome à função, selecione "Python 3.8" no dropdown Runtime e clique em "Create Function".

6. Cole o código do repositório no Github e clique em "Save".

7. Role até a caixa "Basic settings" e clique no botão Edit.

Em seguida, aumente o timeout da função Lambda para 1 minuto.

Depois, clique no botão Save.

8. Volte para o topo e clique em Permissions. Em seguida, clique no nome da Role.

9. Clique no botão "Add inline policy".

10. Clique no botão JSON, cole a política IAM a seguir e clique em Review policy.

{
    "Version": "2012-10-17",
    "Statement": [\
        {\
            "Sid": "VisualEditor0",\
            "Effect": "Allow",\
            "Action": "ec2:CreateTags",\
            "Resource": [\
                "arn:aws:ec2:*:*:instance/*",\
                "arn:aws:ec2:*:*:volume/*"\
            ]\
        },\
        {\
            "Sid": "VisualEditor1",\
            "Effect": "Allow",\
            "Action": [\
                "ec2:DescribeInstances",\
                "ec2:DescribeVolumes"\
            ],\
            "Resource": "*"\
        }\
    ]
}

Essa política permite que a função Lambda descubra os volumes da instância e aplique tags tanto na instância quanto nos volumes.

11. Dê um nome à política e clique em Create policy.

12. Volte para a aba do Lambda no navegador e clique em "Add trigger".

13. Clique em "Select a trigger", busque por EventBridge e, em seguida, clique em "Create a new rule" no dropdown Rule.

Dê um nome e uma descrição à sua regra.

Em "Rule type", marque o radio button Event pattern.

No primeiro dropdown, escolha EC2, e no segundo, selecione AWS API call via CloudTrail.

14. Role para baixo, marque o checkbox Operation e, em Operation, digite RunInstances. Depois, clique no botão Add para criar o event trigger.

15. Por fim, faça o deploy de uma nova instância de teste para verificar se está tudo funcionando.

Em alguns segundos, a função Lambda que implementamos vai aplicar as tags automaticamente na instância e no(s) volume(s).

Atualize a página e confira as tags da instância.

Observações:

  1. Esta solução aplica tags apenas nas instâncias criadas depois que você instalar a função Lambda.
  2. Se você acabou de ativar o trail do CloudTrail, pode levar até uma hora para o EventBridge começar a invocar a função.
  3. O tamanho da resposta do CloudTrail é limitado a 500Kb. Se você subir um grande número de instâncias em uma única chamada de API, a função Lambda não vai conseguir aplicar tags em todas elas.
  4. O AWS EventBridge é um recurso regional. Se você trabalha com várias regiões, será preciso fazer o deploy da solução em cada região da AWS.