J'ai suivi le tutoriel ici pour créer un VPC avec des sous-réseaux publics et privés.
J'ai ensuite mis en place une fonction AWS lambda à l'intérieur du sous-réseau public pour tester s'il pouvait se connecter à Internet extérieur.
Voici ma fonction lambda écrite en python3
import requests
def lambda_handler(event, context):
r = requests.get('http://www.google.com')
print(r)
La fonction ci-dessus n'a pas pu récupérer le contenu de http://www.google.com
lorsque je l'ai placé dans le sous-réseau public d'un VPC.
Voici le message d'erreur:
"errorMessage": "HTTPConnectionPool (Host = 'www.google.com', port = 80): Nombre maximal de tentatives dépassé avec l'URL:/(Causé par NewConnectionError (': échec de l'établissement d'une nouvelle connexion: [Errno 110] La connexion a expiré) ',)) "," errorType ":" ConnectionError ",
Je ne comprends pas pourquoi.
La table de routage du sous-réseau public ressemble à ceci:
GET
demande à http://www.google.com
doit correspondre à igw-XXXXXXXXX
cible. Pourquoi la passerelle Internet (IGW) ne peut-elle pas envoyer la demande à http://www.google.com
et récupérer le contenu du site Web?
Cette article dit que je dois définir la fonction lambda dans le sous-réseau privé afin d'avoir accès à Internet.
Si votre fonction Lambda doit accéder à des ressources VPC privées (par exemple, une instance DB Amazon RDS ou une instance Amazon EC2), vous devez associer la fonction à un VPC. Si votre fonction nécessite également un accès Internet (par exemple, pour atteindre un point de terminaison de service AWS public), votre fonction doit utiliser une passerelle ou une instance NAT.
Mais cela n'explique pas pourquoi je ne peux pas définir la fonction lambda dans le sous-réseau public.
La raison pour laquelle votre fonction Lambda ne peut pas accéder à Internet, même si la fonction Lambda s'exécute à l'intérieur d'un sous-réseau public d'un VPC, est que les fonctions Lambda n'ont pas et ne peuvent pas avoir d'adresses IP publiques. Vous ne pouvez pas envoyer de trafic directement sur Internet sans IP publique. Vous auriez besoin de passer par un NAT.
La cible de route par défaut pour le trafic dans un sous-réseau public VPC est Internet Gateway (IGW) et, comme la fonction Lambda n'a qu'une IP privée, tous les paquets vers Internet à partir de la fonction Lambda seront supprimés à l'IGW.
Si votre fonction Lambda n'a pas réellement besoin d'accéder à des ressources privées à l'intérieur de votre VPC, vous n'avez généralement pas besoin de déployer Lambda dans un VPC. Mais si cela est nécessaire, exécutez la fonction Lambda dans un sous-réseau privé et assurez une route par défaut de ce sous-réseau vers une instance NAT ou NAT Gateway in un sous-réseau public. Et configurez un IGW.