Cómo leer y escribir códigos de barras en AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
AWS Lambda

Este artículo instructivo proporciona una guía completa para configurar una función de AWS Lambda usando IronBarcode. En esta guía, aprenderás cómo configurar IronBarcode para leer y escribir códigos de barras en un bucket S3.

Instalación

Este artículo utilizará un bucket S3, por lo que se requiere el paquete AWSSDK.S3.

Uso de IronBarcode Zip

Si estás usando IronBarcode ZIP, es esencial establecer la carpeta temporal.

var awsTmpPath = @"/tmp/";
IronBarCode.Installation.DeploymentPath = awsTmpPath;
var awsTmpPath = @"/tmp/";
IronBarCode.Installation.DeploymentPath = awsTmpPath;
Dim awsTmpPath = "/tmp/"
IronBarCode.Installation.DeploymentPath = awsTmpPath
$vbLabelText   $csharpLabel

El paquete Microsoft.ML.OnnxRuntime se requiere para leer códigos de barras. Aunque escribir códigos de barras funciona bien sin él, el modo predeterminado para lectura depende del aprendizaje automático (ML). Si cambias a un modo de lectura que no use ML, no se necesita el paquete.

Crear un proyecto de AWS Lambda

Con Visual Studio, crear un AWS Lambda en contenedor es un proceso sencillo:

  • Instalar el AWS Toolkit para Visual Studio
  • Seleccionar un 'Proyecto AWS Lambda (.NET Core - C#)'
  • Seleccionar un modelo '.NET 8 (Imagen de Contenedor)', luego seleccionar 'Finalizar'.

Seleccionar imagen de contenedor

Agregar dependencias de paquetes

La biblioteca IronBarcode en .NET 8 funciona en AWS Lambda sin necesidad de dependencias adicionales. Para configurarlo, actualiza el Dockerfile del proyecto de la siguiente manera:

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

# Install necessary packages
RUN dnf update -y

WORKDIR /var/task

# This COPY command copies the .NET Lambda project's build artifacts from the host machine into the image. 
# The source of the COPY should match where the .NET Lambda project publishes its build artifacts. If the Lambda function is being built 
# with the AWS .NET Lambda Tooling, the `--docker-host-build-output-dir` switch controls where the .NET Lambda project
# will be built. The .NET Lambda project templates default to having `--docker-host-build-output-dir`
# set in the aws-lambda-tools-defaults.json file to "bin/Release/lambda-publish".
#
# Alternatively Docker multi-stage build could be used to build the .NET Lambda project inside the image.
# For more information on this approach check out the project's README.md file.
COPY "bin/Release/lambda-publish"  .

Modificar el código del FunctionHandler

