2016-09-29 169 views
9

總的來說,我在VPC中使用AWS Lambda感到非常困惑。問題是Lambda在嘗試訪問S3存儲桶時超時。該解決方案似乎是VPC端點。從VPC內的Lambda訪問AWS S3

我已將Lambda函數添加到VPC,因此它可以訪問RDS託管數據庫(未在下面的代碼中顯示,但功能正常)。但是,現在我無法訪問S3以及任何嘗試這樣做的時間。

我試着創建一個VPC S3端點,但沒有任何改變。

VPC配置

我使用的是默認創建一個簡單的VPC每當我首次提出的EC2實例。它有四個子網,都是默認創建的。

VPC路由表

_Destination - Target - Status - Propagated_ 

172.31.0.0/16 - local - Active - No 

pl-63a5400a (com.amazonaws.us-east-1.s3) - vpce-b44c8bdd - Active - No 

0.0.0.0/0 - igw-325e6a56 - Active - No 

簡單S3下載LAMBDA:

import boto3 
import pymysql 
from StringIO import StringIO 

def lambda_handler(event, context): 
    s3Obj = StringIO() 

    return boto3.resource('s3').Bucket('marineharvester').download_fileobj('Holding - Midsummer/sample', s3Obj) 
+2

VPC S3端點需要路由表配置和安全策略配置。如果您需要幫助,您需要顯示如何配置這些設置。該文檔位於:http://docs.aws.amazon.com/AmazonVPC/latest/UserGuide/vpc-endpoints.html或者,您可以添加一個NAT網關到VPC,這將使Lambda函數可以訪問VPC之外的所有內容,而不僅僅是S3服務。 –

+0

這是vpc配置問題。在路由表上配置任意一個與NAT網關的sbunet assosiatio。你仍然在尋找問題? –

+0

我已經添加了一些關於VPC配置的信息。我認爲這將是問題出在哪裏,但VPC對我來說在很大程度上是一個黑盒子。我不知道用什麼來檢查它,看看可能是什麼配置不當。 – noobiemcfoob

回答

1

我的問題的原因一直沒有正確配置我的安全組的出站規則。具體來說,我需要添加自定義協議出站規則,其目標是pl-XXXXXXXX(S3服務,實際值由AWS控制檯提供)。

+3

你可以舉例說明如何做到這一點,因爲即使我面臨同樣的問題 – Lajpat

+0

'pl-xxx'看起來像一個前綴列表,如下所述:http://docs.aws.amazon。com/AmazonVPC/latest/UserGuide/vpc-endpoints.html#vpc-endpoints-basics,可以在命令行中找到'aws ec2 describe-prefix-lists'。 –

+0

最後,我只是爲這個lambda函數創建了一個安全組:'aws ec2 create-security-group --group-name my-lambda --description'祝你好運'--vpc-id vpc-123456'我申請了那個團體並沒有其他的。出口規則是唯一重要的。如果你不給,一切都是允許的。我對此並不滿意,但代碼很小且可審覈,我無法控制嚴格的工作。如果代碼變得更復雜,我將不得不重新審視這個問題。 –

4

隨着boto3,S3的網址是虛擬默認情況下,然後需要互聯網訪問解析到區域特定的網址。這會導致Lambda函數掛起,直到超時。

要解決創建客戶端,它告訴boto3時,這需要使用Config對象的創建路徑基於S3的URL來代替:

import boto3 import botocore.config 

client = boto3.client('s3', 'ap-southeast-2, config=botocore.config.Config(s3={'addressing_style':'path'})) 

注意,在呼叫的區域必須是區域您正在部署lambda和VPC端點。

然後,您將能夠在Lambda安全組內使用VPC終端的pl-xxxxxx前綴列表,但仍然可以訪問S3。

這是一個工作CloudFormation script,演示了這一點。它創建一個S3存儲桶,一個與僅包含專用子網和VPC端點的VPC關聯的lambda(將記錄放入存儲桶中)以及必需的IAM角色。

+1

感謝您的解釋!我真的很生氣。 – Mat