2017-02-10 33 views
1

似乎change_resource_record_sets方法需要名稱(例如myhost.mydomain.com)和記錄的目標值(例如123.123.123.123)執行'Action': 'DELETE',但目標IP從終止的實例中刪除,因此它似乎資源記錄的完整查找需要完整的list_resource_record_sets掃描來獲取該信息。如何刪除路由53 AWS lambda中不知道目標IP的記錄?

有沒有一種首選的方法來獲取終止實例的IP,或刪除記錄而不知道ip在boto3/aws sdk中?

詳細信息:我有一個自動縮放組,它維護3個實例,並且在終止自動縮放實例時觸發一個python lambda。在創建實例的過程中,創建一個與vpc私有IP地址相匹配的Route53 A記錄,如下所示;

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中緩慢

是否有更簡單的方法來刪除該記錄?

回答

0

使用標籤解決了相同的問題。當一個新的實例啓動時,它被標記了自己的IP地址。然後在終止時我們只解析標籤並使用它來刪除Route53主機記錄。終止的實例記錄可用於大約30分鐘,所以這對我們來說工作得很好。


有一點要記住,如果您使用彈性IP,這是行不通的。當彈性IP連接到實例時沒有事件發生,因此您需要延遲觸發器,否則最終會在標籤中使用非彈性IP。

+0

終止的實例記錄可用~30分鐘,所以這對我們來說工作得很好。呃......這個問題,ofc,是你依賴於終止的信息,而不是垃圾回收,集。感覺像在*終止它之前獲取這些信息*然後將它放在永久性的地方(例如一個DynamoDB表或其他東西)比較容易,在那裏你只刪除它*在*你確定相關的Route 53記錄已被刪除。 –

+0

當然,但這是工作的兩倍:新的DynamoDB表,需要足夠的讀/寫容量,您的lambda函數現在需要插入相關信息等。但通常我同意,這可能會更好,我肯定會去對於任何對您/您的業務至關重要的事情來說,這條路線都是可行的 – knrdk