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.
Wie man QR-Codes auf AWS Lambda liest und schreibt
- Laden Sie eine C#-Bibliothek herunter, um QR-Codes zu lesen und zu schreiben.
- Erstellen Sie die AWS Lambda containerisierte Projektvorlage
- Ändern Sie die Dockerfile und den FunctionHandler-Code
- Erhöhen Sie die Speicher- und Timeout-Einstellungen
- Bereitstellen und Aufrufen der Funktion, um die Ergebnisse in S3 zu sehen.
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.
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 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
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.