AWS Lambda发送HTTP请求

时间:2016-10-19 16:18:27

标签: python python-2.7 amazon-web-services aws-lambda

这可能是一个简单回答的问题,但我似乎无法弄明白。

背景:我有一个python Lambda函数来获取数据库中的更改,然后使用HTTP将json中的更改发布到URL。我正在使用urllib2这样:

# this runs inside a loop, in reality my error handling is much better
request = urllib2.Request(url)
request.add_header('Content-type', 'application/json')
try:
    response = urllib2.urlopen(request, json_message)
except:
    response = "Failed!"

从日志中可以看出,发送消息的调用完全被跳过,或者在等待响应时超时。

我是否缺少权限设置,AWS中的出站规则似乎是正确的。 [编辑] - 应用于此lambda的VPC确实具有Internet访问权限,并且应用的安全组似乎允许Internet访问。 [/编辑]

我已经在本地测试了代码(连接到同一个数据源),它运行完美。

看来,与lambda发布相关的其他问题与node.js有关,通常是因为url错误。在这种情况下,我正在使用requestb.in url,我知道它在本地运行时正常工作。

编辑:

我已经设置了我的NAT网关,它应该可以工作,我甚至已经去了另一个AWS账户,重新创建条件,它工作正常。我看不到任何会在任何地方阻止访问的安全组。它会继续超时。

编辑: 当我设置我的默认路由到NAT网关时,我只是一个白痴,出于习惯,我写了0.0.0.0/24而不是0.0.0.0/0

2 个答案:

答案 0 :(得分:7)

如果您已在自己的VPC中部署了Lambda功能,则无法获取公共IP地址,即使它已部署到具有到Internet网关路由的子网中。它只获取私有IP地址,因此无法自行与公共Internet通信。

要与公共互联网进行通信,部署在您的VPC内部的Lambda功能需要在私有子网中完成,该子网具有routeNAT Gateway或自我管理{{3} }。

答案 1 :(得分:0)

我也面临同样的问题。我通过使用boto3从另一个lambda调用lambda来克服它。

import boto3

client = boto3.client('lambda',aws_access_key_id=Target_ACCESS_KEY,aws_secret_access_key=Target_SECRET_KEY)

response = client.invoke(
    FunctionName='string',
    InvocationType='Event'|'RequestResponse'|'DryRun',
    LogType='None'|'Tail',
    ClientContext='string',
    Payload=b'bytes'|file,
    Qualifier='string'
)

但请确保为IAM用户(在Source AWS账户中)设置IAM策略以调用lambda。

除此之外,boto3在后端使用HTTP。