【发布时间】:2019-12-31 20:58:00
【问题描述】:
我有一个启用 VPC 的 Lambda 函数,它尝试使用启动模板启动 EC2。 EC2 启动步骤 (run_instances) 失败并出现以下一般网络错误。
调用调用 API 操作失败并显示以下消息:网络错误
我可以直接从启动模板成功启动实例,所以我认为启动模板一切正常。我在启动模板中配置了以下内容
- 亚马逊机器映像 ID
- 实例类型
- 密钥对
- 我在使用特定(VPC、子网、安全组)组合之前创建的网络接口 (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>>")
关于 Lambda 函数的一些事情-
- 我在 run_instances() 调用中使用了子网,因为这不是默认的 vpc/子网。
- 使用启动模板中使用的相同(VPC、子网、安全组)组合设置该功能
- 执行角色设置为与启动模板中使用的 IAM 角色相同
- 您看到的功能只需要访问 EC2,不需要 Internet 访问
- 我将 run_instances() 替换为 describe_instance_status(使用直接从启动模板创建的实例 ID)并得到相同的错误。
该错误是网络错误,因此我假设一切都很好(至少到目前为止)授予 IAM 角色的权限。如果 IAM 角色错过了任何政策,我确信会有不同的错误。
有人可以指出我可能缺少什么吗?
【问题讨论】:
-
boto 需要公共互联网,因此如果您的 lambda 在私有 vpc 中,您需要一个 nat 网关。
-
@Lamanus- 感谢您的回复。我不知道 boto3 默认需要访问互联网。我的 Lambda 代码无法访问 Internet,因此假设不需要 Internet 访问。我将尝试为我的 Lambda 提供 Internet 访问。
标签: amazon-ec2 aws-lambda boto3 amazon-vpc