public 子网中的 AWS Lambda 无法访问互联网
AWS Lambda in public subnet cannot access the internet
我正在尝试在 public 子网中获取 Lambda 运行ning 以与互联网通信。我能够让 Lambda 在没有 VPC 的情况下命中 www.google.com(文档在幕后说 运行s 一个)但如果我 运行 Lambda 在 VPC 中则不能。
重现步骤:
- 使用以下代码创建 Lambda (Node.js 12x)。我将 Lambda 命名为 'curlGoogle'.
- 运行 以验证它是否成功并且可以从 www.google.com 获取。不应指定 VPC。
- 转到 VPC 控制面板并使用 VPC 向导创建一个具有 public 子网的 VPC。我尝试了 IPv4 CIDR 块(例如 10.1.0.0/16)、IPv6 CIDR 块、AZ 的视图值。我通常将 'Enable DNS hostnames' 留给是。
- 更改 Lambda 以使用新创建的 VPC、子网和安全组。
- 验证这没有达到 Google 并且超时。
我已经尝试修改此方法但没有取得任何成功(例如,实际将子网与 vpc 关联,放松安全组和网络 ACL 上的所有设置)。
我最初尝试遵循一个 public 和一个私人文档,但没能成功。
有什么想法吗?谢谢!
-丹
const http = require('http');
exports.handler = async (event) => {
return httprequest().then((data) => {
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
});
};
function httprequest() {
return new Promise((resolve, reject) => {
const options = {
host: 'www.google.com',
path: '/',
port: 80,
method: 'GET'
};
const req = http.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
return reject(new Error('statusCode=' + res.statusCode));
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = Buffer.concat(body).toString();
} catch(e) {
reject(e);
}
resolve(body);
});
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.end();
});
}
在 VPC 中时,AWS Lambda 函数永远不会分配 public IP 地址,即使它们在 public 子网中也是如此。所以他们永远无法在 VPC 中 运行 时直接访问 Internet。您必须将 Lambda 函数放置在具有到 NAT 网关路由的私有子网中,以便让它们从您的 VPC 内访问互联网。
我正在尝试在 public 子网中获取 Lambda 运行ning 以与互联网通信。我能够让 Lambda 在没有 VPC 的情况下命中 www.google.com(文档在幕后说 运行s 一个)但如果我 运行 Lambda 在 VPC 中则不能。
重现步骤:
- 使用以下代码创建 Lambda (Node.js 12x)。我将 Lambda 命名为 'curlGoogle'.
- 运行 以验证它是否成功并且可以从 www.google.com 获取。不应指定 VPC。
- 转到 VPC 控制面板并使用 VPC 向导创建一个具有 public 子网的 VPC。我尝试了 IPv4 CIDR 块(例如 10.1.0.0/16)、IPv6 CIDR 块、AZ 的视图值。我通常将 'Enable DNS hostnames' 留给是。
- 更改 Lambda 以使用新创建的 VPC、子网和安全组。
- 验证这没有达到 Google 并且超时。
我已经尝试修改此方法但没有取得任何成功(例如,实际将子网与 vpc 关联,放松安全组和网络 ACL 上的所有设置)。
我最初尝试遵循一个 public 和一个私人文档,但没能成功。
有什么想法吗?谢谢! -丹
const http = require('http');
exports.handler = async (event) => {
return httprequest().then((data) => {
const response = {
statusCode: 200,
body: JSON.stringify(data),
};
return response;
});
};
function httprequest() {
return new Promise((resolve, reject) => {
const options = {
host: 'www.google.com',
path: '/',
port: 80,
method: 'GET'
};
const req = http.request(options, (res) => {
if (res.statusCode < 200 || res.statusCode >= 300) {
return reject(new Error('statusCode=' + res.statusCode));
}
var body = [];
res.on('data', function(chunk) {
body.push(chunk);
});
res.on('end', function() {
try {
body = Buffer.concat(body).toString();
} catch(e) {
reject(e);
}
resolve(body);
});
});
req.on('error', (e) => {
reject(e.message);
});
// send the request
req.end();
});
}
在 VPC 中时,AWS Lambda 函数永远不会分配 public IP 地址,即使它们在 public 子网中也是如此。所以他们永远无法在 VPC 中 运行 时直接访问 Internet。您必须将 Lambda 函数放置在具有到 NAT 网关路由的私有子网中,以便让它们从您的 VPC 内访问互联网。