How to Read & Write QR Codes on AWS Lambda

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to How to Read & Write QR Codes on AWS Lambda

This how-to article offers a detailed guide for setting up an AWS Lambda function with IronQR. In this tutorial, you will discover how to configure IronQR for reading and writing QR codes directly to an S3 bucket.

Installation

This article will use an S3 bucket, so the AWSSDK.S3 package is required.

立即開始在您的項目中使用 IronQR 並免費試用。

第一步:
green arrow pointer

Create an AWS Lambda Project

With Visual Studio, creating a containerized AWS Lambda is an easy process:

  • Install the AWS Tookit for Visual Studio
  • Select an 'AWS Lambda Project (.NET Core - C#)'
  • Select a '.NET 8 (Container Image)' blueprint, then select 'Finish'.

Select container image

Add Package Dependencies

The IronQR library in .NET 8 operates on AWS Lambda without requiring additional dependencies. To configure it, modify the project's Dockerfile as shown below:

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

Modify the FunctionHandler Code

This example creates a QR code, uploads it to an S3 bucket, and reads the newly generated QR code.

The file path is specified in the IronQrNuget directory, with a globally unique identifier (GUID) used as the file name. The Write method generates the QR code based on the provided value, and the resulting JPG byte array is then passed to the Read method for reading the QR code. This demonstrates that this AWS Lambda function is capable of reading QR codes.

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

Increase Memory and Timeout

The memory allocation for the Lambda function depends on the size of the documents and the number processed simultaneously. As a starting point, set the memory to 512 MB and the timeout to 300 seconds in the aws-lambda-tools-defaults.json.

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

If the memory is insufficient, the program will raise the error: 'Runtime exited with error: signal: killed.' Increasing the memory size can help resolve this issue. For further guidance, check the troubleshooting article: AWS Lambda - Runtime Exited Signal: Killed.

Publish

To publish in Visual Studio, simply right-click the project and choose 'Publish to AWS Lambda...' Then, configure the required settings. For more information, visit the AWS website.

Try It Out!

You can activate the Lambda function either through the Lambda console or through Visual Studio.

常見問題解答

如何將 QR 碼庫集成到我的 C# 項目中在 AWS Lambda 上?

您可以通過下載 IronQR 庫,在 Visual Studio 中創建容器化的 AWS Lambda 項目,並配置您的環境以支持 QR 碼操作,將像 IronQR 這樣的 QR 碼庫集成到您的 C# 項目中在 AWS Lambda 上。

配置 IronQR 用於 AWS Lambda 的步驟是什麼?

通過在 Visual Studio 中設置容器化專案模板,修改 Dockerfile,更新 FunctionHandler 並調整記憶體和超時設置來配置 IronQR 用於 AWS Lambda 以確保穩定運行。

如何使用 C# 庫管理與 AWS S3 的 QR 碼?

使用 IronQR,您可以通過創建、上傳到和從 AWS S3 存儲桶中讀取來管理 QR 碼。這涉及使用 IronQR 庫與 AWSSDK.S3 套件配合處理 S3 存儲桶操作。

如果我使用 IronQR 的 AWS Lambda 函數運行不佳,我應該怎麼做?

如果您的 AWS Lambda 函數運行不佳,請考慮在您的 aws-lambda-tools-defaults.json 文件中增加記憶體和超時設置以分配更多資源給函數。

如何將 C# Lambda 函數部署到 AWS?

通過 Visual Studio 的 "發布到 AWS Lambda..." 選項部署 C# Lambda 函數到 AWS,配置必要的設置,並利用 AWS Toolkit 進行部署。

是否可以在 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 碼操作?

確保您的 AWS Lambda 函數有效處理 QR 碼操作的方法是優化記憶體和超時設置,使用像 IronQR 這樣的合適庫,並正確配置 Dockerfile 和專案設置。

我可以在 AWS Lambda 中自動生成和檢索 QR 碼嗎?

是的,您可以使用 IronQR 在 AWS Lambda 中自動生成和檢索 QR 碼。該庫允許您以編程方式創建 QR 碼,將其上傳到 S3 並根據需要讀回。

Curtis Chau
技術作家

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

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

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