Jak odczytywać i zapisywać kody QR na AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to Jak odczytywać i zapisywać kody QR na AWS Lambda

Ten artykuł zawiera szczegółowy przewodnik dotyczący konfigurowania funkcji AWS Lambda z IronQR. W tym tutorialu dowiesz się, jak skonfigurować IronQR do odczytywania i zapisywania kodów QR bezpośrednio w zasobniku S3.

Instalacja

Ten artykuł wykorzystuje kosz S3, więc wymagany jest pakiet AWSSDK.S3.

Rozpocznij używanie IronQR w swoim projekcie już dziś dzięki darmowej wersji próbnej.

Pierwszy krok:
green arrow pointer

Utwórz projekt AWS Lambda

Dzięki Visual Studio tworzenie kontenerowej funkcji AWS Lambda jest łatwym procesem:

  • Zainstaluj AWS Toolkit for Visual Studio
  • Wybierz "Projekt AWS Lambda (.NET Core – C#)"
  • Wybierz szablon ".NET 8 (obraz kontenera)", a następnie kliknij "Zakończ".

Wybierz obraz kontenera

Dodaj zależności pakietów

Biblioteka IronQR w .NET 8 działa na AWS Lambda bez konieczności instalowania dodatkowych zależności. Aby ją skonfigurować, zmodyfikuj Dockerfile projektu jak poniżej:

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

Modyfikacja kodu FunctionHandler

Ten przykład tworzy kod QR, przesyła go do zasobnika S3 i odczytuje nowo wygenerowany kod QR.

