Jak odczytywać i zapisywać kody kreskowe na AWS Lambda

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

Ten artykuł krok po kroku dostarcza kompleksowy przewodnik dotyczący tworzenia funkcji AWS Lambda z użyciem IronBarcode. W tym przewodniku dowiesz się, jak skonfigurować IronBarcode do odczytu i zapisu kodów kreskowych z i do kosza S3.

Instalacja

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

Korzystanie z IronBarcode ZIP

Jeśli korzystasz z IronBarcode ZIP, konieczne jest ustawienie folderu tymczasowego.

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

Do odczytu BarCodes wymagany jest pakiet Microsoft.ML.OnnxRuntime. Chociaż zapisywanie BarCodes działa dobrze bez tego, domyślny tryb odczytu opiera się na uczeniu maszynowym (ML). Jeśli przełączysz się na tryb czytania, który nie wykorzystuje ML, pakiet nie jest potrzebny.

Utwórz projekt AWS Lambda

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

  • Zainstaluj zestaw narzędzi AWS Toolkit dla 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 IronBarcode w .NET 8 działa na AWS Lambda bez konieczności stosowania dodatkowych zależności. Aby to skonfigurować, zaktualizuj plik Dockerfile projektu w następujący sposób:

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

Modyfikacja kodu FunctionHandler

Ten przykład generuje kod kreskowy EAN8, przesyła go do zasobnika S3 i odczytuje nowo utworzony kod kreskowy. Podczas korzystania z IronBarcode ZIP kluczowe znaczenie ma skonfigurowanie folderu tymczasowego, ponieważ biblioteka IronBarcode potrzebuje uprawnień do zapisu, aby skopiować folder uruchomieniowy z bibliotek DLL.

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

Przed blokiem try miejsce docelowe pliku jest ustawione na katalog IronBarcodeZip, a nazwa generowana jest jako globalny unikalny identyfikator (GUID). Metoda CreateBarcode jest używana do generowania kodu kreskowego. Następnie tablica bajtów PNG jest przekazywana do metody Read w celu odczytu kodu kreskowego. To pokazuje, że funkcja AWS Lambda jest w stanie odczytywać kody kreskowe.

Metoda Read również przyjmuje obiekt BarcodeReaderOptions, który można dostosować do aktywacji funkcji takich jak odczyt wielu kodów kreskowych, targetowanie konkretnych obszarów, użycie przetwarzania asynchronicznego i wielowątkowego, zastosowanie filtrów korekcji obrazu i wiele więcej.

Zwiększ pamięć i limit czasu

Ilość pamięci przydzielonej w funkcji Lambda będzie się różnić w zależności od rozmiaru przetwarzanych dokumentów i liczby dokumentów przetwarzanych jednocześnie. Jako podstawowe ustawienie ustaw pamięć na 512 MB i limit czasu na 300 sekund w aws-lambda-tools-defaults.json.

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

Gdy pamięć jest niewystarczająca, program wyświetli błąd: "Runtime zakończył działanie z błędem: sygnał: zabity". Zwiększenie rozmiaru pamięci może rozwiązać ten problem. Więcej szczegółów można znaleźć w artykule dotyczącym rozwiązywania problemów: AWS Lambda — sygnał zakończenia działania środowiska uruchomieniowego: Killed.

Opublikuj

Aby opublikować w Visual Studio, kliknij prawym przyciskiem myszy na projekt i wybierz "Publish to AWS Lambda...", a następnie skonfiguruj niezbędne ustawienia. Więcej informacji na temat publikowania funkcji Lambda można znaleźć na stronie internetowej AWS.

Wypróbuj!

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

Często Zadawane Pytania

Jak skonfigurować odczyt i zapis BarCode w AWS Lambda?

Aby skonfigurować odczyt i zapis kodów kreskowych w AWS Lambda, należy pobrać bibliotekę IronBarcode i utworzyć projekt AWS Lambda w programie Visual Studio. Należy zmodyfikować kod FunctionHandler w celu obsługi operacji związanych z kodami kreskowymi, skonfigurować ustawienia projektu i wdrożyć go. Należy upewnić się, że uwzględniono niezbędne zależności pakietów, takie jak AWSSDK.S3.

