← Todas as publicações

Publicação Técnica · Amazon Web Services

Automatizando a Limpeza de Recursos AWS com Terraform e Python

Com o crescimento exponencial da computação em nuvem, a AWS (Amazon Web Services) se tornou uma das plataformas mais populares para…

4 min de leitura924 palavrasImagens: 1Blocos de código: 402 ago 2023

Palavras-chave

Compartilhar
Comentar

Com o crescimento exponencial da computação em nuvem, a AWS (Amazon Web Services) se tornou uma das plataformas mais populares para hospedar e gerenciar recursos de TI. No entanto, muitos desenvolvedores, incluindo eu, têm enfrentado um desafio comum: o esquecimento de recursos criados em uma conta de teste. Recursos como instâncias EC2, bancos de dados RDS e buckets S3, quando deixados não gerenciados, podem levar a custos inesperados e, em alguns casos, à perda de dados. Neste artigo, exploraremos como automatizar a listagem e remoção desses recursos em todas as regiões da AWS, garantindo uma abordagem segura e eficiente.

Ferramentas e Tecnologias Utilizadas

Para resolver o problema da gestão de recursos não utilizados na AWS, empregaremos uma combinação poderosa de ferramentas: Terraform e Python com a biblioteca Boto3. O Terraform é uma ferramenta de infraestrutura como código (IaC) que permite a criação, modificação e remoção de recursos de forma declarativa. Ele nos fornecerá a capacidade de listar e gerenciar recursos EC2, RDS e S3 em todas as regiões da AWS. Complementando o Terraform, utilizaremos o Boto3, uma biblioteca Python que nos permitirá interagir com os serviços da AWS, possibilitando a automatização das remoções de recursos.

Implementando a Automação

No processo de implementação da automação, começamos definindo os recursos EC2, RDS e S3 no arquivo Terraform main.tf. Em seguida, configuramos uma variável aws_regions que conterá todas as regiões da AWS que desejamos abranger. Com o Terraform configurado, criamos um script Python chamado list_resources.py que utiliza o Boto3 para listar os recursos em cada região e, quando necessário, removê-los. O script é executado sequencialmente para garantir que todos os recursos não utilizados em todas as regiões da conta AWS de teste sejam identificados e eliminados, minimizando assim os custos e riscos associados ao esquecimento desses recursos.

Para automatizar a listagem e remoção de recursos EC2, RDS e S3 em todas as regiões da AWS usando Terraform e Python, você pode seguir os passos abaixo:

1. Configuração inicial:

Certifique-se de ter o Terraform instalado e configurado em sua máquina local. Você também precisará de credenciais de acesso à sua conta AWS configuradas como variáveis de ambiente (AWS_ACCESS_KEY_ID e AWS_SECRET_ACCESS_KEY) ou por meio do arquivo de configuração AWS CLI.

2. Listagem e Remoção de Recursos:

Aqui, vamos usar Terraform para listar e remover os recursos EC2, RDS e S3 em todas as regiões da AWS. Se necessário, usaremos Python com a biblioteca Boto3 para ajudar na remoção dos recursos.

2.1. Crie o arquivo main.tf com o seguinte conteúdo:

provider "aws" {
  region = "us-east-1"  # Defina uma região aqui para inicializar o provider
}

# Recursos EC2
resource "aws_instance" "existing_instances" {
  count = 0
}

# Recursos RDS
resource "aws_db_instance" "existing_db_instances" {
  count = 0
}

# Recursos S3
resource "aws_s3_bucket" "existing_s3_buckets" {
  count = 0
}

2.2. Crie o arquivo variables.tf com o seguinte conteúdo:

variable "aws_regions" {
  type    = list(string)
  default = ["us-east-1", "us-west-1", "us-west-2", "eu-west-1", "eu-central-1", "ap-southeast-1", "ap-southeast-2", "ap-northeast-1", "sa-east-1"]
}

Adicione ou remova regiões da lista aws_regions conforme necessário.

2.3. Crie o arquivo outputs.tf com o seguinte conteúdo:

