2016-09-29 168 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