Este ejemplo genera un código de barras EAN8, lo sube a un bucket S3 y lee el código de barras recién creado. Cuando se usa IronBarcode ZIP, configurar la carpeta temporal es crucial porque la biblioteca necesita permisos de escritura para copiar la carpeta de runtime desde las DLLs.

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);

    /// <summary>
    /// AWS Lambda Function Handler. It generates a barcode, uploads it to S3, and then reads it.
    /// </summary>
    /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
    public async Task FunctionHandler(ILambdaContext context)
    {
        var awsTmpPath = @"/tmp/";
        IronBarCode.Installation.DeploymentPath = awsTmpPath;

        // Set your IronBarcode license key here
        IronBarCode.License.LicenseKey = "IRONBARCODE-MYLICENSE-KEY-1EF01";

        string filename = Guid.NewGuid().ToString();
        string bucketName = "deploymenttestbucket";
        string objectKey = $"IronBarcodeZip/{filename}.png";

        try
        {
            // Creating a barcode with EAN8 encoding
            var myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8);

            context.Logger.LogLine($"Barcode created.");

            // Upload the PNG image of the barcode to the specified S3 bucket
            await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData());
            context.Logger.LogLine($"Barcode uploaded successfully to {bucketName}/{objectKey}");

            // Read and log the barcode value from the PNG binary data
            var resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData());
            foreach (var item in resultFromByte)
            {
                context.Logger.LogLine($"Barcode value is = {item.Value}");
            }
        }
        catch (Exception e)
        {
            context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
        }
    }

    /// <summary>
    /// Uploads a PNG byte array to the specified S3 bucket.
    /// </summary>
    /// <param name="bucketName">The name of the S3 bucket.</param>
    /// <param name="objectKey">The object key for the uploaded file in the bucket.</param>
    /// <param name="pdfBytes">Byte array of the PNG to be uploaded.</param>
    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);

    /// <summary>
    /// AWS Lambda Function Handler. It generates a barcode, uploads it to S3, and then reads it.
    /// </summary>
    /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
    public async Task FunctionHandler(ILambdaContext context)
    {
        var awsTmpPath = @"/tmp/";
        IronBarCode.Installation.DeploymentPath = awsTmpPath;

        // Set your IronBarcode license key here
        IronBarCode.License.LicenseKey = "IRONBARCODE-MYLICENSE-KEY-1EF01";

        string filename = Guid.NewGuid().ToString();
        string bucketName = "deploymenttestbucket";
        string objectKey = $"IronBarcodeZip/{filename}.png";

        try
        {
            // Creating a barcode with EAN8 encoding
            var myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8);

            context.Logger.LogLine($"Barcode created.");

            // Upload the PNG image of the barcode to the specified S3 bucket
            await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData());
            context.Logger.LogLine($"Barcode uploaded successfully to {bucketName}/{objectKey}");

            // Read and log the barcode value from the PNG binary data
            var resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData());
            foreach (var item in resultFromByte)
            {
                context.Logger.LogLine($"Barcode value is = {item.Value}");
            }
        }
        catch (Exception e)
        {
            context.Logger.LogLine($"[ERROR] FunctionHandler: {e.Message}");
        }
    }

    /// <summary>
    /// Uploads a PNG byte array to the specified S3 bucket.
    /// </summary>
    /// <param name="bucketName">The name of the S3 bucket.</param>
    /// <param name="objectKey">The object key for the uploaded file in the bucket.</param>
    /// <param name="pdfBytes">Byte array of the PNG to be uploaded.</param>
    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)

		''' <summary>
		''' AWS Lambda Function Handler. It generates a barcode, uploads it to S3, and then reads it.
		''' </summary>
		''' <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
		Public Async Function FunctionHandler(ByVal context As ILambdaContext) As Task
			Dim awsTmpPath = "/tmp/"
			IronBarCode.Installation.DeploymentPath = awsTmpPath

			' Set your IronBarcode license key here
			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 with EAN8 encoding
				Dim myBarcode = BarcodeWriter.CreateBarcode("1212345", BarcodeWriterEncoding.EAN8)

				context.Logger.LogLine($"Barcode created.")

				' Upload the PNG image of the barcode to the specified S3 bucket
				Await UploadPngToS3Async(bucketName, objectKey, myBarcode.ToPngBinaryData())
				context.Logger.LogLine($"Barcode uploaded successfully to {bucketName}/{objectKey}")

				' Read and log the barcode value from the PNG binary data
				Dim resultFromByte = BarcodeReader.Read(myBarcode.ToPngBinaryData())
				For Each item In resultFromByte
					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

		''' <summary>
		''' Uploads a PNG byte array to the specified S3 bucket.
		''' </summary>
		''' <param name="bucketName">The name of the S3 bucket.</param>
		''' <param name="objectKey">The object key for the uploaded file in the bucket.</param>
		''' <param name="pdfBytes">Byte array of the PNG to be uploaded.</param>
		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
$vbLabelText   $csharpLabel

Antes del bloque try, el destino del archivo se establece en el directorio IronBarcodeZip, con el nombre generado como un identificador único global (GUID). Se usa el método CreateBarcode para generar el código de barras. Después, el arreglo de bytes PNG se pasa al método Read para leer el código de barras. Esto demuestra que la función AWS Lambda es capaz de leer códigos de barras.

El método Read también acepta un objeto BarcodeReaderOptions, que puedes personalizar para habilitar características como leer múltiples códigos de barras, apuntar a áreas específicas, usar procesamiento asincrónico y multihilo, aplicar filtros de corrección de imagen y mucho más.

Aumentar la memoria y el tiempo de espera

La cantidad de memoria asignada en la función Lambda variará según el tamaño de los documentos que se procesen y la cantidad de documentos procesados simultáneamente. Como línea base, configura la memoria a 512 MB y el tiempo de espera a 300 segundos en aws-lambda-tools-defaults.json.

{
    "function-memory-size": 512,
    "function-timeout": 300
}

Cuando la memoria es insuficiente, el programa lanzará el error: 'Runtime exited with error: signal: killed.' Aumentar el tamaño de la memoria puede resolver este problema. Para más detalles, consulta el artículo de resolución de problemas: AWS Lambda - Salida de Runtime: Señal: Killed.

Publicar

