Comment lire et écrire des codes QR sur AWS Lambda
Cet article explicatif propose un guide détaillé pour configurer une fonction AWS Lambda avec IronQR. Dans ce tutoriel, vous découvrirez comment configurer IronQR pour lire et écrire des codes QR directement dans un compartiment S3.
Comment lire et écrire des codes QR sur AWS Lambda
Installation
Cet article utilisera un compartiment S3, donc le AWSSDK.S3 package est requis.
Commencez à utiliser IronQR dans votre projet dès aujourd'hui avec un essai gratuit.
Créer un projet AWS Lambda
Avec Visual Studio, créer une AWS Lambda conteneurisée est un processus facile :
- Installer leAWS Toolkit pour Visual Studio
- Sélectionnez un 'Projet AWS Lambda(.NET Core - C#)'
Sélectionner un '.NET 8(Image de conteneur)'plan, puis sélectionnez 'Terminer'.
Ajouter des dépendances de package
La bibliothèque IronQR dans .NET 8 fonctionne sur AWS Lambda sans nécessiter de dépendances supplémentaires. Pour le configurer, modifiez le Dockerfile du projet comme indiqué ci-dessous :
FROM public.ecr.aws/lambda/dotnet:8
# installer les paquets nécessaires
RUN dnf update -y
WORKDIR /var/task
# Cette commande COPY copie les artefacts de build du projet Lambda .NET de la machine hôte dans l'image.
# La source du COPY doit correspondre à l'endroit où le projet .NET Lambda publie ses artefacts de construction.
Si la fonction Lambda est en cours de construction
# avec l'outil AWS .NET Lambda, le commutateur `--docker-host-build-output-dir` contrôle où le projet .NET Lambda
# sera construit.
Les modèles de projet Lambda .NET par défaut ont `--docker-host-build-output-dir`.
# définir dans le fichier aws-lambda-tools-defaults.json à "bin/Release/lambda-publish".
#
# Alternativement, une construction multistage Docker pourrait être utilisée pour construire le projet .NET Lambda à l'intérieur de l'image.
# Pour plus d'informations sur cette approche, consultez le fichier README.md du projet.
COPY "bin/Release/lambda-publish" .
Modifier le code FunctionHandler
Cet exemple crée un code QR, le télécharge dans un compartiment S3, et lit le code QR nouvellement généré.
Avant le bloc try, le chemin du fichier est spécifié dans le répertoire IronQrNuget, avec un identifiant unique global.(GUID)utilisé comme nom de fichier. La méthode Write
génère le code QR basé sur la valeur fournie, et le tableau d'octets JPG résultant est ensuite passé à la méthode Read
pour lire le code QR. Cela démontre que cette fonction AWS Lambda est capable de lire des codes QR.
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronQr;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace IronQrNuGetAwsLambda;
public class Function
{
private static readonly IAmazonS3 _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1);
/// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
/// <returns></returns>
public async Task FunctionHandler(ILambdaContext context)
{
IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01";
string bucketName = "deploymenttestbucket";
string objectKey = $"IronQrNuget/{Guid.NewGuid()}.png";
try
{
// Creating a qr is as simple as:
var myQr = QrWriter.Write("12345");
context.Logger.LogLine($"QR created.");
// Upload the JPG to S3
await UploadJpgToS3Async(bucketName, objectKey, myQr.Save().ExportBytesAsJpg());
context.Logger.LogLine($"QR uploaded successfully to {bucketName}/{objectKey}");
// Load the asset into QrImageInput
QrImageInput imageInput = new QrImageInput(myQr.Save());
// Create a QR Reader object
QrReader reader = new QrReader();
var resultFromByte = reader.Read(imageInput);
foreach (var item in resultFromByte)
{
// Log the read value out
context.Logger.LogLine($"QR value is = {item.Value}");
}
}
catch (Exception e)
{
context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
}
}
// Function to upload the JPG file to S3
private async Task UploadJpgToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
{
using (var memoryStream = new MemoryStream(pdfBytes))
{
var request = new PutObjectRequest
{
BucketName = bucketName,
Key = objectKey,
InputStream = memoryStream,
ContentType = "image/jpg",
};
await _s3Client.PutObjectAsync(request);
}
}
}
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronQr;
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]
namespace IronQrNuGetAwsLambda;
public class Function
{
private static readonly IAmazonS3 _s3Client = new AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1);
/// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
/// <returns></returns>
public async Task FunctionHandler(ILambdaContext context)
{
IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01";
string bucketName = "deploymenttestbucket";
string objectKey = $"IronQrNuget/{Guid.NewGuid()}.png";
try
{
// Creating a qr is as simple as:
var myQr = QrWriter.Write("12345");
context.Logger.LogLine($"QR created.");
// Upload the JPG to S3
await UploadJpgToS3Async(bucketName, objectKey, myQr.Save().ExportBytesAsJpg());
context.Logger.LogLine($"QR uploaded successfully to {bucketName}/{objectKey}");
// Load the asset into QrImageInput
QrImageInput imageInput = new QrImageInput(myQr.Save());
// Create a QR Reader object
QrReader reader = new QrReader();
var resultFromByte = reader.Read(imageInput);
foreach (var item in resultFromByte)
{
// Log the read value out
context.Logger.LogLine($"QR value is = {item.Value}");
}
}
catch (Exception e)
{
context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
}
}
// Function to upload the JPG file to S3
private async Task UploadJpgToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
{
using (var memoryStream = new MemoryStream(pdfBytes))
{
var request = new PutObjectRequest
{
BucketName = bucketName,
Key = objectKey,
InputStream = memoryStream,
ContentType = "image/jpg",
};
await _s3Client.PutObjectAsync(request);
}
}
}
Imports Amazon.Lambda.Core
Imports Amazon.S3
Imports Amazon.S3.Model
Imports IronQr
' Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
<Assembly: LambdaSerializer(GetType(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))>
Namespace IronQrNuGetAwsLambda
Public Class [Function]
Private Shared ReadOnly _s3Client As IAmazonS3 = New AmazonS3Client(Amazon.RegionEndpoint.APSoutheast1)
''' <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
''' <returns></returns>
Public Async Function FunctionHandler(ByVal context As ILambdaContext) As Task
IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01"
Dim bucketName As String = "deploymenttestbucket"
Dim objectKey As String = $"IronQrNuget/{Guid.NewGuid()}.png"
Try
' Creating a qr is as simple as:
Dim myQr = QrWriter.Write("12345")
context.Logger.LogLine($"QR created.")
' Upload the JPG to S3
Await UploadJpgToS3Async(bucketName, objectKey, myQr.Save().ExportBytesAsJpg())
context.Logger.LogLine($"QR uploaded successfully to {bucketName}/{objectKey}")
' Load the asset into QrImageInput
Dim imageInput As New QrImageInput(myQr.Save())
' Create a QR Reader object
Dim reader As New QrReader()
Dim resultFromByte = reader.Read(imageInput)
For Each item In resultFromByte
' Log the read value out
context.Logger.LogLine($"QR value is = {item.Value}")
Next item
Catch e As Exception
context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}")
End Try
End Function
' Function to upload the JPG file to S3
Private Async Function UploadJpgToS3Async(ByVal bucketName As String, ByVal objectKey As String, ByVal pdfBytes() As Byte) As Task
Using memoryStream As New MemoryStream(pdfBytes)
Dim request = New PutObjectRequest With {
.BucketName = bucketName,
.Key = objectKey,
.InputStream = memoryStream,
.ContentType = "image/jpg"
}
Await _s3Client.PutObjectAsync(request)
End Using
End Function
End Class
End Namespace
Augmenter la mémoire et le délai d'attente
L'allocation mémoire pour la fonction Lambda dépend de la taille des documents et du nombre de documents traités simultanément. Comme point de départ, définissez la mémoire à 512 Mo et le délai d'expiration à 300 secondes dans le aws-lambda-tools-defaults.json
.
"function-memory-size" : 512,
"Fonction-timeout" : 300
Si la mémoire est insuffisante, le programme générera l'erreur suivante : 'Runtime exited with error: signal: killed.' Augmenter la taille de la mémoire peut aider à résoudre ce problème. Pour plus de conseils, consultez l'article de dépannage :AWS Lambda - Signal de sortie du runtime : Terminé.
Publier
Pour publier dans Visual Studio, cliquez simplement avec le bouton droit sur le projet et choisissez « Publier sur AWS Lambda... » Ensuite, configurez les paramètres requis. Pour plus d'informations, visitez le siteSite web AWS.
Essayez-le !
Vous pouvez activer la fonction Lambda soit par l'intermédiaire de la fonctionConsole Lambda ou par l'intermédiaire de Visual Studio.