[PYTHON] Passerelle NAT pseudo stop / start

Facturation des passerelles NAT n'utilisant pas VS

Les frais d'utilisation de la passerelle NAT sont étonnamment élevés, et je veux l'arrêter lorsque je ne l'utilise pas dans un environnement de développement la nuit. Cependant, il n'y a pas de fonction d'arrêt pour le moment et l'arrêt équivaut à la suppression. En termes d'arrêt, c'est une bonne idée de configurer une instance NAT et de l'arrêter, mais c'est tout simplement gênant. Je souhaite utiliser le service géré. Ensuite, créez un script qui supprime la passerelle NAT lorsqu'elle n'est pas utilisée et la recrée avec les informations nécessaires lorsque vous souhaitez l'utiliser.

Essayez de comprendre ce que vous voulez faire

gomi.png Je n'ai pas officiellement étudié comment écrire UML, alors pardonnez-moi.

Script d'arrêt (suppression)

import boto3
 
client = boto3.client('ec2')
 
natGateWayList = []
routeTableList = []
subnetList = []
natGateWayNameList = []
iPlist = []

#Faites fonctionner la passerelle NAT
response = client.describe_nat_gateways(
    Filters=[
        {
            'Name': 'state',
            'Values': ['available'],
        },
    ],
)
 
for natgateway in response['NatGateways']:
    natGateWayList.append(natgateway['NatGatewayId'])
    subnetList.append(natgateway['SubnetId'])
    for tag in natgateway['Tags']:
        if tag['Key'] == "Name":
            natGateWayNameList.append(tag['Value'])
        else:
            pass

#Obtenez le routage vers la passerelle NAT
for i in natGateWayList:
    response = client.describe_route_tables(
        Filters=[
            {
                'Name': 'route.nat-gateway-id',
                'Values': [i],
            },
        ],
    )
    for j in response['RouteTables']:
        routeTableList.append(j['RouteTableId'])
 
#Insérez le nom de la passerelle NAT dans la balise de sous-réseau
for sub, nm in zip(subnetList, natGateWayNameList):
    response = client.create_tags(
        Resources=[
            sub,
        ],
        Tags=[
            {
                'Key': 'tempNatName',
                'Value': str(nm)
            },
        ]
    )

#Définissez un indicateur dans la table de routage où la passerelle NAT existe
for i in routeTableList:
    response = client.create_tags(
        Resources=[
            i,
        ],
        Tags=[
            {
                'Key': 'routeingToNat',
                'Value': 'True'
            },
        ]
    )

#Collecter EIP à partir de la valeur obtenue par le script de démarrage
response = client.describe_addresses(
    Filters=[
        {
            'Name': 'tag:DisFLG',
            'Values': ['True']
        },
    ]
)
#Divers traitements de suppression
for i in response['Addresses']:
    client.release_address(AllocationId=i['AllocationId'])
 
for i in routeTableList:
    response = client.delete_route(
        DestinationCidrBlock='0.0.0.0/0',
        RouteTableId=i,
    )
 
for i in natGateWayList:
    client.delete_nat_gateway(NatGatewayId=i)

Script de démarrage

import boto3
 
client = boto3.client('ec2')
 
subnetLst = []
ipList = []
natGateWayNameList = []
routeTableList = []
natGateWayIdList = []

#Récupérer la balise de nom NAT du sous-réseau où se trouvait la passerelle NAT
response = client.describe_subnets(
    Filters=[
        {
            'Name': 'tag:tempNatName',
            'Values': ['*']
        },
    ],
)

for h in response['Subnets']:
    subnetLst.append(h['SubnetId'])
    for i in h['Tags']:
        if i['Key'] == "tempNatName":
            natGateWayNameList.append(i['Value'])
        else:
            pass

#Marquer EIP pour suppression
for nat in natGateWayNameList:
    result = client.allocate_address(
        Domain='vpc'
    )
    response = client.create_tags(
        Resources=[
            result['AllocationId'],
        ],
        Tags=[
            {
                'Key': 'Name',
                'Value': str(nat) + '-IsIpAdress'
            },
            {
                'Key': 'DisFLG',
                'Value': 'True'
            },
        ]
    )
    ipList.append(result['AllocationId'])

#Créer une passerelle NAT
for sub, ip, ntnm in zip(subnetLst, ipList, natGateWayNameList):
    response = client.create_nat_gateway(
        AllocationId=ip,
        SubnetId=sub
    )
 
    natid = response['NatGateway']['NatGatewayId']
    natGateWayIdList.append(natid)
    client.get_waiter('nat_gateway_available').wait(NatGatewayIds=[natid])
 
    response = client.create_tags(
        Resources=[
            natid,
        ],
        Tags=[
            {
                'Key': 'Name',
                'Value': str(ntnm)
            },
        ]
    )
 
response = client.describe_route_tables(
    Filters=[
        {
            'Name': 'tag:routeingToNat',
            'Values': ['True']
        },
    ],
)

#Récupération et acheminement des valeurs des balises dans la table de routage
for i in response['RouteTables']:
    routeTableList.append(i['RouteTableId'])
 
for natId in natGateWayIdList:
    response = client.describe_nat_gateways(
        Filters=[
            {
                'Name': 'nat-gateway-id',
                'Values': [natId]
            },
        ],
    )
    natVpcId = response['NatGateways'][0]['VpcId']
    for routeTableId in routeTableList:
        rtbrespo = client.describe_route_tables(
            Filters=[
                {
                    'Name': 'route-table-id',
                    'Values': [routeTableId]
                },
            ],
        )
        rtVpcId = rtbrespo['RouteTables'][0]['VpcId']
        if natVpcId == rtVpcId:
            response = client.create_route(
               DestinationCidrBlock='0.0.0.0/0',
                NatGatewayId=natId,
                RouteTableId=routeTableId
            )
 

Quelque chose de différent

Page référencée

J'ai essayé de gérer le démarrage / l'arrêt de la passerelle NAT sans serveur [Oshinin! Dojo doux] https://www.ntt-tx.co.jp/column/dojo_aws_blog/20180411/ Je veux m'arrêter lorsque je n'utilise pas les ressources AWS! https://qiita.com/atmitani/items/dbb58e820030996b73d9 Je veux démarrer / arrêter facilement EC2 avec le mécanisme le plus simple possible! | Blog de méthode de classe https://dev.classmethod.jp/cloud/aws/simple-auto-start-stop-for-ec2/

Recommended Posts

Passerelle NAT pseudo stop / start
Démarrer / arrêter GCE à partir de python