X

đŸ€Ą AWS CDK 101 – đŸ€Ÿâ€â™‚ Utilisation de couches dans les fonctions Lambda et enregistrement de JSON dans S3


🔰 DĂ©butants qui dĂ©couvrent AWS CDK, veuillez consulter mes articles prĂ©cĂ©dents un par un dans cette sĂ©rie.

Si au cas oĂč vous auriez manquĂ© mon article prĂ©cĂ©dent, retrouvez-le avec les liens ci-dessous.

🔁 Message prĂ©cĂ©dent original sur 🔗 Dev Post

🔁 RepubliĂ© le post prĂ©cĂ©dent Ă  🔗 dev Ă  @aravindvcyber

Dans cet article, refactorisons l’une de nos fonctions lambda prĂ©cĂ©dentes qui crĂ©e un Ă©vĂ©nement directement avec le message complet reçu en ajoutant une configuration pour enregistrer le message rĂ©el reçu en premier dans s3 avant de crĂ©er un Ă©vĂ©nement.

Avantages de l’utilisation des couches lambda 🚿

Ce ne sont pas les seuls avantages, c’est juste ce que je viens d’observer dans mes dĂ©ploiements.

  • L’utilisation de couches lambda nous aide Ă  dĂ©ployer plus rapidement car la mĂȘme couche peut ĂȘtre attachĂ©e Ă  plusieurs fonctions.

  • En plus de cela, nous pouvons Ă©galement inclure nos modules personnalisĂ©s dans les couches lambda et les partager entre plusieurs fonctions.

  • Cela permet Ă©galement de patcher simplement ces modules sans redĂ©ployer toutes les fonctions.

Projet de construction 🏗

Comme nous l’avons mentionnĂ© prĂ©cĂ©demment, nous essayons Ă©galement d’enregistrer un JSON dans s3, ce qui crĂ©era Ă  l’intĂ©rieur de notre pile. Pour enregistrer n’importe quel objet dans s3, nous avons besoin de deux choses comme suit.

  • Un nom de compartiment pour enregistrer notre message
  • Une clĂ©/identifiant d’objet pour le rĂ©fĂ©rer Ă  un emplacement spĂ©cifique.

CrĂ©ation de bucket S3 💊

Commençons par créer un compartiment S3, en ajoutant les lignes ci-dessous dans notre pile de courrier lib/common-event-stack.ts.

const stgMsgBucket = new s3.Bucket(this, 'stg-msg-bucket',{
      bucketName: 'stg-msg-bucket',
      encryption: s3.BucketEncryption.S3_MANAGED,
      removalPolicy: RemovalPolicy.RETAIN
});

Vous constaterez peut-ĂȘtre que nous avons nommĂ© notre seau unique avec le nom stg-msg-bucket avec la stratĂ©gie de chiffrement gĂ©rĂ©e par S3, comme indiquĂ© ci-dessus.

Octroi de la fonction put Object to handler 🔑

stgMsgBucket.grantWrite(eventCounterBus.handler);

Changements Ă  l’intĂ©rieur de notre fonction lambda ✂

Dans notre lambda, ajoutons les importations ci-dessous comme suit.

import { S3 } from "aws-sdk";
import { PutObjectOutput } from "aws-sdk/clients/s3";
const s3 = new S3({ region: "ap-south-1" });

fonction d’assistance putObject 💉

J’ai crĂ©Ă© la fonction d’assistance ci-dessous Ă  l’intĂ©rieur du lambda pour nous aider Ă  mettre un objet dans S3.

const save = async (uploadParams: S3.PutObjectRequest) => {
  let putResult: PromiseResult<PutObjectOutput, AWSError> | undefined =
    undefined;
  try {
    putResult = await s3.putObject(uploadParams).promise();
  } catch (e) {
    console.log(e);
  } finally {
    console.log(putResult);
    return putResult;
  }
};

GĂ©nĂ©ration de l’objet uploadParams 🔆

À l’intĂ©rieur de notre lambda, ajoutons les instructions ci-dessous Ă  l’intĂ©rieur de l’instruction try avant de publier le msg objet dans le nouveau pont d’évĂ©nement mettre l’évĂ©nement.


const uploadParams: S3.PutObjectRequest = {
      Bucket: message.bucket,
      Key: message.key,
      Body: JSON.stringify(message),
      ContentType: "application/json",
};

Appel de la fonction d’aide Ă  la sauvegarde đŸ”±

const putResult: PromiseResult<PutObjectOutput, AWSError> | undefined =
      await save(uploadParams);

Ajout du rĂ©sultat putObject Ă  notre message 👓

