Como Ler & Escrever Código de Barras no AWS Lambda

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

Este artigo de como fazer fornece um guia abrangente para configurar uma função AWS Lambda usando IronBarcode. Neste guia, você aprenderá a configurar o IronBarcode para ler e escrever códigos de barras em um bucket S3.

Instalação

Este artigo utilizará um bucket S3, portanto, o pacote AWSSDK.S3 é necessário.

Usando IronBarcode Zip

Se você estiver usando IronBarcode ZIP, é essencial definir a pasta temporária.

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

O pacote Microsoft.ML.OnnxRuntime é necessário para a leitura de códigos de barras. Enquanto escrever códigos de barras funciona bem sem ele, o modo padrão para leitura baseia-se em aprendizado de máquina (ML). Se você mudar para um modo de leitura que não usa ML, o pacote não é necessário.

Criar um projeto AWS Lambda

Com o Visual Studio, criar uma instância AWS Lambda em contêiner é um processo fácil:

  • Instale o AWS Toolkit for Visual Studio
  • Selecione um 'Projeto AWS Lambda (.NET Core - C#)'
  • Selecione um modelo ' .NET 8 (Imagem de Contêiner)' e, em seguida, selecione 'Concluir'.

Selecionar imagem do contêiner

Adicionar dependências de pacotes

A biblioteca IronBarcode em .NET 8 funciona no AWS Lambda sem a necessidade de dependências extras. Para configurá-lo, atualize o Dockerfile do projeto da seguinte forma:

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"  .

Modifique o código do manipulador de funções.

Este exemplo gera um código de barras EAN8, carrega-o em um bucket S3 e lê o código de barras recém-criado. Ao usar IronBarcode ZIP, configurar a pasta temporária é crucial porque a biblioteca precisa de permissões de escrita para copiar a pasta de runtime a partir dos 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);
        }
    }
}
$vbLabelText   $csharpLabel

Antes do bloco try, o destino do arquivo é definido para o diretório IronBarcodeZip, com o nome gerado como um identificador único global (GUID). O método CreateBarcode é usado para gerar o código de barras. Em seguida, a matriz de bytes PNG é passada para o método Read para ler o código de barras. Isso demonstra que a função AWS Lambda é capaz de ler códigos de barras.

O método Read também aceita um objeto BarcodeReaderOptions, que você pode personalizar para habilitar recursos como leitura de múltiplos códigos de barras, focar em áreas específicas, usar processamento assíncrono e multithread, aplicar filtros de correção de imagem e muito mais.

Aumentar a memória e o tempo limite

A quantidade de memória alocada na função Lambda irá variar com base no tamanho dos documentos sendo processados e o número de documentos processados simultaneamente. Como base, ajuste a memória para 512 MB e o tempo limite para 300 segundos no aws-lambda-tools-defaults.json.

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

Quando a memória é insuficiente, o programa lançará o erro: 'Runtime exited with error: signal: killed.' Aumentar o tamanho da memória pode resolver esse problema. Para mais detalhes, consulte o artigo de solução de problemas: AWS Lambda - Runtime Exited Signal: Killed.

Publicar

Para publicar no Visual Studio, clique com o botão direito no projeto e selecione 'Publish to AWS Lambda...', então configure as configurações necessárias. Você pode ler mais sobre a publicação de um Lambda no site da AWS.

Experimente!

Você pode ativar a função Lambda através do console do Lambda ou através do Visual Studio.

Perguntas frequentes

Como faço para configurar a leitura e gravação de códigos de barras no AWS Lambda?

Para configurar a leitura e gravação de códigos de barras no AWS Lambda, utilize a biblioteca IronBarcode. Para isso, faça o download e crie um projeto AWS Lambda com o Visual Studio. Modifique o código FunctionHandler para lidar com as operações de código de barras, configure as definições do projeto e faça o deploy. Certifique-se de que as dependências de pacotes necessárias, como AWSSDK.S3, estejam incluídas.

Quais pacotes são necessários para o processamento de código de barras no AWS Lambda?

Para processamento de código de barras no AWS Lambda, inclua o pacote AWSSDK.S3 para interações com o S3 e, opcionalmente, o pacote Microsoft.ML.OnnxRuntime para leitura avançada de código de barras por aprendizado de máquina, que pode não ser necessário se forem utilizados métodos padrão de leitura de código de barras.

Como posso modificar o código do FunctionHandler no AWS Lambda para tarefas de leitura de código de barras?

Modifique o código FunctionHandler para criar e ler códigos de barras usando o IronBarcode. Certifique-se de definir a chave de licença do IronBarcode e configurar a pasta temporária para o funcionamento correto dos arquivos ZIP do IronBarcode.

Como faço para aumentar a memória e o tempo limite de uma função AWS Lambda que processa códigos de barras?

Ajuste as configurações de memória e tempo limite no arquivo aws-lambda-tools-defaults.json , definindo o function-memory-size para 512 MB e o function-timeout para 300 segundos, para atender às necessidades de processamento de código de barras com o IronBarcode.

Como faço para publicar uma função Lambda usando o Visual Studio para processamento de código de barras?

Publique a função Lambda clicando com o botão direito do mouse no projeto no Visual Studio, selecionando "Publicar no AWS Lambda..." e configurando as opções. Consulte a documentação da AWS para obter instruções detalhadas e garantir que o IronBarcode esteja configurado corretamente.

Como posso testar a função AWS Lambda implantada para operações com código de barras?

Teste a função Lambda ativando-a através do console do AWS Lambda ou diretamente do Visual Studio, garantindo que o IronBarcode funcione corretamente e que as tarefas de processamento de código de barras sejam executadas conforme o esperado.

Qual é o papel do Dockerfile na configuração do processamento de código de barras no AWS Lambda?

O Dockerfile auxilia na atualização dos pacotes necessários e na cópia dos artefatos de compilação do projeto .NET Lambda para a imagem, facilitando o processamento contínuo de códigos de barras com o IronBarcode no AWS Lambda.

Por que é importante configurar a pasta temporária ao usar bibliotecas de código de barras no AWS Lambda?

A configuração da pasta temporária é essencial porque o IronBarcode requer permissões de gravação para a operação ZIP, garantindo que as pastas de tempo de execução sejam copiadas corretamente das DLLs para um funcionamento perfeito no AWS Lambda.

Posso personalizar a leitura de código de barras no AWS Lambda?

Sim, o IronBarcode permite a personalização da leitura de códigos de barras usando BarcodeReaderOptions , que inclui a leitura de múltiplos códigos de barras, o direcionamento para áreas específicas, a ativação do processamento assíncrono e a aplicação de filtros de correção de imagem.

O que devo fazer se encontrar o erro 'Runtime exited with error: signal: killed' durante o processamento do código de barras?

Este erro sugere alocação insuficiente de memória. Aumente a memória para a função Lambda no arquivo aws-lambda-tools-defaults.json para resolver o problema ao usar o IronBarcode.

Curtis Chau
Redator Técnico

Curtis Chau é bacharel em Ciência da Computação (Universidade Carleton) e se especializa em desenvolvimento front-end, com experiência em Node.js, TypeScript, JavaScript e React. Apaixonado por criar interfaces de usuário intuitivas e esteticamente agradáveis, Curtis gosta de trabalhar com frameworks modernos e criar manuais ...

Leia mais
Pronto para começar?
Nuget Downloads 2,108,094 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package BarCode
executar um exemplo Veja seu fio se transformar em um código de barras.