AWS Lambda发送HTTP请求

2024-04-28 06:56:52 发布

您现在位置:Python中文网/ 问答频道 /正文

这可能是一个容易回答的问题,但我似乎想不出来。

背景:我有一个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


Tags: lambda函数awsjsonurl权限编辑网关
2条回答

我也面临同样的问题。我用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用户(在源AWS帐户中)设置IAM策略以调用lambda。

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

如果您已经在VPC中部署了Lambda函数,那么它不会获得公共IP地址,即使它部署到了一个子网中,并且有到Internet网关的路由。它只获得一个私有的IP地址,因此不能单独与公共互联网通信。

要与公共Internet通信,在VPC内部部署的Lambda函数需要在一个私有子网中完成,该子网有一个route到一个NAT Gateway或一个自我管理的NAT instance

相关问题 更多 >