Wie man QR-Codes auf AWS Lambda liest und schreibt

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to Wie man QR-Codes auf AWS Lambda liest und schreibt

Dieser How-to-Artikel bietet eine detaillierte Anleitung zur Einrichtung einer AWS Lambda-Funktion mit IronQR. In diesem Tutorium erfahren Sie, wie Sie IronQR konfigurieren, um QR-Codes direkt in einen S3-Bucket zu lesen und zu schreiben.

Einrichtung

Dieser Artikel wird einen S3-Bucket verwenden, daher die AWSSDK.S3 Paket ist erforderlich.

Beginnen Sie noch heute mit der Verwendung von IronQR in Ihrem Projekt mit einer kostenlosen Testversion.

Erster Schritt:
green arrow pointer

Erstellen Sie ein AWS-Lambda-Projekt

Mit Visual Studio ist das Erstellen einer containerisierten AWS Lambda ein einfacher Prozess:

  • Installieren Sie dieAWS Toolkit für Visual Studio
  • Wählen Sie ein 'AWS Lambda-Projekt'(.NET Core - C#)'
  • Wählen Sie ein '.NET 8(Container-Image)'Blueprint', dann wählen Sie 'Fertig'.

    Containerbild auswählen

Paketabhängigkeiten hinzufügen

Die IronQR-Bibliothek in .NET 8 läuft auf AWS Lambda ohne zusätzliche Abhängigkeiten. Um es zu konfigurieren, ändern Sie die Dockerfile des Projekts wie unten gezeigt:


FROM public.ecr.aws/lambda/dotnet:8

# notwendige Pakete installieren

RUN dnf update -y

WORKDIR /var/task

# Dieser COPY-Befehl kopiert die Build-Artefakte des .NET Lambda-Projekts von der Hostmaschine in das Image.

# Die Quelle der COPY-Anweisung sollte mit dem Ort übereinstimmen, an dem das .NET Lambda-Projekt seine Build-Artefakte veröffentlicht.

Wenn die Lambda-Funktion erstellt wird

# mit dem AWS .NET Lambda-Tooling steuert der Schalter `--docker-host-build-output-dir`, wohin das .NET-Lambda-Projekt

# wird gebaut.

Die .NET Lambda-Projektvorlagen sind standardmäßig mit `--docker-host-build-output-dir` konfiguriert.

# im aws-lambda-tools-defaults.json Datei auf "bin/Release/lambda-publish" setzen.

#

# Alternativ könnte ein Docker-Multi-Stage-Build verwendet werden, um das .NET Lambda-Projekt innerhalb des Images zu erstellen.

# Weitere Informationen zu diesem Ansatz finden Sie in der README.md-Datei des Projekts.

COPY "bin/Release/lambda-publish" .

Ändern Sie den FunctionHandler-Code

Dieses Beispiel erstellt einen QR-Code, lädt ihn in einen S3-Bucket hoch und liest den neu generierten QR-Code.

Vor dem try-Block wird der Dateipfad im IronQrNuget-Verzeichnis mit einem global eindeutigen Bezeichner angegeben.(GUID)als Dateiname verwendet. Die Write-Methode generiert den QR-Code basierend auf dem angegebenen Wert, und das resultierende JPG-Bytearray wird anschließend an die Read-Methode übergeben, um den QR-Code zu lesen. Dies zeigt, dass diese AWS Lambda-Funktion in der Lage ist, QR-Codes zu lesen.

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#

Speicher und Timeout erhöhen

Der Speicherzuteilung für die Lambda-Funktion hängt von der Größe der Dokumente und der Anzahl der gleichzeitig verarbeiteten Dokumente ab. Als Ausgangspunkt setzen Sie den Speicher auf 512 MB und das Timeout auf 300 Sekunden in der aws-lambda-tools-defaults.json.


"function-memory-size" : 512,

"Funktions-Timeout" : 300

Wenn der Speicher nicht ausreicht, wird das Programm den Fehler melden: 'Runtime exited with error: signal: killed.' Eine Erhöhung der Speicherkapazität kann helfen, dieses Problem zu lösen. Für weitere Anleitungen siehe den Artikel zur Fehlerbehebung:AWS Lambda - Laufzeit beendet Signal: Beendet.

Veröffentlichen

Um in Visual Studio zu veröffentlichen, klicken Sie einfach mit der rechten Maustaste auf das Projekt und wählen Sie 'Publish to AWS Lambda...' aus. Konfigurieren Sie anschließend die erforderlichen Einstellungen. Weitere Informationen erhalten Sie auf derAWS-Website.

Probieren Sie es aus!

Sie können die Lambda-Funktion entweder über die FunktionLambda-Konsole oder über Visual Studio.