AWS: Actualizar ip en inbound rules mediante script para dominio dinamico

lo hermoso de esto es que permite trabajar con las reglas de acceso internamente… cómo actualizar la ip de un dominio dinámico en las reglas de entrada de la instancia, para que solo sea accesible desde ese lugar, usando un script en python y corriendolo por cron, hay mejores formas seguro, pero esta es una variable.

Primero, deberemos instalar la biblioteca dnspython utilizando pip con el siguiente comando

pip install dnspython.

 

luego creamos el siguiente archivo

 

import boto3
import dns.resolver
import requests

# Configura las credenciales de acceso
aws_access_key_id = ‘TU_ACCESS_KEY_ID’
aws_secret_access_key = ‘TU_SECRET_ACCESS_KEY’
region_name = ‘TU_REGION_NAME’

# Configura las variables de AWS con tus accesos es menos seguro:
ec2 = boto3.client(‘ec2’, aws_access_key_id=aws_access_key_id, aws_secret_access_key=aws_secret_access_key, region_name=region_name)
#si la configuracion es por instancia, pero debes crear un rol para la instancia
#ec2 = boto3.resource(‘ec2’, region_name=‘TU_REGION_NAME’)
#instance = ec2.Instance(‘TU_INSTANCE_ID’)

# Configura las variables de dominio y puerto
domain_name = ‘dominio.com’
subdomain_name = ‘dinamico’
port_number = 80

# Obtiene el ID del grupo de seguridad de la instancia EC2
security_groups = ec2.describe_instances()[‘Reservations’][0][‘Instances’][0][‘SecurityGroups’]
security_group_id = security_groups[0][‘GroupId’]

# Obtiene la dirección IP pública actual del dominio dinámico
resolver = dns.resolver.Resolver()
resolver.nameservers = [‘TU_SERVIDOR_DNS’] # Reemplaza con el servidor DNS que maneja el dominio
answers = resolver.query(f'{subdomain_name}.{domain_name}’, ‘A’)
current_ip = answers[0].address

# Lee la última dirección IP registrada en el archivo de texto
try:

with open(‘last_ip.txt’, ‘r’) as file:

last_ip = file.readline()

except FileNotFoundError:

last_ip = »

# Si la dirección IP actual es diferente a la última dirección IP registrada, actualiza la regla inbound
if current_ip != last_ip:

# Actualiza las reglas de entrada del firewall de AWS para permitir el tráfico entrante desde la dirección IP pública actual del dominio dinámico
ec2.authorize_security_group_ingress(

GroupId=security_group_id,
IpPermissions=[

{

‘IpProtocol’: ‘tcp’,
‘FromPort’: port_number,
‘ToPort’: port_number,
‘IpRanges’: [

{

‘CidrIp’: f'{current_ip}/32′

},

],

},

],

)

# Escribe la dirección IP actual en el archivo de texto
with open(‘last_ip.txt’, ‘w’) as file:

file.write(current_ip)

 

 

y por ultimo creamos el cron que ejecute el archivo.

 

*/5 * * * * /usr/bin/python3 /ruta/a/tu/archivo.py