So lesen und schreiben Sie Barcodes auf AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to So lesen und schreiben Sie Barcodes auf AWS Lambda

Dieser Anleitungsartikel bietet eine umfassende Anleitung zur Einrichtung einer AWS Lambda-Funktion mit IronBarcode. In diesem Leitfaden lernen Sie, wie Sie IronBarcode konfigurieren, um Barcodes von einem S3-Bucket zu lesen und in diesen zu schreiben.

Einrichtung

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

Verwendung von IronBarcode Zip

Wenn Sie IronBarcode ZIP verwenden, ist es wichtig, den temporären Ordner festzulegen.

var awsTmpPath = @"/tmp/";
IronBarCode.Installation.DeploymentPath = awsTmpPath;
var awsTmpPath = @"/tmp/";
IronBarCode.Installation.DeploymentPath = awsTmpPath;
Dim awsTmpPath = "/tmp/"
IronBarCode.Installation.DeploymentPath = awsTmpPath
VB   C#

Die Microsoft.ML.OnnxRuntimePaket ist erforderlich, um Barcodes zu lesen. Während das Schreiben von Barcodes auch ohne funktioniert, basiert der Standardmodus für das Lesen auf maschinellem Lernen.(ML). Wenn Sie in einen Lesemodus wechseln, der kein maschinelles Lernen verwendet, wird das Paket nicht benötigt.

Beginnen Sie noch heute mit der Verwendung von IronBarcode 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 IronBarcode-Bibliothek in .NET 8 funktioniert auf AWS Lambda, ohne dass zusätzliche Abhängigkeiten erforderlich sind. Um die Einrichtung durchzuführen, aktualisieren Sie die Dockerfile des Projekts wie folgt:


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 erzeugt einen EAN8-Barcode, lädt ihn in einen S3-Bucket hoch und liest den neu erstellten Barcode. Beim Verwenden von IronBarcode ZIP ist die Konfiguration des temporären Ordners entscheidend, da die Bibliothek Schreibberechtigungen benötigt, um den Laufzeitordner aus den DLLs zu kopieren.

using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronBarCode;

// 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 IronBarcodeZipAwsLambda;

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)
    {
        var awsTmpPath = @"/tmp/";
        IronBarCode.Installation.DeploymentPath = awsTmpPath;

        IronBarCode.License.LicenseKey = "IRONBARCODE-MYLICENSE-KEY-1EF01";

        string filename = Guid.NewGuid().ToString();

        string bucketName = "deploymenttestbucket";
        string objectKey = $"IronBarcodeZip/{filename}.png";

        try
        {
            // Creating a barcode is as simple as:
            var myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8);

            // Use pdfData (byte array) as needed
            context.Logger.LogLine($"Barocde created.");

            // Upload the PDF to S3
            await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData());

            context.Logger.LogLine($"Barocde uploaded successfully to {bucketName}/{objectKey}");

            var resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData());

            foreach (var item in resultFromByte)
            {
                // Log the read value out
                context.Logger.LogLine($"Barcode value is = {item.Value}");
            }
        }
        catch (Exception e)
        {
            context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
        }
    }
    // Function to upload the PNG file to S3
    private async Task UploadPngToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
    {
        using (var memoryStream = new MemoryStream(pdfBytes))
        {
            var request = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = objectKey,
                InputStream = memoryStream,
                ContentType = "image/png",
            };

            await _s3Client.PutObjectAsync(request);
        }
    }
}
using Amazon.Lambda.Core;
using Amazon.S3;
using Amazon.S3.Model;
using IronBarCode;

