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。
这可能是一个很容易回答的问题,但我似乎无法弄明白。
背景:我有一个 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。