Como ler e gravar códigos QR no AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to Como ler e gravar códigos QR no AWS Lambda

Este artigo explicativo oferece um guia detalhado para configurar uma função AWS Lambda com o IronQR. Neste tutorial, você descobrirá como configurar o IronQR para ler e gravar códigos QR diretamente em um bucket do S3.

Instalação

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

!{--010011000100100101000010010100100100000101010010010110010101111101010011010101000100000101010010010101000101111101010001010010010010010010100000101001100010111110100001001001100010011110100001101001011--}

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 para Visual Studio
  • Selecione um 'Projeto AWS Lambda (.NET Core - C#)'
  • Selecione um modelo ' .NET 8 (Imagem de Contêiner)' e, em seguida, selecione 'Concluir'.

Selecione a imagem do contêiner

Adicionar dependências de pacotes

A biblioteca IronQR no .NET 8 funciona no AWS Lambda sem exigir dependências adicionais. Para configurá-lo, modifique o Dockerfile do projeto conforme mostrado abaixo:

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

# Install necessary packages and update repositories
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 cria um código QR, carrega-o para um bucket S3 e lê o código QR recém-gerado.

O caminho do arquivo é especificado no diretório IronQrNuGet, com um identificador globalmente único (GUID) usado como nome do arquivo. O método Write gera o código QR com base no valor fornecido, e o array de bytes JPG resultante é então passado para o método Read para leitura do código QR. Isso demonstra que essa função AWS Lambda é capaz de ler 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);

        /// <summary>
        /// Main handler for AWS Lambda
        /// </summary>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        /// <returns></returns>
        public async Task FunctionHandler(ILambdaContext context)
        {
            // Set the license key for IronQR
            IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01";

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

            try
            {
                // Create a QR code with the content "12345"
                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}");

                // Read the QR code
                QrImageInput imageInput = new QrImageInput(myQr.Save());
                QrReader reader = new QrReader();
                var resultFromByte = reader.Read(imageInput);

                foreach (var item in resultFromByte)
                {
                    // Log the read value
                    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[] jpgBytes)
        {
            using (var memoryStream = new MemoryStream(jpgBytes))
            {
                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);

        /// <summary>
        /// Main handler for AWS Lambda
        /// </summary>
        /// <param name="context">The ILambdaContext that provides methods for logging and describing the Lambda environment.</param>
        /// <returns></returns>
        public async Task FunctionHandler(ILambdaContext context)
        {
            // Set the license key for IronQR
            IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01";

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

            try
            {
                // Create a QR code with the content "12345"
                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}");

                // Read the QR code
                QrImageInput imageInput = new QrImageInput(myQr.Save());
                QrReader reader = new QrReader();
                var resultFromByte = reader.Read(imageInput);

                foreach (var item in resultFromByte)
                {
                    // Log the read value
                    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[] jpgBytes)
        {
            using (var memoryStream = new MemoryStream(jpgBytes))
            {
                var request = new PutObjectRequest
                {
                    BucketName = bucketName,
                    Key = objectKey,
                    InputStream = memoryStream,
                    ContentType = "image/jpg",
                };

                await _s3Client.PutObjectAsync(request);
            }
        }
    }
}
$vbLabelText   $csharpLabel

Aumentar a memória e o tempo limite

A alocação de memória para a função Lambda depende do tamanho dos documentos e do número de documentos processados ​​simultaneamente. Como ponto de partida, defina 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

Se a memória for insuficiente, o programa exibirá o erro: 'Runtime exited with error: signal: killed.' Aumentar a quantidade de memória disponível pode ajudar a resolver esse problema. Para obter mais orientações, consulte o artigo de resolução de problemas: AWS Lambda - Sinal de saída do runtime: Killed .

Publicar

Para publicar no Visual Studio, basta clicar com o botão direito do mouse no projeto e escolher "Publicar no AWS Lambda...". Em seguida, configure as opções necessárias. Para obter mais informações, visite o 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 posso integrar uma biblioteca de código QR ao meu projeto C# no AWS Lambda?

Você pode integrar uma biblioteca de código QR como o IronQR ao seu projeto C# no AWS Lambda baixando a biblioteca IronQR, criando um projeto AWS Lambda em contêiner usando o Visual Studio e configurando seu ambiente para suportar operações com código QR.

Quais são os passos para configurar o IronQR para AWS Lambda?

Configure o IronQR para AWS Lambda criando um modelo de projeto em contêiner no Visual Studio, modificando o Dockerfile, atualizando o FunctionHandler e ajustando as configurações de memória e tempo limite para garantir o bom funcionamento.

Como posso gerenciar códigos QR com o AWS S3 usando uma biblioteca C#?

Com o IronQR, você pode gerenciar códigos QR criando, carregando e lendo dados de buckets do AWS S3. Isso envolve o uso da biblioteca IronQR em conjunto com o pacote AWSSDK.S3 para lidar com as operações em buckets do S3.

O que devo fazer se minha função AWS Lambda usando IronQR não estiver apresentando um bom desempenho?

Se a sua função AWS Lambda não estiver apresentando um bom desempenho, considere aumentar as configurações de memória e tempo limite no arquivo aws-lambda-tools-defaults.json para alocar mais recursos para a função.

Como posso implantar uma função Lambda em C# na AWS?

Implante uma função Lambda em C# na AWS usando a opção "Publicar no AWS Lambda..." do Visual Studio, configurando as definições necessárias e utilizando o AWS Toolkit para a implantação.

É possível testar minha função AWS Lambda no Visual Studio?

Sim, você pode testar sua função AWS Lambda no Visual Studio usando o AWS Toolkit para invocar a função e verificar sua saída diretamente em seu ambiente de desenvolvimento.

Como posso solucionar problemas de memória com minha função AWS Lambda?

Para solucionar problemas de memória, aumente a alocação de memória da função no arquivo aws-lambda-tools-defaults.json e monitore o desempenho da função após a reimplementação.

Qual a importância de modificar o Dockerfile em um projeto AWS Lambda?

Modificar o Dockerfile em um projeto AWS Lambda é crucial para configurar o ambiente corretamente, incluindo a atualização de repositórios e a cópia dos artefatos de compilação necessários para que a função seja executada adequadamente.

Como posso garantir que minha função AWS Lambda lide com operações de código QR de forma eficiente?

Garanta que sua função AWS Lambda lide com operações de código QR de forma eficiente, otimizando as configurações de memória e tempo limite, usando bibliotecas adequadas como o IronQR e configurando corretamente o Dockerfile e as configurações do projeto.

Posso automatizar a geração e recuperação de códigos QR no AWS Lambda?

Sim, você pode automatizar a geração e recuperação de códigos QR no AWS Lambda usando o IronQR. A biblioteca permite criar códigos QR programaticamente, carregá-los no S3 e lê-los conforme necessário.

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 61,359 | Versão: 2026.3 acaba de ser lançado
Still Scrolling Icon

Ainda está rolando a tela?

Quer provas rápidas? PM > Install-Package IronQR
executar um exemplo Veja seu URL se transformar em um código QR.