[PYTHON] Pseudo-Stop / Start-NAT-Gateway

Abrechnung für NAT-Gateways ohne VS

Die Verwendung von NAT-Gateways ist unerwartet teuer, und ich möchte sie stoppen, wenn sie nicht verwendet werden, z. B. nachts in einer Entwicklungsumgebung. Derzeit gibt es jedoch keine Stoppfunktion, und Stopp entspricht dem Löschen. In Bezug auf das Stoppen ist es eine gute Idee, eine NAT-Instanz einzurichten und zu stoppen, aber das ist einfach mühsam. Ich möchte den verwalteten Dienst verwenden. Erstellen Sie dann ein Skript, das das NAT-Gateway löscht, wenn es nicht verwendet wird, und es mit den erforderlichen Informationen neu erstellt, wenn Sie es verwenden möchten.

Versuchen Sie herauszufinden, was Sie tun möchten

gomi.png Ich habe nicht offiziell gelernt, wie man UML schreibt, also bitte vergib mir.

Skript stoppen (löschen)

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

#Starten Sie das NAT-Gateway
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

#Holen Sie sich das Routing in Richtung NAT-Gateway
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'])
 
#Fügen Sie den Namen des NAT-Gateways in das Tag des Subnetzes ein
for sub, nm in zip(subnetList, natGateWayNameList):
    response = client.create_tags(
        Resources=[
            sub,
        ],
        Tags=[
            {
                'Key': 'tempNatName',
                'Value': str(nm)
            },
        ]
    )

#Setzen Sie ein Flag in der Routentabelle, in der das NAT-Gateway vorhanden ist
for i in routeTableList:
    response = client.create_tags(
        Resources=[
            i,
        ],
        Tags=[
            {
                'Key': 'routeingToNat',
                'Value': 'True'
            },
        ]
    )

#Sammeln Sie EIP aus dem Wert, den das Startskript erhalten hat
response = client.describe_addresses(
    Filters=[
        {
            'Name': 'tag:DisFLG',
            'Values': ['True']
        },
    ]
)
#Verschiedene Löschvorgänge
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)

Startskript

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

#Stellen Sie das NAT-Namensschild aus dem Subnetz wieder her, in dem sich das NAT-Gateway befand
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

#Kennzeichnen Sie EIP zum Löschen
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'])

#Erstellen Sie ein NAT-Gateway
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']
        },
    ],
)

#Abrufen und Weiterleiten von Werten aus Tags in der Routentabelle
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
            )
 

Etwas anderes

Referenzierte Seite

Ich habe versucht, den Start / Stopp von NAT Gateway ohne Server zu verwalten [Oshinin! Weiches Dojo] https://www.ntt-tx.co.jp/column/dojo_aws_blog/20180411/ Ich möchte aufhören, wenn ich keine AWS-Ressourcen verwende! https://qiita.com/atmitani/items/dbb58e820030996b73d9 Ich möchte EC2 einfach mit dem einfachsten Mechanismus starten / stoppen! | Klassenmethoden-Blog https://dev.classmethod.jp/cloud/aws/simple-auto-start-stop-for-ec2/

Recommended Posts

Pseudo-Stop / Start-NAT-Gateway
Starten / Stoppen von GCE über Python