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.
So lesen und schreiben Sie Barcodes auf AWS Lambda
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
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.
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'.
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
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.