Amazon ec2 启用VPC的Lambda功能无法在同一VPC中启动/访问EC2

Amazon ec2 启用VPC的Lambda功能无法在同一VPC中启动/访问EC2,amazon-ec2,aws-lambda,boto3,amazon-vpc,Amazon Ec2,Aws Lambda,Boto3,Amazon Vpc,我有一个支持VPC的Lambda函数,它尝试使用启动模板启动EC2。EC2启动步骤(run_实例)失败,出现以下一般网络错误 调用调用API操作失败,并显示以下消息:网络错误 我可以直接从启动模板成功地启动一个实例,因此我认为启动模板一切正常。我已经在启动模板中配置了以下内容 亚马逊机器映像ID 实例类型 钥匙对 我在使用特定(专有网络、子网、安全组)组合之前创建的网络接口(ENI) IAM角色 Lambda函数包括以下代码- import json import boto3 import

我有一个支持VPC的Lambda函数,它尝试使用启动模板启动EC2。EC2启动步骤(run_实例)失败,出现以下一般网络错误

调用调用API操作失败,并显示以下消息:网络错误

我可以直接从启动模板成功地启动一个实例,因此我认为启动模板一切正常。我已经在启动模板中配置了以下内容

  • 亚马逊机器映像ID
  • 实例类型
  • 钥匙对
  • 我在使用特定(专有网络、子网、安全组)组合之前创建的网络接口(ENI)
  • IAM角色
Lambda函数包括以下代码-

import json
import boto3
import time

def lambda_handler(event, context):
    ec2_cl = boto3.client('ec2')
    launch_temp = {"LaunchTemplateId": "<<Launch Template ID>>"}
    resp_ec2_launch = ec2_cl.run_instances(MaxCount=1, MinCount=1, LaunchTemplate=launch_temp, SubnetId="<<Subnet ID>>")

导入json
进口boto3
导入时间
def lambda_处理程序(事件、上下文):
ec2_cl=boto3.client(“ec2”)
launch_temp={“LaunchTemplateId”:“”}
resp_ec2_launch=ec2_cl.run_实例(MaxCount=1,MinCount=1,LaunchTemplate=launch_temp,SubnetId=”“)
关于Lambda函数的几个问题-

  • 我在run_instances()调用中使用了子网,因为这不是默认的vpc/子网
  • 该功能使用与启动模板中使用的相同(VPC、子网、安全组)组合进行设置
  • 执行角色设置为与启动模板中使用的IAM角色相同
  • 您看到的功能只需要访问EC2,不需要访问internet
  • 我将run_instances()替换为descripe_instance_status(使用直接从启动模板创建的实例id),并得到了相同的错误
该错误是一个网络错误,因此我假设授予IAM角色权限后一切正常(至少到目前为止)。我确信,如果IAM角色遗漏了任何策略,则会出现不同的错误


有人能指出我可能遗漏了什么吗?

问题似乎在于您的AWS Lambda函数能够访问Internet,因为Amazon EC2 API端点位于Internet上

如果Lambda功能未连接到专有网络,则它可以自动访问互联网

如果Lambda功能连接到VPC,并且需要访问互联网,则配置应为:

  • 仅将Lambda功能附加到专用子网
  • 在公用子网中启动一个NAT网关
  • 配置专用子网上的路由表以通过NAT网关发送Internet绑定流量(
    0.0.0.0/0

您的VPC似乎没有Internet网关,但它确实有一个用于EC2的VPC端点

因此,为了再现您的情况,我做了以下几点:

  • 创建了一个新的专有网络,其中有一个子网,但没有互联网网关
  • 将EC2的VPC端点添加到子网
  • 创建了一个Lambda函数,该函数将调用
    descripbeinstances()
    将Lambda函数附加到子网
  • 在VPC端点和Lambda函数上打开安全组,以允许来自任何地方的所有流量(嘿,这只是一个测试!)
我的Lambda函数:

导入json
进口boto3
def lambda_处理程序(事件、上下文):
ec2=boto3.client('ec2',region_name='ap-Southast-2')
打印(ec2.description_instances())

结果:Lambda函数成功地接收到来自EC2的响应,以及该区域中的实例列表。不需要任何代码或更改。

boto需要公共互联网,因此如果您的lambda位于专用vpc中,则需要nat网关。@Lamanus-感谢您的回复。我不知道boto3默认需要访问互联网。我的Lambda代码不访问internet,因此假设不需要访问internet。我将尝试为我的Lambda提供internet访问。谢谢您的回复。正在启动的EC2位于专有网络内。你能告诉我为什么你说EC2API端点在互联网上吗?我的理解是,它位于专有网络内。所有AWS API调用的端点都在互联网上(请参阅)。这意味着,例如,可以从Internet上的任何位置请求启动AmazonEC2实例。这与实例的启动位置无关。如果您希望完全在专有网络范围内致电AWS,则需要提供。谢谢。创建EC2 VPC端点后,是否应将其包括在其他位置(启动模板或运行_实例API)?我创建了一个EC2 VPC端点并测试了Lambda函数,但它失败了,出现了相同的网络错误,因此产生了这个问题。我可能需要在某个地方提到EC2 VPC端点。感谢您花时间回复。我的Lambda需要访问VPC中的EC2,所以我不明白为什么应该允许来自任何地方的流量。如果不向外部流量开放,就无法实现这一点吗?要进行
run_instances()
调用,Lambda函数需要能够访问EC2端点,该端点位于Internet上(不在VPC中)。因此,EC2需要访问互联网(通过NAT网关)或通过VPC端点。