Comment connecter une fonction Lambda à un VPC dédié ?

Date de la dernière mise à jour : 28/04/2021

Je souhaite connecter une fonction AWS Lambda à des ressources dédiées dans un Virtual Private Cloud (VPC). Comment procéder ?

Brève description

Lambda ne prend pas en charge les fonctions d'exécution dans les VPC de location dédiée. Pour connecter une fonction Lambda à un VPC dédié, appariez d'abord le VPC dédié à un VPC de location par défaut contenant la fonction.

La solution nécessite d'utiliser une instance dédiée Amazon Elastic Compute Cloud (Amazon EC2). Notez que votre compte AWS entraîne des frais pour cette instance. Pour plus d'informations sur la location d'instance Amazon EC2 et les VPC, consultez Principes de base des instances dédiées.

Solution

Remarque : la procédure suivante nécessite que vous compreniez Node.js et comment créer une fonction Lambda.

Créer et configurer un VPC de location par défaut et un VPC de location dédiée

Remarque : si vous décidez d'utiliser des blocs CIDR différents de ceux fournis, veillez à ce que les deux VPC aient des blocs différents qui ne se chevauchent pas.

1.    Dans la console Amazon VPC, créez un VPC de location par défaut avec les paramètres suivants :
Pour le bloc CIDR IPv4, entrez 12.0.0.0/16.
Dans le champ Tenancy (Location), sélectionnez Default (Par défaut).

2.    Créez un VPC de location dédiée avec les paramètres suivants :
Pour le bloc CIDR IPv4, entrez 11.0.0.0/16.
Pour Tenancy (Location), choisissez Dedicated (Dédiée).

3.    Créez une passerelle Internet, puis associez-la à votre VPC de location dédiée.
Remarque : la passerelle Internet est nécessaire au serveur HTTP que vous allez créer dans la section Tester la connectivité. Pour plus d'informations, consultez Activation de l'accès Internet.

4.    Créez des sous-réseaux dans chacun de vos VPC. Pour votre VPC de location par défaut, créez au moins deux sous-réseaux dans différentes zones de disponibilité.
Remarque : la création de plusieurs sous-réseaux dans différentes zones de disponibilité est une bonne pratique en matière de redondance. Cela permet également à Lambda d'offrir une haute disponibilité pour votre fonction. Pour plusieurs sous-réseaux dans chaque VPC, utilisez un sous-ensemble du bloc CIDR du VPC. Si vous créez un seul sous-réseau dans un VPC, vous pouvez utiliser le même bloc CIDR que le VPC. Pour plus d'informations, consultez Dimensionnement des VPC et des sous-réseaux pour IPv4.

5.    Créer une connexion d'appairage de VPC entre les deux VPC que vous avez créés. Sur la page Create Peering Connection (Créer une connexion d’appairage), procédez de la façon suivante :
(Facultatif) Pour Peering connection name tag (Balise de nom de connexion d’appairage), saisissez un nom pour la connexion d'appairage de VPC.
Pour VPC (Requester) (VPC (Demandeur)), choisissez le VPC de location par défaut que vous avez créé.
Pour Account (Compte), sélectionnez My account (Mon compte).
Pour Region (Région), sélectionnez This region (Cette région).
Pour VPC (Accepter) (VPC (Accepteur)), sélectionnez le VPC de location dédiée que vous avez créé.
Choisissez Create Peering Connection (Créer une connexion d’appairage).

6.    Acceptez la connexion d'appairage de VPC.

