web-dev-qa-db-fra.com

La fonction Lambda dans VPC n'a pas accès à Internet public

J'essaie de faire une demande d'API sortante à un service tiers à partir d'une fonction Lambda, mais la fonction expire toujours sans erreur.

Cela s'est déjà produit lors de la tentative d'exécution d'un s3.putObject opération dans une fonction différente (toujours dans le même VPC/sous-réseaux), et j'ai réussi à contourner cela en ajoutant un point de terminaison avec un nom de service com.amazonaws.us-east-1.s3 et en le connectant à la table de routage associée au VPC dans lequel réside cette fonction Lambda.

Dans le tableau de bord Lambda à l'intérieur de la zone Réseau -> section Groupes de sécurité, je vois cet avertissement:

Lorsque vous activez VPC, votre fonction Lambda perdra l'accès Internet par défaut. Si vous avez besoin d'un accès Internet externe pour votre fonction, assurez-vous que votre groupe de sécurité autorise les connexions sortantes et que votre VPC dispose d'une passerelle NAT.

Je crois que ce groupe de sécurité autorise les connexions sortantes, basées sur le tableau des règles sortantes juste en dessous:

enter image description here

Pour cette deuxième exigence, je peux confirmer que ce VPC a une passerelle NAT, car sur le tableau de bord VPC, dans NAT, celui qui y apparaît a un VCP qui lui est associé, et ce VPC est le même hébergeant la fonction Lambda.

J'ai suivi un guide pour créer un Flow Log pour surveiller le trafic entrant et sortant du VPC, dans l'espoir de voir que ces demandes sortantes sont en effet rejetées. Cependant, après avoir fait cela et inspecté les journaux CloudWatch, tous les enregistrements se terminent par ACCEPT OK ou NODATA.

Comment puis-je accorder l'accès Internet à ma fonction Lambda VPC? est le guide que j'ai essayé à l'origine de suivre, mais je suis resté bloqué à l'étape 4 sous To create a public or private subnet:

  1. Dans le menu déroulant Changer en:, choisissez une table de routage appropriée: Pour un sous-réseau privé, la route par défaut doit pointer vers une passerelle NAT ou NAT exemple:

    Destination: 0.0.0.0/0 Cible: nat-… (ou eni-…) Pour un sous-réseau public, la route par défaut doit pointer vers une passerelle Internet:

    Destination: 0.0.0.0/0 Cible: igw-…

Pour les quatre sous-réseaux de ce VPC, cliquez sur le menu déroulant à droite de Change to: n'a montré qu'une seule option, celle déjà sélectionnée, rtb-xxxxxxxx. Après avoir cliqué sur le lien vers cette table de routage et cliqué sur l'onglet Routes à côté de Summary, je vois ceci:

enter image description here

Que puis-je faire de mal qui bloque l'accès de la fonction Lambda à Internet?

12
Pat Needham

Pour que Lambda ait accès à Internet via VPC, il doit se trouver dans le Private Subnet avec NAT Gateway attaché.

Selon vos captures d'écran, la table de routage attachée au sous-réseau a igw-xxxxxxx attaché faisant de votre sous-réseau actuel un public subnet.

Donc, pour faire fonctionner les choses, vous pouvez faire ce qui suit:

  • Attacher NAT Gateway au lieu de igw-xxxxxx dans la table de routage de votre subnet actuel

OU

  • Trouvez ENI attaché à votre Lambda et attachez Elastic IP si vous souhaitez avoir accès à Internet.

OU

Selon @John Rotenstein, si votre Lambda n'a pas besoin de ressources VPC, vous pouvez déplacer Lambda hors du VPC

14
Navpreet Singh

Hé les gars, j'ai développé un tutoriel étape par étape avec des captures d'écran explicites à ce sujet:

Partie I

  1. Créer une fonction lambda dans AWS
  2. Créez une passerelle API pour rediriger toutes les demandes vers votre fonction AWS Lambda

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step -by-ec7ce38e18be

Deuxieme PARTIE

  1. Configurer un VPC pour votre fonction lambda
  2. Accordez un accès Internet à la fonction lambda de manière sécurisée
  3. Déployez l'API Restode Node.js dans votre fonction Lambda

https://medium.com/@shontauro/how-can-i-turn-my-restful-api-into-a-serverless-application-and-deploy-it-to-aws-lambda-step -by-8ff6cc97780f

4
shontauro

La configuration de l'accès Internet AWS Lambda en mode VPC est délicate car aucune documentation AWS appropriée n'est fournie du côté AWS, j'ai lu ce texte plusieurs fois https://aws.Amazon.com/premiumsupport/ centre de connaissances/fonction-accès-lambda / mais n'a pas joint la vidéo YouTube. Après tant de R&D, je peux résumer car les étapes ci-dessous sont nécessaires pour configurer AWS Lambda en mode VPC

- Route Tables two router
    - One for EC2 - EC2_ROUTER
    - Another for AWS Lambda - AWS_Lambda_ROUTER
- Create an Internet Gateway
    - Add 0.0.0.0/0 rule in EC2_ROUTER for target igw-xxxxx
    - This will create public subnet and give INTERNET access for EC2

- Create a NATGateway with public subnet which has igw-xxxxx as target
- Create a private subnet which and attach to AWS_Lambda_ROUTER, with target 0.0.0.0/0 as nat-xxxxxxx
- Select VPC for AWS Lambda
- Select a/all private subnet which is private having NAT Gateway for all traffic 0.0.0.0/0

all done, go ahead and enjoy

Remarque

  • NATGateway est requis lors de l'accès à une API publique autre qu'AWS
  • Il existe des points de terminaison AWS pour les services AWS internes, et on peut attacher des points de terminaison AWS dans AWS_Lambda_ROUTER en créant

Accès Internet dans AWS Lambda -> Sous-réseau privé avec NATGateway -> NATGateway est dans un sous-réseau public avec Internet Gateway qui accède à AWS Lambda.

[~ # ~] ps [~ # ~]

Je n'ai aucune idée pourquoi AWS Lambda ne peut pas avoir accès à INTERNET via InternetGateway pourquoi il a besoin de NATGateway

0
Ramratan Gupta