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殺死它。
掛在這一步聽起來像一個網絡連接問題。如果這是一個權限問題,您將立即返回錯誤。你碰巧爲你的Lambda函數啓用VPC訪問嗎? –
是的,這幾乎是肯定的。我沒有啓用NAT網關。我會這麼做並報告回 – smiller171
不幸的是,該子網中已經存在一個NAT實例,並且路由設置正確。這不是託管的NAT,但這不應該太重要AFAIK – smiller171