7.    Ajoutez des routes à chacune des tables de routage de votre nouveau VPC, comme illustré dans les exemples suivants. Lors de la création des tables de routage, assurez-vous que vous procédez comme suit :
Pour les valeurs Target (Cible) commençant par pcx-..., choisissez Peering Connection (Connexion d'appairage). Ensuite, choisissez la connexion d'appairage que vous avez créée.
Pour la valeur Target (Cible) commençant par igw-..., choisissez Internet Gateway (Passerelle Internet). Ensuite, choisissez la passerelle Internet que vous avez créée.

Pour plus d'informations, consultez Ajout et retrait de routes d'une table de routage.

Exemple de table de routage VPC de location par défaut

Destination

Cible

Statut

Propagé

12.0.0.0/16

Local Actif Non

11.0.0.0/16

pcx-1a2b3c4d5e6f7g8h9

Actif

Non

Exemple de table de routage VPC de location dédiée

Destination

Cible

Statut

Propagé

11.0.0.0/16

Local

Actif

Non

12.0.0.0/16

pcx-1a2b3c4d5e6f7g8h9

Actif

Non

0.0.0.0/0 igw-12345678a90b12c34 Actif Non

Créer un rôle d'exécution Lambda pour Amazon VPC

Remarque : si vous disposez déjà d'un rôle d'exécution Lambda pour accéder à Amazon VPC, ignorez cette section.

1.    Dans la console AWS Identity and Access Management (IAM), dans le volet de navigation de gauche, choisissez Roles (Rôles).

2.    Dans le volet Roles (Rôles), choisissez Create role (Créer un rôle).

3.    Sur la page Create role (Créer un rôle), procédez comme suit :
Dans la section Select type of trusted entity (Sélectionner le type d'entité de confiance), sélectionnez AWS service (Service AWS).
Dans la section Choose the service that will use this role (Choisir le service qui utilisera ce rôle), sélectionnez Lambda.
Sélectionnez Next: Permissions (Suivant : autorisations).

4.    Pour Attach permissions policies (Attacher les stratégies des autorisations), recherchez AWSLambdaVPCAccessExecutionRole. Sélectionnez la stratégie portant ce nom, puis sélectionnez Next: Tags (Suivant : balises).

5.    (Facultatif) Ajoutez des balises qui vous permettent d'identifier et d'organiser la nouvelle ressource.

6.    Pour Review (Vérification), saisissez les éléments suivants :
Pour Role name (Nom du rôle), saisissez un nom pour le rôle d'exécution Lambda. Par exemple, lambda_vpc_basic_execution.
(Facultatif) Pour Role description (Description du rôle), modifiez la description.
Sélectionnez Create role (Créer un rôle).

Créer une fonction Lambda pour les tests

Créez une nouvelle fonction à l'aide de la console Lambda ou en créant et chargeant votre propre package de déploiement. Lorsque vous créez la nouvelle fonction, assurez-vous que vous effectuez les opérations suivantes :

  • Créez la fonction dans la même région AWS que votre VPC de location par défaut.
  • Attachez le rôle d'exécution que vous avez créé (par exemple lambda_vpc_basic_execution) à la fonction.

Exemple de code de fonction qui utilise l'interface HTTP native dans Node.js

var http = require('http')
     
exports.handler = (event, context, callback) => {
    const options = {
        hostname: event.Host,
        port: event.Port
    }
    
    const response = {};
    
   http.get(options, (res) => {
        response.httpStatus = res.statusCode
        callback(null, response)
    }).on('error', (err) =>{
        callback(null, err.message);
    })
   
};

Connecter votre fonction Lambda à votre VPC

1.    Dans la console Lambda, sous l'onglet Configuration , choisissez VPC. Ensuite, choisissez Edit (Modifier) et procédez comme suit :
Pour Virtual Private Cloud (VPC), sélectionnez le VPC de location par défaut que vous avez créé.
Pour Subnets (Sous-réseaux), choisissez au moins deux sous-réseaux dans votre VPC.
Pour le champ Security groups (Groupes de sécurité), sélectionnez un groupe de sécurité.
Remarque : le groupe de sécurité par défaut est suffisant pour la plupart des cas d'utilisation. Pour plus d'informations, consultez Groupes de sécurité pour votre VPC.

2.    Sélectionnez Save (Enregistrer).

Tester la connectivité

1.    Lancez une instance EC2 dans votre VPC de location dédiée.
Remarque : pour vous connecter à l'instance EC2 ultérieurement, vous avez besoin d'une adresse IPv4 publique que vous pouvez attribuer lors de la configuration. Vous pouvez également associer une adresse IP Elastic à votre instance après la configuration. Vous devez choisir un type d'instance EC2 pris en charge comme instance dédiée. Notez que votre compte AWS entraîne des frais pour cette instance.

2.    Vérifiez que les listes de contrôle d'accès réseau (ACL) des deux VPC autorisent le trafic pour les éléments suivants :
Le port que vous testez (80).
Le groupe de sécurité de votre instance EC2 dédiée.

3.    Connectez-vous à l’instance EC2.

4.    Exécutez la commande suivante pour lancer un serveur HTTP sur votre instance EC2 :

# If python version is 2.x:
$ sudo python -m SimpleHTTPServer 80
# If python version is 3.x
$ sudo python -m http.server 80

5.    Dans la console Lambda, configurez un événement de test pour votre fonction. Utilisez l'exemple d'extrait de code JSON suivant pour votre événement :

Remarque : remplacez yourHost par l'adresse IP locale de votre instance EC2.

{
  "Host": "yourHost",
  "Port": 80
}

6.    Dans la console Lambda, sélectionnez Test.

7.    Dans Details (Détails), vérifiez le résultat de l'exécution d'un code de réponse 200 afin de confirmer que la connexion a réussi.

Exemple de code de réponse 200

{
  "statusCode": 200
}

Si la sortie de la fonction indique des valeurs non nulles pour les latences moyenne, maximale et minimale, cela implique que votre connexion d'appairage de VPC est correctement configurée.

Remarque : si Lambda expire, vérifiez que vos groupes de sécurité sont configurés correctement. Si vous obtenez une erreur ECONNREFUSED, vérifiez que votre serveur HTTP est en cours d'exécution.