如何在AWS lambda中不知道目标IP的情况下删除route53一条记录?

时间:2017-02-10 12:01:09

标签: boto3

似乎change_resource_record_sets方法需要Name(例如myhost.mydomain.com)和记录的目标值(例如123.123.123.123)才能执行'Action': 'DELETE',但是目标IP已从终止的实例中删除,因此似乎资源记录的完整查找需要完整的list_resource_record_sets扫描才能获取该信息。

是否有一种首选方法来获取已终止实例的ip,或者在不知道boto3 / aws sdk中的ip的情况下删除记录?

详细信息:我有一个自动扩展组,它维护3个实例,以及一个在终止自动扩展实例时触发的python lambda。在创建实例期间,创建了route53 A记录,该记录与vpc私有IP地址匹配,如下所示;

instance_id: i-0bfced710f9c11867

创建route53记录:

{'Name': 'webXXX-dev-euwest1-0bfced710f9c11867-mydomain.com.',
 'ResourceRecords': [{'Value': '10.69.98.116'}],
 'TTL': 60,
 'Type': 'A'}

但是,当实例终止时,实例的私有和公共ipv4字段在lambda事件中(以及在控制台中的已终止实例上)未设置。因此,为了使用change_resource_record_sets方法,我需要从其他地方提供IP地址;

def delete_route53(host,ip):
    route53.change_resource_record_sets(
    HostedZoneId=hostedzoneid,
    ChangeBatch={
        'Changes': [
            {
                'Action': 'DELETE',
                'ResourceRecordSet': {
                    'Name': host,
                    'Type': 'A',
                    'TTL': 60,
                    'ResourceRecords': [
                        {
                            'Value': ip
                        }
                    ]
                }
            }
        ]
    }
    )

所以目前我必须查找记录才能将其删除;

response = route53.list_resource_record_sets(
    HostedZoneId=hostedzoneid,
    StartRecordType='A',
    StartRecordName=domain,
    MaxItems="10"
)

和一堆代码,用于为DELETE操作重新创建Name和ResourceRecords。这似乎有点迂回,并且由于远程呼叫(费用很高)而在lambda中很慢

是否有更简单的方法来删除该记录?

1 个答案:

答案 0 :(得分:0)

使用标签解决了同样的问题。当新实例启动时,它会使用自己的IP地址进行标记。然后在终止时我们只解析标签并使用它来删除Route53主机记录。已终止的实例记录可用约30分钟,因此对我们来说工作正常。

要记住一件事,如果您正在使用弹性IP,这将无法正常工作。弹性IP附加到实例时没有任何事件,因此您需要延迟触发器,否则最终会在标签中使用非弹性IP。