Cómo leer y escribir códigos QR en AWS Lambda
Este artículo de instrucciones ofrece una guía detallada para configurar una función AWS Lambda con IronQR. En este tutorial, descubrirás cómo configurar IronQR para leer y escribir códigos QR directamente en un bucket de S3.
Cómo leer y escribir códigos QR en AWS Lambda
Instalación
Este artículo utilizará un bucket S3, por lo que el AWSSDK.S3 se requiere el paquete.
Comience a usar IronQR en su proyecto hoy con una prueba gratuita.
Crear un proyecto AWS Lambda
Con Visual Studio, crear un AWS Lambda con contenedor es un proceso sencillo:
- Instale elAWS Tookit para Visual Studio
- Seleccione un 'Proyecto AWS Lambda(.NET Core - C#)'
Seleccione un '.NET 8(Imagen de contenedor)'plano, luego selecciona 'Finalizar'.
Agregar dependencias de paquetes
La biblioteca IronQR en .NET 8 funciona en AWS Lambda sin requerir dependencias adicionales. Para configurarlo, modifique el Dockerfile del proyecto como se muestra a continuación:
FROM public.ecr.aws/lambda/dotnet:8
# instalar los paquetes necesarios
RUN dnf update -y
WORKDIR /var/task
# Este comando COPY copia los artefactos de construcción del proyecto Lambda de .NET desde la máquina anfitriona hasta la imagen.
# El origen de la COPIA debe coincidir con el lugar donde el proyecto .NET Lambda publica sus artefactos de construcción.
Si se está construyendo la función Lambda
# con la Herramienta AWS .NET Lambda, el interruptor `--docker-host-build-output-dir` controla dónde el proyecto .NET Lambda
# se construirá.
Los plantillas de proyectos Lambda .NET predeterminan tener `--docker-host-build-output-dir`.
# establecer en el archivo aws-lambda-tools-defaults.json a "bin/Release/lambda-publish".
#
# Alternativamente, se podría utilizar una compilación multietapa de Docker para construir el proyecto .NET Lambda dentro de la imagen.
# Para obtener más información sobre este enfoque, consulta el archivo README.md del proyecto.
COPIAR "bin/Release/lambda-publish" .
Modificar el código de FunctionHandler
Este ejemplo genera un código QR, lo sube a un bucket de S3 y lee el código QR recién generado.
Antes del bloque try, la ruta del archivo se especifica en el directorio IronQrNuget, con un identificador único global.(GUID)utilizado como el nombre del archivo. El método Write
genera el código QR basado en el valor proporcionado, y el array de bytes JPG resultante se pasa al método Read
para leer el código QR. Esto demuestra que esta función de AWS Lambda es capaz de leer códigos 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
Aumentar la memoria y el tiempo de espera
La asignación de memoria para la función Lambda depende del tamaño de los documentos y del número procesado simultáneamente. Como punto de partida, establece la memoria en 512 MB y el tiempo de espera en 300 segundos en el aws-lambda-tools-defaults.json
.
"function-memory-size" : 512,
"función-tiempo de espera" : 300
Si la memoria es insuficiente, el programa generará el error: 'Runtime exited with error: signal: killed.' Aumentar el tamaño de la memoria puede ayudar a resolver este problema. Para obtener más orientación, consulte el artículo de solución de problemas:AWS Lambda - Salida del Tiempo de Ejecución: Eliminado.
Publicar
Para publicar en Visual Studio, simplemente haz clic derecho en el proyecto y elige 'Publicar en AWS Lambda...' Luego, configura los ajustes necesarios. Para más información, visiteSitio web de AWS.
¡Pruébalo!
Puede activar la función Lambda a través del botónConsola Lambda o a través de Visual Studio.