Déploiement de fonctions Lambda avec le AWS CDK - AWS Lambda

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

Déploiement de fonctions Lambda avec le AWS CDK

AWS Cloud Development Kit (AWS CDK) Il s'agit d'un framework d'infrastructure en tant que code (IaC) que vous pouvez utiliser pour définir une infrastructure AWS cloud en utilisant le langage de programmation de votre choix. Pour définir votre propre infrastructure cloud, vous devez d'abord écrire une application (dans CDK l'une des langues prises en charge) contenant une ou plusieurs piles. Ensuite, vous le synthétisez dans un AWS CloudFormation modèle et déployez vos ressources sur votre Compte AWS. Suivez les étapes décrites dans cette rubrique pour déployer une fonction Lambda qui renvoie un événement depuis un point de terminaison Amazon API Gateway.

La bibliothèque AWS Construct, incluse dans leCDK, fournit des modules que vous pouvez utiliser pour modéliser les ressources qui Services AWS fournissent. Pour les services populaires, la bibliothèque fournit des constructions organisées avec des valeurs par défaut intelligentes et les bonnes pratiques. Vous pouvez utiliser le module aws_lambda pour définir votre fonction et les ressources de support en quelques lignes de code.

Prérequis

Avant de commencer ce didacticiel, installez le AWS CDK en exécutant la commande suivante.

npm install -g aws-cdk

Étape 1 : Configurez votre AWS CDK projet

Créez un répertoire pour votre nouvelle AWS CDK application et initialisez le projet.

JavaScript
mkdir hello-lambda cd hello-lambda cdk init --language javascript
TypeScript
mkdir hello-lambda cd hello-lambda cdk init --language typescript
Python
mkdir hello-lambda cd hello-lambda cdk init --language python

Une fois le projet démarré, activez l'environnement virtuel du projet et installez les dépendances de base pour AWS CDK.

source .venv/bin/activate python -m pip install -r requirements.txt
Java
mkdir hello-lambda cd hello-lambda cdk init --language java

Importez ce projet Maven dans votre environnement de développement intégré Java (IDE). Par exemple, dans Eclipse, choisissez Fichier, Import, Maven, Existing Maven Projects.

C#
mkdir hello-lambda cd hello-lambda cdk init --language csharp
Note

Le modèle AWS CDK d'application utilise le nom du répertoire du projet pour générer des noms pour les classes et les fichiers sources. Dans cet exemple, le répertoire est nommé hello-lambda. Si vous utilisez un nom répertoire différent, votre application ne correspondra pas à ces instructions.

AWS CDK v2 inclut des constructions stables pour tous Services AWS dans un seul package appeléaws-cdk-lib. Ce package est installé en tant que dépendance lorsque vous initialisez le projet. Lorsque vous travaillez avec certains langages de programmation, le package est installé lorsque vous créez le projet pour la première fois.

Étape 2 : définir la AWS CDK pile

Une CDK pile est un ensemble d'une ou plusieurs constructions qui définissent les AWS ressources. Chaque CDK pile représente une AWS CloudFormation pile dans votre CDK application.

Pour définir votreCDK, Stack, suivez les instructions de votre langage de programmation préféré. Cette pile définit les éléments suivants :

  • Nom logique de la fonction : MyFunction

  • Emplacement du code de fonction, spécifié dans la code propriété. Pour plus d'informations, consultez la section Code du gestionnaire dans la AWS Cloud Development Kit (AWS CDK) APIréférence.

  • Le nom logique REST API est le suivant : HelloApi

  • Nom logique du point de terminaison API Gateway : ApiGwEndpoint

Notez que toutes les CDK piles de ce didacticiel utilisent le runtime Node.js pour la fonction Lambda. Vous pouvez utiliser différents langages de programmation pour la CDK pile et la fonction Lambda afin de tirer parti des points forts de chaque langage. Par exemple, vous pouvez utiliser TypeScript for the CDK stack pour tirer parti des avantages du typage statique pour votre code d'infrastructure. Vous pouvez utiliser la fonction Lambda JavaScript pour tirer parti de la flexibilité et du développement rapide d'un langage typé dynamiquement.

JavaScript

Ouvrez le fichier lib/hello-lambda-stack.js et remplacez le contenu par ce qui suit.

const { Stack } = require('aws-cdk-lib'); const lambda = require('aws-cdk-lib/aws-lambda'); const apigw = require('aws-cdk-lib/aws-apigateway'); class HelloLambdaStack extends Stack { /** * * @param {Construct} scope * @param {string} id * @param {StackProps=} props */ constructor(scope, id, props) { super(scope, id, props); const fn = new lambda.Function(this, 'MyFunction', { code: lambda.Code.asset('lib/lambda-handler'), runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler' }); const endpoint = new apigw.LambdaRestApi(this, 'MyEndpoint', { handler: fn, restApiName: "HelloApi" }); } } module.exports = { HelloLambdaStack }
TypeScript

Ouvrez le fichier lib/hello-lambda-stack.ts et remplacez le contenu par ce qui suit.

import * as cdk from 'aws-cdk-lib'; import { Construct } from 'constructs'; import * as apigw from "aws-cdk-lib/aws-apigateway"; import * as lambda from "aws-cdk-lib/aws-lambda"; import * as path from 'node:path'; export class HelloLambdaStack extends cdk.Stack { constructor(scope: Construct, id: string, props?: cdk.StackProps){ super(scope, id, props) const fn = new lambda.Function(this, 'MyFunction', { runtime: lambda.Runtime.NODEJS_LATEST, handler: 'index.handler', code: lambda.Code.fromAsset(path.join(__dirname, 'lambda-handler')), }); const endpoint = new apigw.LambdaRestApi(this, `ApiGwEndpoint`, { handler: fn, restApiName: `HelloApi`, }); } }
Python

Ouvrez le fichier /hello-lambda/hello_lambda/hello_lambda_stack.py et remplacez le contenu par ce qui suit.

from aws_cdk import ( Stack, aws_apigateway as apigw, aws_lambda as _lambda ) from constructs import Construct class HelloLambdaStack(Stack): def __init__(self, scope: Construct, construct_id: str, **kwargs) -> None: super().__init__(scope, construct_id, **kwargs) fn = _lambda.Function( self, "MyFunction", runtime=_lambda.Runtime.NODEJS_LATEST, handler="index.handler", code=_lambda.Code.from_asset("lib/lambda-handler") ) endpoint = apigw.LambdaRestApi( self, "ApiGwEndpoint", handler=fn, rest_api_name="HelloApi" )
Java

Ouvrez le fichier /hello-lambda/src/main/java/com/myorg/HelloLambdaStack.java et remplacez le contenu par ce qui suit.

package com.myorg; import software.constructs.Construct; import software.amazon.awscdk.Stack; import software.amazon.awscdk.StackProps; import software.amazon.awscdk.services.apigateway.LambdaRestApi; import software.amazon.awscdk.services.lambda.Function; public class HelloLambdaStack extends Stack { public HelloLambdaStack(final Construct scope, final String id) { this(scope, id, null); } public HelloLambdaStack(final Construct scope, final String id, final StackProps props) { super(scope, id, props); Function hello = Function.Builder.create(this, "MyFunction") .runtime(software.amazon.awscdk.services.lambda.Runtime.NODEJS_LATEST) .code(software.amazon.awscdk.services.lambda.Code.fromAsset("lib/lambda-handler")) .handler("index.handler") .build(); LambdaRestApi api = LambdaRestApi.Builder.create(this, "ApiGwEndpoint") .restApiName("HelloApi") .handler(hello) .build(); } }
C#

Ouvrez le fichier src/HelloLambda/HelloLambdaStack.cs et remplacez le contenu par ce qui suit.

using Amazon.CDK; using Amazon.CDK.AWS.APIGateway; using Amazon.CDK.AWS.Lambda; using Constructs; namespace HelloLambda { public class HelloLambdaStack : Stack { internal HelloLambdaStack(Construct scope, string id, IStackProps props = null) : base(scope, id, props) { var fn = new Function(this, "MyFunction", new FunctionProps { Runtime = Runtime.NODEJS_LATEST, Code = Code.FromAsset("lib/lambda-handler"), Handler = "index.handler" }); var api = new LambdaRestApi(this, "ApiGwEndpoint", new LambdaRestApiProps { Handler = fn }); } } }

Étape 3 : Création du code de fonction Lambda

  1. À partir de la racine de votre projet (hello-lambda), créez le /lib/lambda-handler répertoire pour le code de la fonction Lambda. Ce répertoire est spécifié dans la code propriété de votre AWS CDK pile.

  2. Créez un nouveau fichier appelé index.js dans le /lib/lambda-handler répertoire. Collez le code suivant dans le fichier. La fonction extrait des propriétés spécifiques de la API demande et les renvoie sous forme de JSON réponse.

    exports.handler = async (event) => { // Extract specific properties from the event object const { resource, path, httpMethod, headers, queryStringParameters, body } = event; const response = { resource, path, httpMethod, headers, queryStringParameters, body, }; return { body: JSON.stringify(response, null, 2), statusCode: 200, }; };

Étape 4 : Déployer la AWS CDK pile

  1. À la racine de votre projet, exécutez la commande cdk synth :

    cdk synth

    Cette commande synthétise un AWS CloudFormation modèle à partir de votre CDK pile. Le modèle est un YAML fichier d'environ 400 lignes, similaire au suivant.

    Note

    Si le message d'erreur suivant s'affiche, assurez-vous que vous êtes bien à la racine du répertoire de votre projet.

    --app is required either in command-line, in cdk.json or in ~/.cdk.json
    Exemple AWS CloudFormation modèle
    Resources: MyFunctionServiceRole3C357FF2: Type: AWS::IAM::Role Properties: AssumeRolePolicyDocument: Statement: - Action: sts:AssumeRole Effect: Allow Principal: Service: lambda.amazonaws.com Version: "2012-10-17" ManagedPolicyArns: - Fn::Join: - "" - - "arn:" - Ref: AWS::Partition - :iam::aws:policy/service-role/AWSLambdaBasicExecutionRole Metadata: aws:cdk:path: HelloLambdaStack/MyFunction/ServiceRole/Resource MyFunction1BAA52E7: Type: AWS::Lambda::Function Properties: Code: S3Bucket: Fn::Sub: cdk-hnb659fds-assets-${AWS::AccountId}-${AWS::Region} S3Key: ab1111111cd32708dc4b83e81a21c296d607ff2cdef00f1d7f48338782f92l3901.zip Handler: index.handler Role: Fn::GetAtt: - MyFunctionServiceRole3C357FF2 - Arn Runtime: nodejs20.x ...
  2. Exécutez la commande cdk deploy :

    cdk deploy

    Patientez pendant que vos ressources sont créées. Le résultat final inclut le point URL de terminaison de votre API passerelle. Exemple :

    Outputs: HelloLambdaStack.ApiGwEndpoint77F417B1 = https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/

Étape 5 : tester la fonction

Pour appeler la fonction Lambda, copiez le point de terminaison API Gateway et collez-le dans un navigateur Web ou exécutez une curl commande :

curl -s https://abcd1234.execute-api.us-east-1.amazonaws.com/prod/

La réponse est une JSON représentation des propriétés sélectionnées à partir de l'objet d'événement d'origine, qui contient des informations sur la demande envoyée au point de terminaison de la API passerelle. Exemple :

{ "resource": "/", "path": "/", "httpMethod": "GET", "headers": { "Accept": "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7", "Accept-Encoding": "gzip, deflate, br, zstd", "Accept-Language": "en-US,en;q=0.9", "CloudFront-Forwarded-Proto": "https", "CloudFront-Is-Desktop-Viewer": "true", "CloudFront-Is-Mobile-Viewer": "false", "CloudFront-Is-SmartTV-Viewer": "false", "CloudFront-Is-Tablet-Viewer": "false", "CloudFront-Viewer-ASN": "16509", "CloudFront-Viewer-Country": "US", "Host": "abcd1234.execute-api.us-east-1.amazonaws.com", ...

Étape 6 : Nettoyer vos ressources

Le point de terminaison API Gateway est accessible au public. Pour éviter des frais inattendus, exécutez la commande cdk destroy pour supprimer la pile et toutes les ressources associées.

cdk destroy

Étapes suivantes

Pour plus d'informations sur l'écriture d' AWS CDK applications dans la langue de votre choix, consultez les rubriques suivantes :

TypeScript

Travailler avec le AWS CDK in TypeScript

JavaScript

Travailler avec le AWS CDK in JavaScript

Python

Travailler avec le AWS CDK en Python

Java

Travailler avec le AWS CDK en Java

C#

Travailler avec le AWS CDK en C#

Go

Travailler avec AWS CDK In Go