連接到所需的AWS資源,在我的拉姆達執行功能開始後,我有一個lambda_handler
功能如下所示:故障使用Python請求模塊,使AWS拉姆達內API後調用
def lambda_handler(event, context, dst):
bucket = event['Records'][0]['s3']['bucket']['name']
key = urllib.unquote_plus(event['Records'][0]['s3']['object']['key'].encode('utf8'))
print('Bucket: %s' % bucket)
print('Object key: %s' % key)
crm_file_name = key.split('/')[-1]
crm_query = make_crm_db_query(crm_file_name)
cur = conn.cursor()
status = cur.execute(crm_query)
if status == 1:
details = cur.fetchone()
opportunity_id = details[0]
tmp = dst.get_key('%s/%s' % (opportunity_id, crm_file_name))
print('starting API request...')
s = requests.Session()
r = s.post('http://link/to/endpoint/',\
files={'pdf': tmp}, data={'opportunity_id': opportunity_id})
print(r)
print(r.content)
else:
print('not the right file type')
在我的開發環境,這將返回以下,表明該職位是成功的:
starting API request...
<Response [201]>
{"opportunity_id":253,"pdf":"https://s3.storage.asset.com:443/253/253___PDF.pdf?Signature=[CONFIDENTIAL STUFF HERE ;)]"}
在AWS雲觀看記錄,但是嘗試執行POST請求當進程掛起。下面是一個日誌示例:
starting API request...
END RequestId: beedb0c4-ce07-11e6-a715-53b3bd8edccc
REPORT RequestId: beedb0c4-ce07-11e6-a715-53b3bd8edccc Duration: 30002.89 ms Billed Duration: 30000 ms Memory Size: 128 MB Max Memory Used: 22 MB
2016-12-29T20:46:24.356Z beedb0c4-ce07-11e6-a715-53b3bd8edccc Task timed out after 30.00 seconds
的S3桶,API端點和RDS都屬於同一個VPC。該流程在dev中運行,但在生產中掛起。任何關於如何調試的指針?
我檢查this post,指出到外部Internet網絡資源的連接需要NAT網關,但我們的API端點在同一VPC內的EC2實例中運行。 AWS是否認爲我們仍在嘗試建立外部連接,因爲我們正在使用API調用?我該如何調試?
有沒有真正足夠熄滅這裏從外人的角度。我只是仔細檢查你的開發和產品設置之間的差異......並確保你所做的任何假設都是正確的。 – Jack
您需要確保您正在使用運行API的EC2服務器的專用IP。如果您使用公共IP,它將被視爲VPC外部存在的資源。另外,您是否打開了EC2服務器所屬的安全組,以允許從Lambda函數(通過Lambda函數所屬安全組的ID)進行訪問? –
@MarkB:這真的很有幫助,謝謝,我擔心這可能是這樣的。問題在於我們在配置了Jenkins的EC2實例上運行應用程序。負載均衡讀取傳入請求的頭部,然後根據公共域名調用相應的應用程序。如果我們切換到私有IP,那麼負載均衡器將不知道要調用哪個應用程序。聽起來我們可以自定義負載均衡器規則(不知道它有多容易)或創建一個專用實例。你怎麼看? – Aaron