2016-03-03 27 views
3

我試圖使用Lambda拍攝Elasticsearch集羣的快照。我的腳本在本地完美運行,但是在Lambda中,它在嘗試掃描DynamoDB時掛起(我的Elasticsearch位置的真相來源)爲了排除IAM權限,我將該函數的全部管理權限作爲調試的臨時措施。我的代碼如下:Boto 3掛在Lambda

import boto3 
import datetime 
import json 
import requests 

dynamodb = boto3.resource('dynamodb', region_name='us-east-1') 

# change this to whatever your table name is 
table = dynamodb.Table('elasticsearch-backups') 
today = datetime.date.today() 

# I don't fully understand the reason for this. Following example 
# http://docs.aws.amazon.com/amazondynamodb/latest/gettingstartedguide/GettingStarted.Python.04.html 
pe = "#dmn, #pth, #bkt" 
ean = {"#dmn": "domain", "#pth": "path", "#bkt": "bucket"} 


def lambda_handler(event, context): 
    print "started" 

    print "scanning table" 


# hangs at this table.scan call 


    nodes = table.scan(
     ProjectionExpression=pe, 
     ExpressionAttributeNames=ean 
     ) 

    print "nodes are " + str(nodes) 

    for i in nodes['Items']: 
     bucket = str(i['bucket']) 
     path = str(i['path']) 

     print "bucket is " + str(i['bucket']) 
     print "base_path is " + str(i['path']) 

     print "setting repository json" 
     repository = { 
      "type": "s3", 
      "settings": { 
       "bucket": bucket, 
       "base_path": path 
      } 
     } 
     print "repository json is " + json.dumps(repository) 

     print "setting url path" 
     url = i['domain'] + "/_snapshot/lambda_s3_repository" 
     print "url path is " + url 

    # create repository 
     print "creating repository" 
     response = requests.put(
      url, 
      data=json.dumps(repository) 
      ) 
     print response.content 

    # start snapshot 
     print "starting snapshot" 
     url = url + "/" + str(today) 
     response = requests.put(
      url 
      ) 
     print response.content 

lambda_handler("test", "test") 

有什麼我可以做的就是更深入地瞭解正在發生的事情是掛函數調用來進一步調試?我在日誌中幾乎沒有看到任何東西。它不會失敗,它會掛起直到Lambda殺死它。

+1

掛在這一步聽起來像一個網絡連接問題。如果這是一個權限問題,您將立即返回錯誤。你碰巧爲你的Lambda函數啓用VPC訪問嗎? –

+0

是的,這幾乎是肯定的。我沒有啓用NAT網關。我會這麼做並報告回 – smiller171

+0

不幸的是,該子網中已經存在一個NAT實例,並且路由設置正確。這不是託管的NAT,但這不應該太重要AFAIK – smiller171

回答

1

在這種情況下,我無法連接到DynamoDB API。這可能是由於沒有按照Mark B的建議在VPC功能上設置NAT,但在這種情況下,我對傳出安全組的限制太大。