message.putStatus = putResult;
const msg: string = JSON.stringify({ message });

PropriĂ©tĂ©s supplĂ©mentaires pour saisir le message 🔧

Dans ce bloc de code ci-dessus, nous avons utilisé le nom du compartiment et la clé du compartiment, voyons comment nous définissons ces propriétés ci-dessous.

message.key = `uploads/${message.uuid}.json`;
message.bucket = process.env.BucketName || "";

GĂ©nĂ©ration Uuid đŸ”„

Ici, vous remarquerez peut-ĂȘtre que nous avons une propriĂ©tĂ© UUID attachĂ©e au message d’entrĂ©e. Dans le code ci-dessous, nous allons gĂ©nĂ©rer l’UUID.


message.uuid = getUuid();

Ce getUuid vient de la uuid module exporté qui est disponible dans le /opt/uuid chemin.

Importation de la fonction utils Ă  partir du calque ⚙

const { getUuid } = require("/opt/utils");

Mais comment fait-on pour obtenir le module du /opt/* dossier? Le dossier opt est le chemin extrait provenant des couches lambda car c’est le seul moyen d’obtenir les modules tiers dans la fonction lambda en les important.

CrĂ©er une nouvelle couche lambda ☄

Étapes pour crĂ©er un nouveau calque.

  • CrĂ©ez un nouveau dossier reprĂ©sentant votre nom de couche layers/utils
  • Dans ce dossier crĂ©er un nouveau dossier nodejs
  • Dans ce sous-dossier, exĂ©cutez npm init -y
  • Nous allons maintenant obtenir un package * fichiers .json
  • Utiliser npm install --save uuidcela installe notre module tiers.
  • CrĂ©ons ensuite un nouveau fichier nommĂ© utils.js et ajoutez les lignes ci-dessous
const {v4:uuidv4} = require('uuid');
exports.getUuid = ()=> {
    return uuidv4();
}

dĂ©claration de crĂ©ation de couche Ă  l’intĂ©rieur de la pile ⚖

Nous devons maintenant ajouter l’instruction ci-dessous dans notre pile principale pour crĂ©er un calque comme suit.

const nodejsUtils = new lambda.LayerVersion(this, `nodejsUtils`, {
      removalPolicy: RemovalPolicy.DESTROY,
      code: lambda.Code.fromAsset('layers/utils'),
      compatibleArchitectures: [lambda.Architecture.X86_64],
      compatibleRuntimes: [lambda.Runtime.NODEJS_14_X]
});

Vous pouvez constater que nous avons spĂ©cifiĂ© le temps d’exĂ©cution et les architectures de maniĂšre appropriĂ©e

Le bloc de code ci-dessus créera le nouveau calque comme indiqué ci-dessous.

Ajout de la couche lambda Ă  lambda ❄

Ajoutons maintenant la couche lambda ci-dessus dans notre définition de fonction lambda comme suit.

const eventCounterFn = new lambda.Function(this, 'EventCounterHandler', {
     runtime: lambda.Runtime.NODEJS_14_X,
     handler: 'event-counter-bus.counter',
     code: lambda.Code.fromAsset('lambda'),
     environment: {
       DetailType: downstreamBus.props.DetailType,
       EventBusName: downstreamBus.props.EventBusName,
       Source: downstreamBus.props.Source,
       EVENT_COUNTER_TABLE_NAME: Counters.tableName,
       BucketName: bucketName
     },
     logRetention: logs.RetentionDays.ONE_MONTH,
     layers: [nodejsXray,nodejsUtils]
});

Ainsi, nous avons ajouté la couche dans notre fonction lambda, cela aidera à les importer dans nos fonctions.

Nous ajouterons plus de connexions à notre pile et la rendrons plus utilisable dans les prochains articles en créant de nouvelles constructions, alors pensez à suivre et à vous abonner à ma newsletter.

⏭ Nous avons notre prochain article en serverless, consultez

🎉 Merci pour votre soutien ! 🙏

Ce serait formidable si vous aimez ☕ Achetez-moi un cafĂ©, pour aider Ă  stimuler mes efforts.

🔁 Message original sur 🔗 Dev Post

🔁 RepubliĂ© Ă  🔗 dev Ă  @aravindvcyber

đŸ€Ą AWS CDK 101 – đŸ€Ÿâ€â™‚ Utilisation de couches dans les fonctions Lambda et enregistrement de JSON dans S3
@hashnode

DĂ©couvrez la collection complĂštehttps://t.co/CuYxnKr0Ig#TheHashnodeWriteathon

— Aravind V (@Aravind_V7) 8 mai 2022