2016-12-29 22 views
3

連接到所需的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​​調用?我該如何調試?

+0

有沒有真正足夠熄滅這裏從外人的角度。我只是仔細檢查你的開發和產品設置之間的差異......並確保你所做的任何假設都是正確的。 – Jack

+1

您需要確保您正在使用運行API的EC2服務器的專用IP。如果您使用公共IP,它將被視爲VPC外部存在的資源。另外,您是否打開了EC2服務器所屬的安全組,以允許從Lambda函數(通過Lambda函數所屬安全組的ID)進行訪問? –

+0

@MarkB:這真的很有幫助,謝謝,我擔心這可能是這樣的。問題在於我們在配置了Jenkins的EC2實例上運行應用程序。負載均衡讀取傳入請求的頭部,然後根據公共域名調用相應的應用程序。如果我們切換到私有IP,那麼負載均衡器將不知道要調用哪個應用程序。聽起來我們可以自定義負載均衡器規則(不知道它有多容易)或創建一個專用實例。你怎麼看? – Aaron

回答

1

我遇到同樣的timeout problem,原因如下。

AWS document

當您添加VPC配置lambda函數,它只能在VPC訪問資源。如果Lambda函數需要訪問VPC資源和公共Internet,則VPC需要在VPC內部有一個網絡地址轉換(NAT)實例。

標記B的評論是正確的。

我建議你可以按照這個blog構建NAT。

+0

謝謝,@Jimlin,你和Mark B都是。 VPC是解決這個問題的最簡單的方法。 – Aaron