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

Date de la dernière mise à jour : 30/07/2019

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

Brève description

Étant donné que Lambda ne prend actuellement pas en charge les VPC de location dédiée en cours d’exécution, vous devez appairer les VPC de location dédiée à un VPC de location par défaut qui contient votre fonction Lambda. Pour plus d'informations sur Amazon Elastic Compute Cloud (Amazon EC2), la location d'instance et les VPC, consultez Principes de base des instances dédiées.

Important : cet article suppose que vous maîtrisez Node.js et que vous savez créer une fonction Lambda. 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.

Solution

Créer et configurer les VPC

1.    Dans la console Amazon VPC, créez un VPC. Pendant la création, pour le bloc CIDR IPv4, saisissez 12.0.0.0/16. Pour Tenancy (Location), sélectionnez Default (Par défaut).

2.    Créez un autre VPC. Pendant la création, pour le bloc CIDR IPv4, saisissez 11.0.0.0/16. Pour Tenancy (Location), choisissez Dédié.

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

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 Tester la connectivité. Pour plus d'informations, consultez Activation de l'accès Internet.

4.    Créer des sous-réseaux dans chacun de vos VPC. Pour votre VPC de location par défaut (auquel vous accèderez avec votre fonction Lambda), créez au moins deux sous-réseaux dans différentes zones de disponibilité. Il s'agit d'une bonne pratique pour la redondance et pour que Lambda puisse fournir une haute disponibilité pour votre fonction.

Remarque : si vous créez un seul sous-réseau dans un VPC, vous pouvez utiliser le même bloc CIDR que le VPC. Pour plusieurs sous-réseaux dans chaque VPC, utilisez un sous-ensemble du bloc CIDR du 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é ici. Pour plus d'informations, consultez Ajout et retrait de routes d'une table de routage.

Pour les valeurs Target (Cible) commençant par pcx-..., choisissez Peering Connection (Connexion d’appairage), puis la connexion d'appairage de que vous avez créée.
Pour les valeurs Target (Cible) commençant par igw-..., choisissez Internet Gateway (Passerelle Internet), puis la passerelle Internet que vous avez créée.

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

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 Amazon VPC Access, 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 (Étape suivante : autorisations).

4.    Sous Attach permissions policies (Associer des stratégies d'autorisations), recherchez AWSLambdaVPCAccessExecutionRole. Sélectionnez la stratégie portant ce nom, puis choisissez Next: Tags (Étape suivante : balises).

5.    (Facultatif) Ajoutez des balises à vos préférences.

6.    Sous Review (Vérification), procédez comme suit :
Pour Role name (Nom du rôle), saisissez un nom pour ce rôle d'exécution Lambda. Par exemple, lambda_vpc_basic_execution.
(Facultatif) Pour le champ Role description (Description du rôle), modifiez la description selon vos préférences.
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. Veillez à :

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

Pour tester la fonction, voici quelques exemples de code 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, dans le volet Navigation, sous Network (Réseau), 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 la section 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. Pour vous connecter à ce dernier 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.

Important : 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 (ACL) réseau des deux VPC autorisent le trafic sur le port que vous testez (80) et pour le groupe de sécurité de votre instance EC2 dédiée.

3.    Connectez-vous à l’instance EC2.

4.    Lancez un serveur HTTP sur votre instance EC2 en exécutant la commande suivante :

# 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 le code JSON ci-dessous pour votre événement, en remplaçant yourHost par l'adresse IP ou le nom d'hôte de votre instance EC2.

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

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

7.    Vérifiez que la connexion a abouti en recherchant dans les informations du résultat de l'exécution un code de réponse 200 comme ci-dessous :

{
  "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.