output "existing_instances" {
  value = aws_instance.existing_instances[*].id
}
output "existing_db_instances" {
  value = aws_db_instance.existing_db_instances[*].identifier
}
output "existing_s3_buckets" {
  value = aws_s3_bucket.existing_s3_buckets[*].bucket
}

2.4. Crie o arquivo list_resources.py com o seguinte conteúdo:

import boto3
import os
def get_all_regions():
    ec2 = boto3.client('ec2', region_name='us-east-1')
    response = ec2.describe_regions()
    return [region['RegionName'] for region in response['Regions']]
def list_ec2_instances(region):
    ec2 = boto3.resource('ec2', region_name=region)
    instances = ec2.instances.filter(Filters=[{'Name': 'instance-state-name', 'Values': ['running']}])
    return list(instances)
def list_rds_instances(region):
    rds = boto3.client('rds', region_name=region)
    response = rds.describe_db_instances()
    return response['DBInstances']
def list_s3_buckets(region):
    s3 = boto3.client('s3', region_name=region)
    response = s3.list_buckets()
    return response['Buckets']
def delete_ec2_instances(instances):
    for instance in instances:
        instance.terminate()
def delete_rds_instances(instances):
    for instance in instances:
        rds = boto3.client('rds', region_name=instance['DBInstanceIdentifier'].split(':')[0])
        rds.delete_db_instance(DBInstanceIdentifier=instance['DBInstanceIdentifier'], SkipFinalSnapshot=True)
def delete_s3_buckets(buckets):
    for bucket in buckets:
        s3 = boto3.resource('s3', region_name=bucket['LocationConstraint'])
        bucket = s3.Bucket(bucket['Name'])
        bucket.objects.all().delete()
        bucket.delete()
if __name__ == "__main__":
    regions = get_all_regions()
    for region in regions:
        print(f"Listing resources in region {region}")
        # List EC2 instances
        ec2_instances = list_ec2_instances(region)
        print(f"EC2 instances found: {len(ec2_instances)}")
        if ec2_instances:
            delete_ec2_instances(ec2_instances)
        # List RDS instances
        rds_instances = list_rds_instances(region)
        print(f"RDS instances found: {len(rds_instances)}")
        if rds_instances:
            delete_rds_instances(rds_instances)
        # List S3 buckets
        s3_buckets = list_s3_buckets(region)
        print(f"S3 buckets found: {len(s3_buckets)}")
        if s3_buckets:
            delete_s3_buckets(s3_buckets)
        print(f"Resources deleted in region {region}")

3. Execução:

  1. Execute o comando terraform init para inicializar o diretório do Terraform.
  2. Em seguida, execute terraform apply para criar a configuração e listar todos os recursos existentes em todas as regiões.
  3. Por fim, execute o script Python list_resources.py para remover os recursos EC2, RDS e S3 em todas as regiões.

Observações:

  • Tenha extremo cuidado ao executar a remoção de recursos, pois ela é irreversível e pode causar perda permanente de dados. Certifique-se de que está usando uma conta de teste e que os recursos a serem removidos são realmente os que você deseja.

Automatizar a limpeza de recursos AWS com Terraform e Python é uma solução valiosa para desenvolvedores que desejam manter suas contas de teste organizadas e eficientes. A combinação do poder do Terraform para configuração de infraestrutura e do Boto3 para interação com a AWS torna o processo seguro e controlado.

Ao adotar essa abordagem, desenvolvedores podem concentrar-se mais no desenvolvimento de aplicativos e menos na gestão manual de recursos, economizando tempo e recursos financeiros. Além disso, essa prática garante que a conta de teste esteja sempre pronta para novos projetos, evitando possíveis conflitos com recursos previamente provisionados. Em resumo, automatizar a limpeza de recursos AWS é uma prática recomendada para maximizar a eficiência e a organização de projetos em nuvem.

Até o próximo post! =)

Comentários

Todo comentário passa por moderação antes de aparecer aqui. Nada é publicado automaticamente.

Carregando…