AWS LambdaでQRコードを読み書きする方法

This article was translated from English: Does it need improvement?
Translated
View the article in English
Amazon Lambda Architecture Logo related to AWS LambdaでQRコードを読み書きする方法

このハウツー記事は、IronQRを使用してAWS Lambda関数をセットアップするための詳細なガイドを提供します。 このチュートリアルでは、S3バケットにQRコードを直接読み書きするためにIronQRを設定する方法を学びます。

インストール

この記事ではS3バケットを使用するため、AWSSDK.S3パッケージが必要です。

今日あなたのプロジェクトでIronQRを無料トライアルで使用開始。

最初のステップ:
green arrow pointer

AWS Lambdaプロジェクトを作成する

Visual Studioを使用すると、コンテナ化されたAWS Lambdaの作成は簡単なプロセスです:

  • AWS Toolkit for Visual Studioをインストールする
  • 'AWS Lambda Project (.NET Core - C#)'を選択する
  • '.NET 8 (Container Image)' ブループリントを選択し、'Finish'を選択する。

コンテナイメージを選択する

パッケージ依存関係を追加する

.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コードを修正する

この例では、QRコードを作成し、それをS3バケットにアップロードし、新しく生成されたQRコードを読み取ります。

ファイルパスはIronQrNugetディレクトリに指定されており、グローバルに一意な識別子(GUID)がファイル名として使用されます。 Writeメソッドは、提供された値に基づいてQRコードを生成し、その結果のJPGバイト配列はReadメソッドに渡され、QRコードの読み取りが行われます。 これにより、このAWS Lambda関数がQRコードを読み取る能力があることを示します。

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

メモリが不足していると、プログラムはエラーを引き起こします:'Runtime exited with error: signal: killed.' この問題を解決するには、メモリのサイズを増やすことができます。 さらにガイダンスが必要な場合は、トラブルシューティング記事を確認してください:AWS Lambda - Runtime Exited Signal: Killed

公開

Visual Studioで公開するには、プロジェクトを右クリックして"Publish to AWS Lambda…"を選択し、必要な設定を構成します。 詳細については、AWSのウェブサイトをご覧ください。

試してみてください!

Lambda関数はLambdaコンソールまたはVisual Studioを通じてアクティブ化することができます。

よくある質問

AWS Lambda 上の C# プロジェクトに QR コードライブラリを統合するにはどうすればよいですか?

QRコードライブラリ(IronQRなど)をAWS LambdaのC#プロジェクトに統合するには、IronQRライブラリをダウンロードし、Visual Studioを使用してコンテナ化されたAWS Lambdaプロジェクトを作成し、QRコード操作をサポートするように環境を設定します。

AWS Lambda 用の IronQR を設定する手順は何ですか?

Visual Studio でコンテナ化されたプロジェクトテンプレートを設定し、Dockerfile を修正し、FunctionHandler を更新し、スムーズな操作を確保するためにメモリとタイムアウト設定を調整することで、AWS Lambda 用の IronQR を設定します。

C# ライブラリを使用して AWS S3 で QR コードを管理するにはどうすればよいですか?

IronQR を使用すると、QR コードを作成し、AWS S3 バケットにアップロードして、そこから読み取ることができます。これは、IronQR ライブラリを利用して、AWSSDK.S3 パッケージと組み合わせて S3 バケットとの操作を処理します。

IronQR を使用している AWS Lambda 関数のパフォーマンスが良くない場合はどうすればいいですか?

AWS Lambda 関数がパフォーマンスが良くない場合、aws-lambda-tools-defaults.json ファイルでメモリとタイムアウト設定を増やし、関数により多くのリソースを割り当てることを検討してください。

C# Lambda 関数を AWS に展開するにはどうすればよいですか?

Visual Studio の「'Publish to AWS Lambda...'」オプションを使用し、必要な設定を行い、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は、カールトン大学でコンピュータサイエンスの学士号を取得し、Node.js、TypeScript、JavaScript、およびReactに精通したフロントエンド開発を専門としています。直感的で美しいユーザーインターフェースを作成することに情熱を持ち、Curtisは現代のフレームワークを用いた開発や、構造の良い視覚的に魅力的なマニュアルの作成を楽しんでいます。

開発以外にも、CurtisはIoT(Internet of Things)への強い関心を持ち、ハードウェアとソフトウェアの統合方法を模索しています。余暇には、ゲームをしたりDiscordボットを作成したりして、技術に対する愛情と創造性を組み合わせています。

準備はできましたか?
Nuget ダウンロード 51,390 | Version: 2025.11 リリース