AWS Lambda 发送 HTTP 请求

AWS Lambda sending HTTP request

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

背景:我有一个 python Lambda 函数来获取数据库中的更改,然后使用 HTTP post 将 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里面的outbound规则好像是对的。 [编辑] - 应用于此 lambda 的 VPC 确实具有互联网访问权限,并且应用的安全组似乎允许互联网访问。 [/编辑]

我已经在本地测试了代码(连接到相同的数据源)并且它可以完美运行。

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

编辑:

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

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

如果您在 VPC 内部署了 Lambda 函数,它不会获得 public IP 地址,即使它已部署到具有到 Internet 网关的路由的子网中。它只获得一个私有IP地址,因此无法自行与public Internet通信。

要与 public Internet 通信,需要在具有 route to either a NAT Gateway or a self-managed NAT instance.

的私有子网中部署在您的 VPC 内的 Lambda 函数。

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

import boto3

client = boto3.client('lambda')

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

但请确保为 lambda 角色(在源 AWS 账户中)设置 IAM 策略以调用另一个 lambda。

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