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)' 蓝图,然后选择 '完成'。

选择容器图像

添加包依赖项

IronBarcode 库在 .NET 8 中无需额外依赖项即可在 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 时,配置临时文件夹至关重要,因为库需要写入权限以从 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);
        }
    }
}
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

在 try 块之前,文件目标被设置为 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 - 运行时退出信号:被杀死

发布

要在 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 函数的内存和超时时间?

通过在 aws-lambda-tools-defaults.json 文件中设置函数内存大小为 512 MB,超时时间为 300 秒来调整内存和超时设置,以满足使用 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 的无缝条码处理。

为什么使用条码库时设置临时文件夹很重要?

设置临时文件夹很重要,因为 IronBarcode 需要写权限以进行 ZIP 操作,确保从 DLL 正确复制运行时文件夹以在 AWS Lambda 上顺利运行。

我可以自定义 AWS Lambda 上的条码读取吗?

是的,IronBarcode 允许使用 BarcodeReaderOptions 自定义条码读取,包括读取多个条码,定位特定区域,启用异步处理和应用图像校正过滤器。

如果在条码处理过程中遇到“Runtime exited with error: signal: killed”错误该怎么办?

此错误表示内存分配不足。增加 Lambda 函数在 aws-lambda-tools-defaults.json 文件中的内存以解决使用 IronBarcode 的问题。

Curtis Chau
技术作家

Curtis Chau 拥有卡尔顿大学的计算机科学学士学位,专注于前端开发,精通 Node.js、TypeScript、JavaScript 和 React。他热衷于打造直观且美观的用户界面,喜欢使用现代框架并创建结构良好、视觉吸引力强的手册。

除了开发之外,Curtis 对物联网 (IoT) 有浓厚的兴趣,探索将硬件和软件集成的新方法。在空闲时间,他喜欢玩游戏和构建 Discord 机器人,将他对技术的热爱与创造力相结合。

准备开始了吗?
Nuget 下载 1,935,276 | 版本: 2025.11 刚刚发布