How to Read & Write Barcode on AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
class="container-fluid">
class="row">
class="col-md-2"> AWS Lambda

這篇操作指南提供了如何使用 IronBarcode 設置 AWS Lambda 函數的詳細指南。 在本指南中,您將學習如何配置 IronBarcode 以從 S3 存儲桶中讀取和寫入條碼。

class="hsg-featured-snippet">

如何在 AWS Lambda 上讀寫條碼

  1. 下載 C# 庫以讀寫條碼
  2. 創建並選擇項目模板
  3. 修改 FunctionHandler 代碼
  4. 配置並部署項目
  5. 調用函數並在 S3 中檢查結果

安裝

本文將使用 S3 存儲桶,因此需要 AWSSDK.S3 包。

使用 IronBarcode Zip

如果您使用 IronBarcode ZIP,則必須設置臨時文件夾。

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

讀取條碼需要 Microsoft.ML.OnnxRuntime 包。 雖然寫入條碼時正常運行,但默認的讀取模式依賴於機器學習(ML)。 如果切換到不使用 ML 的讀取模式,則不需要該包。

創建 AWS Lambda 項目

使用 Visual Studio,創建一個容器化的 AWS Lambda 是一個簡單的過程:

  • 安裝 AWS Toolkit for Visual Studio
  • 選擇 'AWS Lambda Project (.NET Core - C#)'
  • 選擇 '.NET 8 (Container Image)' 藍圖,然後選擇 'Finish'。

選擇容器映像

添加包依賴項

在 .NET 8 中的 IronBarcode 庫可以在 AWS Lambda 上運行,而不需要額外的依賴項。 要設置它,請按以下方式更新項目的 Dockerfile:

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

修改 FunctionHandler 代碼

此示例生成一個 EAN8 條碼,將其上傳到 S3 存儲桶,並讀取新創建的條碼。 使用 IronBarcode ZIP 時,配置臨時文件夾很重要,因為庫需要寫入權限來從 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

在嘗試塊之前,文件目標設置為 IronBarcodeZip 目錄,名稱生成為全局唯一標識符 (GUID)。 CreateBarcode 方法用於生成條碼。 之後,PNG 字節數組傳遞給 Read 方法以讀取條碼。 這表明 AWS Lambda 函數能夠讀取條碼。

The Read method also accepts a BarcodeReaderOptions object, which you can customize to enable features such as reading multiple barcodes, targeting specific areas, using asynchronous and multithreaded processing, applying image correction filters, and much more.

增加內存和超時

Lambda 函數中分配的內存量將根據處理的文檔大小和同時處理的文檔數量而有所不同。 作為基線,將內存設置為 512 MB,將超時設置為 300 秒,位於 aws-lambda-tools-defaults.json

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

當內存不足時,程序將拋出錯誤:'Runtime exited with error: signal: killed.' 增加內存大小可以解決此問題。 有關更多詳細信息,請參考故障排除文章:AWS Lambda - Runtime Exited Signal: Killed

發布

要在 Visual Studio 中發布,右鍵單擊項目,選擇 'Publish to AWS Lambda...',然後配置必要的設置。 您可以在 AWS 網站 上閱讀有關發布 Lambda 的更多信息。

試試看!

您可以通過 Lambda 控制台或通過 Visual Studio 啟動 Lambda 函數。

常見問題解答

如何在AWS Lambda上設定條碼讀寫?

若要在 AWS Lambda 上設定條碼讀寫功能,請使用 IronBarcode 庫。下載庫,然後使用 Visual Studio 建立一個 AWS Lambda 專案。修改FunctionHandler程式碼以處理條碼操作,配置專案設置,然後部署專案。確保包含必要的軟體包依賴項,例如 AWSSDK.S3。

在 AWS Lambda 上進行條碼處理需要哪些軟體包?

對於 AWS Lambda 上的條碼處理,需要包含用於 S3 互動的 AWSSDK.S3 套件,以及用於高階機器學習條碼讀取的選用 Microsoft.ML.OnnxRuntime 套件(如果使用標準條碼讀取方法,則可能不需要此套件)。

如何修改 AWS Lambda 中用於條碼任務的 FunctionHandler 程式碼?

修改FunctionHandler程式碼,使其能夠使用 IronBarcode 建立和讀取條碼。請確保設定 IronBarcode 許可證金鑰並配置臨時資料夾,以便 IronBarcode ZIP 檔案正常運作。

如何增加處理條碼的 AWS Lambda 函數的記憶體和逾時時間?

透過將 function-memory-size 設為 512 MB 並將 function-timeout 設為 300 秒,調整aws-lambda-tools-defaults.json檔案中的記憶體和逾時設置,以滿足 IronBarcode 的條碼處理需求。

如何使用 Visual Studio 發布用於條碼處理的 Lambda 函數?

在 Visual Studio 中右鍵點選項目,選擇“發佈到 AWS Lambda...”,然後配置設置,即可發布 Lambda 函數。請依照 AWS 文件中的詳細步驟操作,並確保 IronBarcode 設定正確。

如何測試已部署的用於條碼操作的 AWS Lambda 函數?

透過 AWS Lambda 控制台或直接從 Visual Studio 啟動 Lambda 函數來測試它,確保 IronBarcode 運作正常,並且條碼處理任務按預期執行。

Dockerfile 在 AWS Lambda 上設定條碼處理中扮演什麼角色?

Dockerfile 有助於更新必要的軟體包並將 .NET Lambda 專案的建置工件複製到映像中,從而在 AWS Lambda 上使用 IronBarcode 實現無縫的條碼處理。

在 AWS Lambda 上使用條碼庫時,為什麼設定臨時資料夾很重要?

設定臨時資料夾至關重要,因為 IronBarcode 需要寫入權限才能執行 ZIP 操作,從而確保執行時間資料夾能夠從 DLL 正確複製,以便在 AWS Lambda 上順利運行。

我可以在 AWS Lambda 上自訂條碼讀取功能嗎?

是的,IronBarcode 允許使用BarcodeReaderOptions自訂條碼讀取,包括讀取多個條碼、定位特定區域、啟用非同步處理以及應用影像校正濾鏡。

如果在條碼處理過程中遇到「運行時因錯誤而退出:訊號:已終止」錯誤,我該怎麼辦?

此錯誤表示記憶體分配不足。請在aws-lambda-tools-defaults.json檔案中增加 Lambda 函數的內存,以解決使用 IronBarcode 時遇到的問題。

Curtis Chau
技術作家

Curtis Chau 擁有卡爾頓大學計算機科學學士學位,專注於前端開發,擅長於 Node.js、TypeScript、JavaScript 和 React。Curtis 熱衷於創建直觀且美觀的用戶界面,喜歡使用現代框架並打造結構良好、視覺吸引人的手冊。

除了開發之外,Curtis 對物聯網 (IoT) 有著濃厚的興趣,探索將硬體和軟體結合的創新方式。在閒暇時間,他喜愛遊戲並構建 Discord 機器人,結合科技與創意的樂趣。

準備好開始了嗎?
Nuget 下載 1,935,276 | 版本: 2025.11 剛剛發布