Я экспериментирую с AWS Lambda с небольшим фрагментом кода, который извлекает некоторые файлы из S3. К сожалению, я даже не могу получить доступ к интернет-ресурсам, когда помещаю свою лямбда-функцию в VPC, хотя я считаю, что VPC настроен правильно.
У меня есть следующий пример кода, который демонстрирует то, что я пытаюсь сделать: вызов urlopen просто продолжает отключаться по таймауту из-за проблем с сетью (и отлично работает, если я установил свою лямбду вне 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
Основываясь на ответе Майкла, я наконец понял это. (Огромное ему спасибо! :))
Поскольку я так много боролся с этим, я фиксирую окончательное решение на случай, если кто-то столкнется с той же проблемой.
В итоге я использовал три Subnets
, Internet Gateway
, а NAT Gateway
и два разных Routing tables
(помимо основной таблицы маршрутизации VPC):
Одна небольшая подсеть, в которой размещается шлюз NAT только со специальной таблицей маршрутизации
10.0.0.0/24
) направляется к local
0.0.0.0/0
) направляется в Internet Gateway
Две подсети, в которых размещаются службы Lambda, с другой таблицей маршрутизации
10.0.0.0/24
) направляется к local
0.0.0.0/0
) направляется в NAT Gateway
Фактически, Документация AWS имеет довольно хорошее объяснение по этому поводу, мне очень помогла диаграмма их примерной настройки.