Automatização de tags de Instâncias EC2 para Gerenciamento Eficiente

finops day
5 min readOct 25, 2023

--

No artigo anterior, vimos como automatizar o stop/start de instâncias EC2 usando uma função Lambda. Neste artigo, vamos aprofundar um pouco mais no assunto e ver como implementar um script que faz o tageamento automático da tag stop_start que reconhece as instâncias aptas ao processo.

Para um entendimento mais detalhado e informações adicionais sobre o desligamento automático de instâncias EC2, você pode consultar este artigo.

Na gestão de recursos na AWS, o controle e monitoramento de instâncias EC2 é fundamental para otimizar custos e operações. Uma das abordagens mais eficazes para esse controle é o uso de tags ou etiquetas. Neste artigo, exploraremos como automatizar o processo de etiquetamento dessas instâncias, garantindo assim que elas sejam gerenciadas de maneira eficaz e de acordo com as necessidades da organização.

Entendendo a Tag stop_start: A tag stop_start serve como uma etiqueta personalizada, permitindo a identificação de instâncias EC2 que estão aptas a serem desligadas. Para que esta etiqueta seja eficaz, ela deve possuir a chave stop_start e o valor associado true.

Para um entendimento mais detalhado e informações adicionais sobre o desligamento automático de instâncias EC2, você pode consultar este artigo.

Agora, vamos nos aprofundar em como podemos implementar essa automatização e as etapas detalhadas envolvidas no processo.

O que é a tag stop_start?

A tag stop_start é uma tag personalizada que pode ser usada para identificar instâncias EC2 que podem ser desligadas. A tag deve ter a chave stop_start e o valor true.

Como implementar o tageamento automático?

Para implementar o tageamento automático, podemos usar a seguinte função Lambda:

Obs: A lambda de tagamento funciona com a mesma lógica da que fizemos para stop/start inclusive usando as mesmas tags.

import boto3
def lambda_handler(event, context):
# Lista das contas alvo
target_accounts = [' AccountID', 'AccountID']
# Obtém a conta em execução
current_account = boto3.client('sts').get_caller_identity().get('Account')
# Define o cliente EC2
ec2 = boto3.client('ec2')
# Define as tags a serem criadas
tags = [
{
'Key': 'ec2-stop-start',
'Value': 'true',
},
]
instances_affected = [] # Lista para armazenar as instâncias afetadas
for target_account in target_accounts:
# Assume o papel na conta de destino
role_to_assume_arn = f"arn:aws:iam::{target_account}:role/roleStartStop"
sts_client = boto3.client('sts')
assumed_role = sts_client.assume_role(RoleArn=role_to_assume_arn, RoleSessionName="AssumeRoleSession")
# Cria uma nova sessão usando as credenciais temporárias do papel assumido
assumed_session = boto3.Session(
aws_access_key_id=assumed_role['Credentials']['AccessKeyId'],
aws_secret_access_key=assumed_role['Credentials']['SecretAccessKey'],
aws_session_token=assumed_role['Credentials']['SessionToken']
)
# Use a sessão assumida para interagir com recursos na conta de destino
ec2_assumed = assumed_session.client('ec2')
# Obtém todas as instâncias EC2 na conta de destino
instances = ec2_assumed.describe_instances()
# Itera sobre todas as instâncias na conta de destino e cria as tags
for instance in instances['Reservations']:
for reservation in instance['Instances']:
instance_id = reservation['InstanceId']
state = reservation['State']['Name'] # Obtém o estado da instância
if state in ('running', 'stopped', 'pending'):
# Verifica se a instância possui a tag 'ec2-stop-start'
has_tag = any(tag['Key'] == 'ec2-stop-start' and tag['Value'] == 'true' for tag in reservation['Tags'])
if not has_tag:
# Cria a tag 'ec2-stop-start' apenas se a instância não a tiver
ec2_assumed.create_tags(Resources=[instance_id], Tags=tags)
instances_affected.append((target_account, instance_id))
# Imprime a lista de instâncias afetadas após o loop
for account, instance in instances_affected:
print(f"Conta {account}, incluindo tag na instancia {instance} com o valor: ec2-stop-start")
# Imprime a mensagem se nenhuma instância for encontrada
if not instances_affected:
print('Não há instâncias para tagear.')

1. A função começa definindo uma lista de contas alvo (`target_accounts`) e obtendo a conta em execução (`current_account`).

2. Em seguida, a função cria um cliente EC2 para cada conta alvo.

3. Para cada conta alvo, a função assume o papel `roleStartStop` na conta de destino. Isso permite que a função interaja com recursos na conta de destino usando as credenciais temporárias do papel assumido.

4. Uma vez que a função assumiu o papel, ela obtém todas as instâncias EC2 na conta de destino e itera sobre elas.

5. Para cada instância, a função verifica se a instância possui a tag `ec2-stop-start`. Se a instância não tiver a tag, a função cria a tag.

6. Após a função iterar sobre todas as instâncias na conta de destino, ela imprime a lista de instâncias afetadas no console.

Aqui está uma descrição mais detalhada de cada etapa da função Lambda:

Etapa 1: Definir a lista de contas alvo e obter a conta em execução

A lista de contas alvo é definida como uma lista de strings. Cada string na lista é o ID da conta AWS de uma conta alvo. A conta em execução é obtida usando o cliente STS.

Etapa 2: Criar um cliente EC2 para cada conta alvo

Um cliente EC2 é criado para cada conta alvo usando o SDK Boto3. Isso permite que a função interaja com o serviço EC2 na conta de destino.

Etapa 3: Assumir o papel `roleStartStop` na conta de destino

Para assumir o papel `roleStartStop` na conta de destino, a função usa o cliente STS. Isso permite que a função interaja com recursos na conta de destino usando as credenciais temporárias do papel assumido.

Etapa 4: Obter todas as instâncias EC2 na conta de destino e iterar sobre elas

Para obter todas as instâncias EC2 na conta de destino, a função usa o cliente EC2. Uma vez que a função tenha obtido todas as instâncias, ela itera sobre elas usando um loop `for`.

Etapa 5: Verificar se a instância possui a tag `ec2-stop-start`

Para verificar se a instância possui a tag `ec2-stop-start`, a função usa a função `any()` para verificar se existe alguma tag com a chave `ec2-stop-start` e o valor `true`.

Etapa 6: Criar a tag `ec2-stop-start` se a instância não a tiver

Para criar a tag `ec2-stop-start`, a função usa o cliente EC2 para chamar o método `create_tags()`. Este método cria as tags especificadas nos recursos especificados.

Etapa 7: Imprimir a lista de instâncias afetadas no console

Após a função iterar sobre todas as instâncias na conta de destino, ela imprime a lista de instâncias afetadas no console. Isso é feito usando um loop `for` para iterar sobre a lista de instâncias afetadas e imprimir o ID da conta e o ID da instância para cada instância afetada.

Usos da função Lambda

Esta função Lambda pode ser usada para criar a tag `ec2-stop-start` em todas as instâncias EC2 em uma lista de contas alvo especificada. Isso pode ser útil para automatizar o processo de criação da tag. Por exemplo, você pode usar esta função Lambda para criar a tag em todas as instâncias EC2 em um ambiente de desenvolvimento antes de iniciar um processo de implantação. Você também pode usar esta função Lambda para criar a tag em todas as instâncias EC2 em um ambiente de produção antes de iniciar um processo de manutenção.

--

--