đ° 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 uuid
cela 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
@hashnodeDécouvrez la collection complÚtehttps://t.co/CuYxnKr0Ig#TheHashnodeWriteathon
â Aravind V (@Aravind_V7) 8 mai 2022