Para publicar en Visual Studio, haz clic derecho en el proyecto y selecciona 'Publicar en AWS Lambda...', luego configura los ajustes necesarios. Puedes leer más sobre la publicación de un Lambda en el sitio web de AWS.

¡Pruébalo!

Puedes activar la función Lambda ya sea a través de la consola de Lambda o a través de Visual Studio.

Preguntas Frecuentes

¿Cómo configuro la lectura y escritura de código de barras en AWS Lambda?

Para configurar la lectura y escritura de código de barras en AWS Lambda, utiliza la biblioteca IronBarcode descargándola y creando un proyecto AWS Lambda con Visual Studio. Modifica el código FunctionHandler para manejar operaciones de código de barras, configura las configuraciones del proyecto y despliega. Asegúrate de incluir dependencias de paquetes necesarias como AWSSDK.S3.

¿Qué paquetes son necesarios para el procesamiento de código de barras en AWS Lambda?

Para el procesamiento de código de barras en AWS Lambda, incluye el paquete AWSSDK.S3 para interacciones con S3 y opcionalmente el paquete Microsoft.ML.OnnxRuntime para lectura avanzada de código de barras con aprendizaje automático, lo cual puede no ser necesario si usas métodos estándar de lectura de códigos de barras.

¿Cómo puedo modificar el código FunctionHandler en AWS Lambda para tareas de códigos de barras?

Modifica el código FunctionHandler para crear y leer códigos de barras usando IronBarcode. Asegúrate de configurar la clave de licencia de IronBarcode y configurar la carpeta temporal para el correcto funcionamiento de los archivos ZIP de IronBarcode.

¿Cómo aumento la memoria y el tiempo de espera para una función de AWS Lambda que maneja códigos de barras?

Ajusta la configuración de memoria y tiempo de espera en el archivo aws-lambda-tools-defaults.json estableciendo el tamaño de memoria de la función en 512 MB y el tiempo de espera de la función en 300 segundos para satisfacer las necesidades de procesamiento de códigos de barras con IronBarcode.

¿Cómo publico una función Lambda usando Visual Studio para el procesamiento de códigos de barras?

Publica la función Lambda haciendo clic derecho en el proyecto en Visual Studio, seleccionando 'Publicar en AWS Lambda...' y configurando las opciones. Sigue la documentación de AWS para pasos detallados, asegurándote de que IronBarcode esté configurado correctamente.

¿Cómo puedo probar la función AWS Lambda desplegada para operaciones de códigos de barras?

Prueba la función Lambda activándola a través de la consola de AWS Lambda o directamente desde Visual Studio, asegurándote de que IronBarcode funcione correctamente y las tareas de procesamiento de códigos de barras se realicen según lo esperado.

¿Cuál es el papel del Dockerfile en la configuración del procesamiento de códigos de barras en AWS Lambda?

El Dockerfile ayuda a actualizar los paquetes necesarios y a copiar los artefactos de construcción del proyecto .NET Lambda en la imagen, facilitando el procesamiento sin problemas de códigos de barras con IronBarcode en AWS Lambda.

¿Por qué es importante configurar la carpeta temporal al usar bibliotecas de códigos de barras en AWS Lambda?

Configurar la carpeta temporal es esencial porque IronBarcode requiere permisos de escritura para la operación ZIP, asegurando que las carpetas en runtime se copien correctamente desde los DLLs para un funcionamiento sin problemas en AWS Lambda.

¿Puedo personalizar la lectura de códigos de barras en AWS Lambda?

Sí, IronBarcode permite la personalización de la lectura de códigos de barras usando BarcodeReaderOptions, lo cual incluye leer múltiples códigos de barras, apuntar a áreas específicas, habilitar el procesamiento asincrónico y aplicar filtros de corrección de imagen.

¿Qué debo hacer si encuentro el error 'Runtime exited with error: signal: killed' durante el procesamiento de códigos de barras?

Este error sugiere una asignación insuficiente de memoria. Aumenta la memoria de la función Lambda en el archivo aws-lambda-tools-defaults.json para resolver el problema mientras usas IronBarcode.

Curtis Chau
Escritor Técnico

Curtis Chau tiene una licenciatura en Ciencias de la Computación (Carleton University) y se especializa en el desarrollo front-end con experiencia en Node.js, TypeScript, JavaScript y React. Apasionado por crear interfaces de usuario intuitivas y estéticamente agradables, disfruta trabajando con frameworks modernos y creando manuales bien ...

Leer más
¿Listo para empezar?
Nuget Descargas 1,979,979 | Version: 2025.11 recién lanzado