Ścieżka pliku jest określona w katalogu IronQrNuGet, a jako nazwa pliku używany jest unikalny globalnie identyfikator (GUID). Metoda Write generuje kod QR na podstawie podanej wartości, a wynikowa tablica bajtów JPG jest następnie przekazywana do metody Read w celu odczytania kodu QR. To pokazuje, że ta funkcja AWS Lambda jest zdolna do odczytywania kodów 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);
            }
        }
    }
}
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)

        ''' <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 Function FunctionHandler(context As ILambdaContext) As Task
            ' Set the license key for IronQR
            IronQr.License.LicenseKey = "IronQR-MYLICENSE-KEY-1EF01"

            Dim bucketName As String = "deploymenttestbucket"
            Dim objectKey As String = $"IronQrNuGet/{Guid.NewGuid()}.png"

            Try
                ' Create a QR code with the content "12345"
                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}")

                ' Read the QR code
                Dim imageInput As New QrImageInput(myQr.Save())
                Dim reader As New QrReader()
                Dim resultFromByte = reader.Read(imageInput)

                For Each item In resultFromByte
                    ' Log the read value
                    context.Logger.LogLine($"QR value is = {item.Value}")
                Next
            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(bucketName As String, objectKey As String, jpgBytes As Byte()) As Task
            Using memoryStream As New MemoryStream(jpgBytes)
                Dim request As New PutObjectRequest With {
                    .BucketName = bucketName,
                    .Key = objectKey,
                    .InputStream = memoryStream,
                    .ContentType = "image/jpg"
                }

                Await _s3Client.PutObjectAsync(request)
            End Using
        End Function
    End Class
End Namespace
$vbLabelText   $csharpLabel

Zwiększ pamięć i limit czasu

Przydział pamięci dla funkcji Lambda zależy od wielkości dokumentów i liczby przetwarzanych jednocześnie. Na początek ustaw pamięć na 512 MB i limit czasu na 300 sekund w aws-lambda-tools-defaults.json.

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

Jeśli pamięć jest niewystarczająca, program wywoła błąd: 'Runtime exited with error: signal: killed.' Zwiększenie rozmiaru pamięci może pomóc w rozwiązaniu tego problemu. Aby uzyskać dalsze wskazówki, zapoznaj się z artykułem rozwiązywania problemów: AWS Lambda - Runtime Exited Signal: Killed.

Opublikuj

Aby opublikować w Visual Studio, wystarczy kliknąć prawym przyciskiem myszy projekt i wybrać 'Publish to AWS Lambda...' Następnie skonfiguruj wymagane ustawienia. Więcej informacji znajdziesz na stronie AWS.

Wypróbuj!

Funkcję Lambda można aktywować za pomocą konsoli Lambda lub programu Visual Studio.

Często Zadawane Pytania

Jak mogę zintegrować bibliotekę kodów QR z moim projektem C# na AWS Lambda?

Możesz zintegrować bibliotekę kodów QR, taką jak IronQR, ze swoim projektem C# w AWS Lambda, pobierając bibliotekę IronQR, tworząc kontenerowy projekt AWS Lambda za pomocą Visual Studio i konfigurując swoje środowisko tak, aby obsługiwało operacje związane z kodami QR.

Jakie kroki należy wykonać, aby skonfigurować IronQR dla AWS Lambda?

Skonfiguruj IronQR dla AWS Lambda, tworząc szablon projektu kontenerowego w Visual Studio, modyfikując plik Dockerfile, aktualizując FunctionHandler oraz dostosowując ustawienia pamięci i limitów czasu, aby zapewnić płynne działanie.

Jak zarządzać kodami QR w AWS S3 przy użyciu biblioteki C#?

Za pomocą IronQR można zarządzać kodami QR poprzez tworzenie, przesyłanie i odczytywanie ich z zasobników AWS S3. Wymaga to użycia biblioteki IronQR w połączeniu z pakietem AWSSDK.S3 do obsługi operacji z zasobnikami S3.

Co należy zrobić, jeśli funkcja AWS Lambda korzystająca z IronQR nie działa prawidłowo?

Jeśli Twoja funkcja AWS Lambda nie działa prawidłowo, rozważ zwiększenie ustawień pamięci i limitu czasu w pliku aws-lambda-tools-defaults.json, aby przydzielić więcej zasobów dla tej funkcji.

Jak wdrożyć funkcję Lambda w języku C# w AWS?

Wdroż funkcję Lambda w AWS, korzystając z opcji „Publish to AWS Lambda...” w Visual Studio, konfigurując niezbędne ustawienia i wykorzystując AWS Toolkit do wdrożenia.

Czy można przetestować moją funkcję AWS Lambda w Visual Studio?

Tak, możesz przetestować swoją funkcję AWS Lambda w Visual Studio, używając zestawu narzędzi AWS Toolkit do wywołania funkcji i sprawdzenia jej wyników bezpośrednio w swoim środowisku programistycznym.

Jak mogę rozwiązać problemy z pamięcią w mojej funkcji AWS Lambda?

Aby rozwiązać problemy z pamięcią, zwiększ przydział pamięci funkcji w pliku aws-lambda-tools-defaults.json i monitoruj wydajność funkcji po ponownym wdrożeniu.

What is the importance of modifying the Dockerfile in an AWS Lambda project?

Modifying the Dockerfile in an AWS Lambda project is crucial for setting up the environment correctly, including updating repositories and copying necessary build artifacts for the function to execute properly.

How do I ensure my AWS Lambda function handles QR code operations efficiently?

Ensure your AWS Lambda function handles QR code operations efficiently by optimizing memory and timeout settings, using proper libraries like IronQR, and configuring the Dockerfile and project settings correctly.

Can I automate QR code generation and retrieval in AWS Lambda?

Yes, you can automate QR code generation and retrieval in AWS Lambda using IronQR. The library allows you to programmatically create QR codes, upload them to S3, and read them back as needed.

Curtis Chau
Autor tekstów technicznych

Curtis Chau posiada tytuł licencjata z informatyki (Uniwersytet Carleton) i specjalizuje się w front-endowym rozwoju, z ekspertką w Node.js, TypeScript, JavaScript i React. Pasjonuje się tworzeniem intuicyjnych i estetycznie przyjemnych interfejsów użytkownika, Curtis cieszy się pracą z nowoczesnymi frameworkami i tworzeniem dobrze zorganizowanych, atrakcyjnych wizualnie podrę...

Czytaj więcej
Gotowy, aby rozpocząć?
Nuget Pliki do pobrania 63,676 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package IronQR
uruchom próbkę obserwuj, jak Twój URL staje się kodem QR.