Comment lire et écrire des codes QR sur AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to 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.

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.

Première étape :
green arrow pointer

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'.

    Sélectionner l'image du conteneur

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
VB   C#

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.