我正在尝试使用 AWS Lambda,其中有一小段代码可以从 S3 获取一些文件。不幸的是,当我将 Lambda 函数放入 VPC 时,我甚至无法访问互联网资源,尽管我相信 VPC 配置正确。
我有以下代码示例,演示了我正在尝试做的事情:由于网络问题,urlopen 调用一直超时(如果我将 Lambda 设置为 VPC 之外,它就能正常工作)。
import json
def lambda_handler(event, context):
# TODO implement
import urllib.request
contents = urllib.request.urlopen("https://api.ipify.org?format=json").read()
return {
"statusCode": 200,
"body": json.dumps( str(contents) )
}
我已经收集了我的 VPC 等配置,有人能发现其中的问题吗?我相信我已经避免了基本问题,因此无法访问互联网资源让我感到非常困惑。
VPC:
Name: S3 CONNECTION TEST
VPC ID: vpc-09025133f1b68a1cc
State: available
IPv4 CIDR: 10.0.0.0/24
Subnet:
Name: S3-connection-check-subnet
Subnet ID: subnet-0e2904283f7b644e3
State: available
VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
Routing Table: rtb-0e0d8951583d0c5ca | S3 CONNECTIVITY check
Internet Gateway:
Name: S3 connection test
ID: igw-07aabbe0d979d0ca3
State: attached
VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
NAT Gateway:
Name: S3 connection test NAT
ID: nat-06d25cfd034108851
Status: available
Status Message: -
Elastic IP Address: (some valid public IP address)
Private IP address: 10.0.0.203
Network interface: eni-0fefa7310a1bcf050
VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
Subnet: subnet-0e2904283f7b644e3 | S3-connection-check-subnet
Routing Table:
Name: S3 CONNECTIVITY check
Route Table ID: rtb-0e0d8951583d0c5ca
Explicit association: 1 Subnet
Main: Yes
VPC: vpc-09025133f1b68a1cc | S3 CONNECTION TEST
Routes:
Route 1:
Destination: 10.0.0.0/24
Target: local
Status: Active
Propagated: No
Route 2:
Destination: 0.0.0.0/0
Target: nat-06d25cfd034108851
Status: Active
Propagated: No
Lambda function:
Name: Test-S3-Read
VPC: vpc-09025133f1b68a1cc
Subnets: subnet-0e2904283f7b644e3 (10.0.0.0/24) | xx-xxxx-xx S3-connection-check-subnet
Security Groups: sg-0e5ee380770e6e4cd (Allow All) | Allow All
Security Groups:
Name: sg-0e5ee380770e6e4cd (Allow All) | Allow All
Inbound rules:
Rule 1:
Type: ALL Traffic
Protocol: ALL
Port Range: All
Source: 0.0.0.0/0
Outbound rules:
Rule 1:
Type: ALL Traffic
Protocol: ALL
Port Range: ALL
Destination: 0.0.0.0/0
答案1
根据迈克尔的回答,我终于弄明白了这一点。(非常感谢他!:))
由于我对此进行了如此多的挣扎,所以我记录了最终的解决方案,以防有人遇到同样的问题。
我最终使用了三个Subnets
、一个Internet Gateway
、一个NAT Gateway
和两个不同的Routing tables
(除了 VPC 的主路由表):
一个托管 NAT 网关的小型子网仅有的使用专用路由表
- 其路由表包含两个条目:
- VPC 特定流量(在我的例子中
10.0.0.0/24
)被路由到local
- 其他流量(
0.0.0.0/0
)被路由到Internet Gateway
- VPC 特定流量(在我的例子中
- 其路由表包含两个条目:
使用另一个路由表托管 Lambda 服务的两个子网
- 该路由表包含两个条目:
- VPC 特定流量(在我的例子中
10.0.0.0/24
)被路由到local
- 其他流量(
0.0.0.0/0
)被路由到NAT Gateway
- VPC 特定流量(在我的例子中
- 该路由表包含两个条目:
实际上,AWS 文档对此有很好的解释,查看他们的示例设置图表对我帮助很大。