Jakie pakiety są wymagane do przetwarzania kodów kreskowych w AWS Lambda?

W przypadku przetwarzania kodów kreskowych w AWS Lambda należy uwzględnić pakiet AWSSDK.S3 do interakcji z S3 oraz opcjonalnie pakiet Microsoft.ML.OnnxRuntime do zaawansowanego odczytu kodów kreskowych z wykorzystaniem uczenia maszynowego, który może nie być wymagany w przypadku stosowania standardowych metod odczytu kodów kreskowych.

Jak mogę zmodyfikować kod FunctionHandler w AWS Lambda dla zadań związanych z kodami barcode?

Zmodyfikuj kod FunctionHandler, aby tworzyć i odczytywać kody kreskowe przy użyciu IronBarcode. Upewnij się, że ustawiłeś klucz licencyjny IronBarcode i skonfigurowałeś folder tymczasowy, aby pliki ZIP IronBarcode działały poprawnie.

Jak zwiększyć pamięć i limit czasu dla funkcji AWS Lambda obsługującej kody kreskowe?

Dostosuj ustawienia pamięci i limitu czasu w pliku aws-lambda-tools-defaults.json, ustawiając function-memory-size na 512 MB, a function-timeout na 300 sekund, aby sprostać wymaganiom przetwarzania kodów kreskowych za pomocą IronBarcode.

Jak opublikować funkcję Lambda za pomocą Visual Studio w celu przetwarzania kodów barcode?

Opublikuj funkcję Lambda, klikając prawym przyciskiem myszy projekt w Visual Studio, wybierając opcję „Publikuj w AWS Lambda...” i konfigurując ustawienia. Postępuj zgodnie z dokumentacją AWS, aby uzyskać szczegółowe instrukcje, upewniając się, że IronBarcode jest poprawnie skonfigurowany.

Jak mogę przetestować wdrożoną funkcję AWS Lambda do obsługi kodów kreskowych BarCode?

Przetestuj funkcję Lambda, aktywując ją za pośrednictwem konsoli AWS Lambda lub bezpośrednio z Visual Studio, upewniając się, że IronBarcode działa poprawnie, a zadania związane z przetwarzaniem kodów kreskowych są wykonywane zgodnie z oczekiwaniami.

Jaka jest rola pliku Dockerfile w konfiguracji przetwarzania BarCode w AWS Lambda?

Plik Dockerfile pomaga w aktualizacji niezbędnych pakietów i kopiowaniu artefaktów kompilacji projektu .NET Lambda do obrazu, ułatwiając płynne przetwarzanie kodów kreskowych za pomocą IronBarcode na AWS Lambda.

Dlaczego ustawienie folderu tymczasowego jest ważne podczas korzystania z bibliotek BarCode w AWS Lambda?

Ustawienie folderu tymczasowego jest niezbędne, ponieważ IronBarcode wymaga uprawnień do zapisu dla operacji ZIP, co zapewnia prawidłowe skopiowanie folderów uruchomieniowych z bibliotek DLL w celu płynnego działania na AWS Lambda.

Czy mogę dostosować odczyt kodów kreskowych w AWS Lambda?

Tak, IronBarcode umożliwia dostosowanie odczytu kodów kreskowych za pomocą BarcodeReaderOptions, co obejmuje odczyt wielu kodów kreskowych, wybieranie określonych obszarów, włączanie przetwarzania asynchronicznego oraz stosowanie filtrów korekcji obrazu.

Co należy zrobić, jeśli podczas przetwarzania kodów kreskowych pojawi się błąd „Runtime exited with error: signal: killed”?

Ten błąd sugeruje niewystarczającą alokację pamięci. Zwiększ pamięć dla funkcji Lambda w pliku aws-lambda-tools-defaults.json, aby rozwiązać ten problem podczas korzystania z IronBarcode.

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 2,145,441 | Wersja: 2026.4 just released
Still Scrolling Icon

Wciąż przewijasz?

Czy chcesz szybko dowodu? PM > Install-Package BarCode
uruchom przykład zobacz, jak twoje ciągi zamieniają się w kody kreskowe.