如何在 AWS Lambda 上读取和写入二维码

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to 如何在 AWS Lambda 上读取和写入二维码

本文提供了使用 IronQR 设置 AWS Lambda 函数的详细指南。 在本教程中,您将学习如何配置 IronQR,以便直接向 S3 存储桶读取和写入二维码。

安装

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

今天在您的项目中使用 IronQR,免费试用。

第一步:
green arrow pointer

创建 AWS Lambda 项目

使用 Visual Studio 创建容器化的 AWS Lambda 是一个简单的过程:

选择容器图像

添加包依赖项

.NET 8 中的 IronQR 库可在 AWS Lambda 上运行,无需额外的依赖项。 要进行配置,请按如下所示修改项目的 Dockerfile:

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

修改 FunctionHandler 代码

本示例生成一个二维码,将其上传到 S3 存储桶,并读取新生成的二维码。

文件路径在 IronQrNuget 目录中指定,文件名使用全局唯一标识符 (GUID)。 Write方法根据提供的值生成二维码,然后将生成的 JPG 字节数组传递给Read方法以读取二维码。 这证明该 AWS Lambda 函数能够读取二维码。

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(ByVal 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 item
			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(ByVal bucketName As String, ByVal objectKey As String, ByVal jpgBytes() As Byte) As Task
			Using memoryStream As New MemoryStream(jpgBytes)
				Dim request = 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

增加内存和超时

Lambda 函数的内存分配取决于文档的大小和同时处理的文档数量。 首先,在aws-lambda-tools-defaults.json中将内存设置为 512 MB,超时设置为 300 秒。

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

如果内存不足,程序将引发错误:"运行时错误退出:信号:终止"。增加内存大小可以帮助解决此问题。 如需进一步指导,请查看故障排除文章: AWS Lambda - 运行时退出信号:已终止

发布

要在 Visual Studio 中发布,只需右键单击项目,然后选择"发布到 AWS Lambda..." 然后,配置所需的设置。 如需了解更多信息,请访问AWS 网站

试一试!

您可以通过 Lambda 控制台 或通过 Visual Studio 激活 Lambda 函数。

常见问题解答

如何将 QR 码库集成到我的 AWS Lambda C# 项目中?

您可以通过下载 IronQR 库、使用 Visual Studio 创建一个容器化的 AWS Lambda 项目并配置您的环境来支持 QR 码操作,将 QR 码库如 IronQR 集成到您的 C# 项目中。

配置 IronQR 以用于 AWS Lambda 的步骤有哪些?

通过在 Visual Studio 中设置容器化项目模板、修改 Dockerfile、更新 FunctionHandler 以及调整内存和超时设置来配置 IronQR 用于 AWS Lambda,以确保顺利运行。

如何使用 AWS S3 通过 C# 库管理 QR 码?

使用 IronQR 可以通过创建、上传到 AWS S3 存储桶并从中读取来管理 QR 码。这涉及到与 AWSSDK.S3 包结合利用 IronQR 库处理 S3 存储桶的操作。

如果我的 AWS Lambda 函数使用 IronQR 性能不佳,我该怎么办?

如果您的 AWS Lambda 函数性能不佳,请考虑在 aws-lambda-tools-defaults.json 文件中增加内存和超时设置,以为该功能分配更多资源。

如何将 C# Lambda 函数部署到 AWS?

通过使用 Visual Studio 的“发布到 AWS Lambda...”选项,配置必要的设置,并利用 AWS Toolkit 执行部署,将 C# Lambda 函数部署到 AWS。

是否可以在 Visual Studio 中测试我的 AWS Lambda 功能?

是的,您可以使用 AWS Toolkit 直接在开发环境中调用函数并验证输出,在 Visual Studio 中测试您的 AWS Lambda 功能。

如何解决我的 AWS Lambda 功能的内存问题?

要解决内存问题,请增加在 aws-lambda-tools-defaults.json 文件中的功能内存分配,并在重新部署后监控功能的性能。

修改 AWS Lambda 项目中的 Dockerfile 有什么重要性?

在 AWS Lambda 项目中修改 Dockerfile 对于正确地设置环境至关重要,包括更新存储库和复制必要的构建工件以使功能正常执行。

如何确保我的 AWS Lambda 功能有效地处理 QR 码操作?

通过优化内存和超时设置,使用适当的库如 IronQR,并正确配置 Dockerfile 和项目设置,确保您的 AWS Lambda 功能有效地处理 QR 码操作。

我可以在 AWS Lambda 中自动化 QR 码的生成和检索吗?

是的,您可以使用 IronQR 在 AWS Lambda 中自动化 QR 码的生成和检索。该库允许您以编程方式创建 QR 码,将其上传到 S3,并根据需要进行读取。

Curtis Chau
技术作家

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

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

准备开始了吗?
Nuget 下载 51,390 | Version: 2025.11 刚刚发布