// 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 IronBarcodeZipAwsLambda;

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)
    {
        var awsTmpPath = @"/tmp/";
        IronBarCode.Installation.DeploymentPath = awsTmpPath;

        IronBarCode.License.LicenseKey = "IRONBARCODE-MYLICENSE-KEY-1EF01";

        string filename = Guid.NewGuid().ToString();

        string bucketName = "deploymenttestbucket";
        string objectKey = $"IronBarcodeZip/{filename}.png";

        try
        {
            // Creating a barcode is as simple as:
            var myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8);

            // Use pdfData (byte array) as needed
            context.Logger.LogLine($"Barocde created.");

            // Upload the PDF to S3
            await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData());

            context.Logger.LogLine($"Barocde uploaded successfully to {bucketName}/{objectKey}");

            var resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData());

            foreach (var item in resultFromByte)
            {
                // Log the read value out
                context.Logger.LogLine($"Barcode value is = {item.Value}");
            }
        }
        catch (Exception e)
        {
            context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
        }
    }
    // Function to upload the PNG file to S3
    private async Task UploadPngToS3Async(string bucketName, string objectKey, byte[] pdfBytes)
    {
        using (var memoryStream = new MemoryStream(pdfBytes))
        {
            var request = new PutObjectRequest
            {
                BucketName = bucketName,
                Key = objectKey,
                InputStream = memoryStream,
                ContentType = "image/png",
            };

            await _s3Client.PutObjectAsync(request);
        }
    }
}
Imports Amazon.Lambda.Core
Imports Amazon.S3
Imports Amazon.S3.Model
Imports IronBarCode

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

	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
			Dim awsTmpPath = "/tmp/"
			IronBarCode.Installation.DeploymentPath = awsTmpPath

			IronBarCode.License.LicenseKey = "IRONBARCODE-MYLICENSE-KEY-1EF01"

			Dim filename As String = Guid.NewGuid().ToString()

			Dim bucketName As String = "deploymenttestbucket"
			Dim objectKey As String = $"IronBarcodeZip/{filename}.png"

			Try
				' Creating a barcode is as simple as:
				Dim myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8)

				' Use pdfData (byte array) as needed
				context.Logger.LogLine($"Barocde created.")

				' Upload the PDF to S3
				Await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData())

				context.Logger.LogLine($"Barocde uploaded successfully to {bucketName}/{objectKey}")

				Dim resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData())

				For Each item In resultFromByte
					' Log the read value out
					context.Logger.LogLine($"Barcode 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 PNG file to S3
		Private Async Function UploadPngToS3Async(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/png"
				}

				Await _s3Client.PutObjectAsync(request)
			End Using
		End Function
	End Class
End Namespace
VB   C#

Vor dem Try-Block wird das Dateiziel auf das Verzeichnis IronBarcodeZip gesetzt, wobei der Name als global eindeutiger Bezeichner generiert wird.(GUID). Die Methode CreateBarcode wird verwendet, um den Barcode zu erstellen. Anschließend wird das PNG-Byte-Array an die Read-Methode übergeben, um den Barcode zu lesen. Dies zeigt, dass die AWS Lambda-Funktion in der Lage ist, Barcodes zu lesen.

Die Methode Read akzeptiert auch ein BarcodeReaderOptions-Objekt, das Sie anpassen können, um Funktionen wie zu aktivieren.Mehrere Barcodes lesen, gezielte Bereiche ansprechen, unter Verwendung asynchroner und multithreaded Verarbeitung, Anwenden von Bildkorrekturfilternund vieles mehr.

Speicher und Timeout erhöhen

Der im Lambda-Funktion zugewiesene Speicher variiert je nach Größe der verarbeiteten Dokumente und der Anzahl der gleichzeitig verarbeiteten Dokumente. Legen Sie als Basis die Speicherkapazität auf 512 MB und das Timeout auf 300 Sekunden in aws-lambda-tools-defaults.json fest.


"function-memory-size" : 512,

"Funktions-Timeout" : 300

Wenn der Speicher unzureichend ist, wird das Programm den Fehler 'Runtime exited with error: signal: killed.' auslösen. Eine Erhöhung der Speichergröße kann dieses Problem beheben. Weitere Einzelheiten finden Sie im Artikel zur Fehlerbehebung:AWS Lambda - Laufzeit beendet Signal: Beendet.

Veröffentlichen

Um in Visual Studio zu veröffentlichen, klicken Sie mit der rechten Maustaste auf das Projekt und wählen Sie 'In AWS Lambda veröffentlichen...', dann konfigurieren Sie die notwendigen Einstellungen. Mehr über die Veröffentlichung eines Lambdas erfahren Sie auf derAWS-Website.

Probieren Sie es aus!

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