如何在 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"  .

修改函數處理程序程式碼

此範例產生一個二維碼,將其上傳到 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);
            }
        }
    }
}
$vbLabelText   $csharpLabel

增加記憶體和超時

Lambda 函數的記憶體分配取決於文件​​的大小和同時處理的文件數量。 首先,將記憶體設定為 512 MB,逾時設定為 300 秒。

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

如果記憶體不足,程式將引發錯誤:"運行時錯誤退出:訊號:已終止"。增加記憶體大小可以幫助解決此問題。 如需進一步指導,請查看故障排除文章: AWS Lambda - 執行時間退出訊號:已終止

發布

要在 Visual Studio 中發布,只需右鍵單擊項目,然後選擇"發佈到 AWS Lambda..." 然後,配置所需的設定。 如需了解更多信息,請訪問AWS 網站

試試看!

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

常見問題解答

如何將 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 下載 62,157 | 版本: 2026.3 剛剛發布
Still Scrolling Icon

還在捲動嗎?

想要快速證明? PM > Install-Package IronQR
執行範例 觀看您的 URL 變成 QR code。