【发布时间】:2019-03-30 05:34:01
【问题描述】:
我按照教程 here 创建了一个具有公共子网和私有子网的 VPC。
然后我在公共子网中设置了一个 AWS lambda 函数来测试它是否可以连接到外部互联网。
这是我用 python3 编写的 lambda 函数
import requests
def lambda_handler(event, context):
r = requests.get('http://www.google.com')
print(r)
当我在 VPC 的公共子网中设置http://www.google.com 时,上述函数无法获取它的内容。
这是错误信息:
"errorMessage": "HTTPConnectionPool(host='www.google.com', port=80): url 超出最大重试次数:/(由 NewConnectionError(': 建立新连接失败:[Errno 110] 连接超时',))", "errorType": "ConnectionError",
我不明白为什么。
公有子网的路由表如下所示:
GET 对 http://www.google.com 的请求应与 igw-XXXXXXXXX 目标匹配。为什么 internet-gateway(igw) 无法将请求发送到http://www.google.com 并取回网站内容?
这个article 说我必须在私有子网中设置 lambda 函数才能访问互联网。
如果您的 Lambda 函数需要访问私有 VPC 资源(例如 例如,Amazon RDS 数据库实例或 Amazon EC2 实例),您必须 将函数与 VPC 关联。如果您的功能还需要 互联网访问(例如,访问公共 AWS 服务端点), 您的函数必须使用 NAT 网关或实例。
但这并没有解释为什么我不能在公共子网中设置 lambda 函数。
【问题讨论】:
-
Cloudwatch 中的 Lambda 日志说明了什么?假设您在部署包中包含了请求模块?会不会是 NACL 阻止了出站流量?
-
您真的需要将 Lambda 函数部署到 VPC 中吗?
标签: amazon-web-services aws-lambda vpc