Cet article démontre le développement d'une API sans serveur utilisant les services AWS et établit un pipeline d'intégration continue/déploiement continu (CICD) dans l'environnement AWS.
Partie 1 : explore la création d'une fonction Lambda pour gérer les requêtes de la passerelle API et conserver les données dans DynamoDB à l'aide du modèle d'application sans serveur.
Partie 2 : détaille les étapes nécessaires pour configurer un référentiel CodeCommit dans AWS et configurer un pipeline CICD qui lance automatiquement un processus de génération lors de la soumission de nouvelles modifications au référentiel.
Pour ce projet, vous aurez besoin d'un compte AWS (l'offre gratuite est suffisante). Les composants AWS suivants seront utilisés :
Assurez-vous que votre environnement de développement local est configuré comme suit :
Installer AWS CLI : suivez le guide ici pour installer l'AWS Command Line Interface.
Installez AWS SAM (Serverless Application Model) : installez SAM CLI en suivant les instructions ici .
Choisissez un IDE : utilisez IntelliJ ou un IDE similaire pour le développement. Je préfère IntelliJ
Maven pour l'empaquetage : assurez-vous que Maven est installé pour empaqueter votre application.
Facultatif : Docker (si vous devez tester les fonctions Lambda localement) : installez Docker si vous prévoyez de tester les fonctions Lambda localement.
Ces outils et composants constitueront la base du projet.
Dans cette section, nous verrons le processus de création d'un projet de démarrage à l'aide d'AWS SAM, y compris la réalisation de la classe de gestionnaire, la création, le déploiement sur AWS et la réalisation de tests à l'aide de Postman.
Configuration de l'environnement
Configuration AWS :
Accédez à la console AWS à l' adresse https://aws.amazon.com/console/ , connectez-vous à l'aide de vos informations d'identification d'utilisateur administrateur.
Configurez l'AWS CLI sur la machine locale :
$ aws configure
Initialisez un projet à l'aide d'AWS Serverless Application Model (SAM) :
$ sam init
Renommer le projet : renommez le projet selon votre nom préféré.
Ouvrez le projet dans IntelliJ : Lancez IntelliJ et ouvrez le projet.
Ajouter des dépendances à pom.xml :
Ajoutez les dépendances nécessaires au fichier pom.xml
. Il vous suffit d'ajouter DynamoDB, car les autres dépendances seront automatiquement incluses par SAM.
<dependencies> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-core</artifactId> <version>1.2.2</version> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-lambda-java-events</artifactId> <version>3.11.0</version> </dependency> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.13.2</version> <scope>test</scope> </dependency> <dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-dynamodb</artifactId> <version>1.12.573</version> </dependency> </dependencies>
Écrire la classe du gestionnaire
Pour la fonction lambda, modifiez la classe de gestionnaire générée automatiquement par sam et ajoutez le code suivant : c'est un code simple, et pour de vrais projets, vous souhaiterez peut-être utiliser un code plus modulaire.
public class UserRequestHandler implements RequestHandler<Map<String,String>, Map<String,String>> { private AmazonDynamoDB amazonDynamoDB; private String DYNAMODB_TABLE_NAME = "users"; private Regions REGION = Regions.US_EAST_1; @Override public Map<String,String> handleRequest(Map<String,String> input, Context context) { this.initDynamoDbClient(); LambdaLogger logger = context.getLogger(); logger.log("Input payload:" + input.toString()); String userId = UUID.randomUUID().toString(); String firstName= input.get("firstName"); String lastName= input.get("lastName"); Map<String, AttributeValue> attributesMap = new HashMap<>(); attributesMap.put("id", new AttributeValue(userId)); attributesMap.put("firstName", new AttributeValue(firstName)); attributesMap.put("lastName", new AttributeValue(lastName)); logger.log(attributesMap.toString()); amazonDynamoDB.putItem(DYNAMODB_TABLE_NAME, attributesMap); Map<String, String> response = new HashMap<>(); response.put("id", userId); response.put("firstName", firstName); response.put("lastName", lastName); return response; } private void initDynamoDbClient() { this.amazonDynamoDB = AmazonDynamoDBClientBuilder.standard() .withRegion(REGION) .build(); } }
Mettre à jour le fichier de modèle SAM
Le fichier modèle SAM joue un rôle central dans la création et le déploiement des modifications sur AWS. Mettez à jour le fichier du projet. Les éléments clés sur lesquels se concentrer dans ce fichier sont les noms des fonctions Lambda et les points de terminaison API Gateway. Ils sont au cœur des fonctionnalités de votre application sans serveur.
AWSTemplateFormatVersion: '2010-09-09' Transform: AWS::Serverless-2016-10-31 Description: > pc-aws-user-api Sample SAM Template for pc-aws-user-api # More info about Globals: https://github.com/awslabs/serverless-application-model/blob/master/docs/globals.rst Globals: Function: Timeout: 20 MemorySize: 128 Tracing: Active Api: TracingEnabled: true Resources: UserRequestHandlerLambdaFunction: Type: AWS::Serverless::Function # More info about Function Resource: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#awsserverlessfunction Properties: CodeUri: PcAwsUsersApi Handler: com.pc.aws.users.UserRequestHandler::handleRequest Runtime: java11 Architectures: - x86_64 MemorySize: 512 Environment: # More info about Env Vars: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#environment-object Variables: PARAM1: VALUE JAVA_TOOL_OPTIONS: -XX:+TieredCompilation -XX:TieredStopAtLevel=1 # More info about tiered compilation https://aws.amazon.com/blogs/compute/optimizing-aws-lambda-function-performance-for-java/ Events: PcUsers: Type: Api # More info about API Event Source: https://github.com/awslabs/serverless-application-model/blob/master/versions/2016-10-31.md#api Properties: Path: /users Method: post ApplicationResourceGroup: Type: AWS::ResourceGroups::Group Properties: Name: Fn::Sub: ApplicationInsights-SAM-${AWS::StackName} ResourceQuery: Type: CLOUDFORMATION_STACK_1_0 ApplicationInsightsMonitoring: Type: AWS::ApplicationInsights::Application Properties: ResourceGroupName: Ref: ApplicationResourceGroup AutoConfigurationEnabled: 'true' Outputs: # ServerlessRestApi is an implicit API created out of Events key under Serverless::Function # Find out more about other implicit resources you can reference within SAM # https://github.com/awslabs/serverless-application-model/blob/master/docs/internals/generated_resources.rst#api PcAwsUsersApi: Description: API Gateway endpoint URL for Prod stage Value: !Sub "https://${ServerlessRestApi}.execute-api.${AWS::Region}.amazonaws.com/Prod/users/" UserRequestHandlerLambdaFunction: Description: Lambda Function ARN Value: !GetAtt UserRequestHandlerLambdaFunction.Arn UserRequestHandlerLambdaFunctionIamRole: Description: Implicit IAM Role created Value: !GetAtt UserRequestHandlerLambdaFunctionRole.Arn
Créer et déployer du code à l'aide de SAM
Dans IntelliJ, ouvrez le terminal et exécutez les commandes suivantes :
$ sam build
$ sam deploy –guided
Lorsque vous y êtes invité, fournissez le nom de la pile comme « PcAwsUsersApi » et choisissez les options par défaut.
Le résultat présentera la pile CloudFormation qui a été créée et fournira également le point de terminaison API Gateway.
Testez l'API
Avant de tester l'API, accordez à DynamoDB l'accès au rôle Lambda créé par SAM.
Cette étape garantit que la fonction Lambda dispose des autorisations nécessaires pour interagir avec DynamoDB.
Accédez à API Gateway, puis suivez ces étapes pour obtenir l'URL de votre service :
Accédez à API Gateway dans la console AWS.
Sélectionnez votre API.
Dans la barre latérale gauche, cliquez sur « Étapes ».
Sous « Étapes », sélectionnez l'étape « Prod ».
Dans la section Stage Editor, vous trouverez « Invoke URL ». Copiez cette URL.
Content-Type: application/json
).
Dans cette section, nous montrerons comment créer un pipeline CICD à l'aide d'AWS CodeCommit, CodeBuild et CodePipeline. Le pipeline lancera un processus de construction qui récupère le code du référentiel, le construit à l'aide du fichier de construction et déclenche CloudFormation pour créer la pile.
Créer un référentiel CodeCommit
Connectez-vous à AWS et recherchez le service CodeCommit.
Créez un nouveau référentiel dans AWS CodeCommit pour stocker le code source de votre projet.
Valider le code dans le référentiel
Dans IntelliJ, ouvrez le terminal et entrez les commandes suivantes pour valider le code créé à l'étape I
$ git init → This initialize local git $ git add . → This will stage files $ git commit -m "commit to CodeCommit"
Transférer les modifications au dépôt distant
Copiez l'URL du dépôt CodeCommit à partir de la console AWS.
$ git remote add origin <repo URL> $ git push --set-upstream origin master --> This will prompt for user/password
Créer un projet AWS CodeBuild
Configurez un projet CodeBuild qui spécifie comment générer votre application. Cela inclut la définition des environnements de construction, des commandes de construction et des dépendances.
Pour configurer CodeBuild, vous devrez créer un fichier de spécification de build nommé buildspec.yml
dans le répertoire de votre projet. Ce fichier contiendra les commandes de construction et les instructions pour CodeBuild.
Vous pouvez vous référer à la documentation officielle ici pour obtenir des instructions détaillées sur la création d'un fichier buildspec.yml
.
version: 0.2 phases: install: runtime-versions: java: corretto11 pre_build: commands: - echo Nothing to do in the pre_build phase... build: commands: - echo Build started on `date` - sam build - sam package --output-template-file pcoutputtemplate.yaml --s3-bucket com-appsdev-pc-001 post_build: commands: - echo Build completed on `date` artifacts: files: - pcoutputtemplate.yaml
Poussez le nouveau fichier vers le référentiel depuis le local.
Après cela, vous pouvez créer le projet pour voir si le code est extrait du dépôt et si les artefacts sont créés.
Créer un CodePipeline
Le pipeline créera et déploiera automatiquement le code basé sur le commit git.
Testez le pipeline
$ git branch CR01 $ git checkout CR01 $ git add . $ git commit -m “CR01” $ git push --set-upstream origin CR01 You cand also create a pull request in aws code commit, just for simplicity I am merging from local $ git checkout master $ git merge --ff-only CR01 $ git push
Cela simulera le processus de modification de votre code, de transmission vers le référentiel et de déclenchement et de déploiement automatiques du pipeline CICD par le code mis à jour.
En exploitant AWS API Gateway, Lambda, DynamoDB, CodeCommit, CodeBuild et CodePipeline, l'article montre comment concevoir un processus de déploiement résilient et automatisé.
Merci pour la lecture. Que vos efforts sans serveur soient couronnés de succès et d’innovation !