コンテナイメージを使用して.NET の Lambda 関数をデプロイする
.NET Lambda 関数のコンテナイメージを構築するには 3 つの方法があります。
-
AWS ベースイメージには、Lambda と関数コード間のやり取りを管理するランタイムインターフェースクライアント、ローカルテスト用のランタイムインターフェイスエミュレーターがプリロードされています。
-
AWS OS 専用ベースイメージ
には、Amazon Linux ディストリビューションおよびランタイムインターフェイスエミュレータ が含まれています。これらのイメージは、Go や Rust などのコンパイル済み言語や、Lambda がベースイメージを提供していない言語または言語バージョン (Node.js 19 など) のコンテナイメージの作成によく使用されます。OS 専用のベースイメージを使用してカスタムランタイムを実装することもできます。イメージに Lambda との互換性を持たせるには、.NET のランタイムインターフェイスクライアントをイメージに含める必要があります。 -
Alpine Linux や Debian など、別のコンテナレジストリの代替ベースイメージを使用することもできます。組織が作成したカスタムイメージを使用することもできます。イメージに Lambda との互換性を持たせるには、.NET のランタイムインターフェイスクライアントをイメージに含める必要があります。
ヒント
Lambda コンテナ関数がアクティブになるまでの時間を短縮するには、「Docker ドキュメント」の「マルチステージビルドを使用する
このページでは、Lambda のコンテナイメージを構築、テスト、デプロイする方法について説明します。
.NET 用の AWS ベースイメージ
AWSには、.NET 用に次のようなベースイメージが利用できます。
タグ | ランタイム | オペレーティングシステム | Dockerfile | 廃止 |
---|---|---|---|---|
8 |
.NET 8 | Amazon Linux 2023 | GitHub 上の .NET 8 用の Dockerfile |
スケジュールされていません |
6 |
.NET 6 | Amazon Linux 2 | GitHub 上の .NET 6 用の Dockerfile |
2024 年 12 月 20 日 |
Amazon ECR リポジトリ: gallery.ecr.aws/lambda/dotnet
.NET の AWS ベースイメージを使用する
前提条件
このセクションの手順を完了するには、以下が必要です。
ベースイメージを使用したイメージの作成およびデプロイ
次のステップでは、「Amazon.Lambda.Templates
-
Amazon.Lambda.Templates
の NuGet パッケージをインストールします。 dotnet new install Amazon.Lambda.Templates
-
lambda.image.EmptyFunction
テンプレートを使用して.NET プロジェクトを作成します。dotnet new lambda.image.EmptyFunction --name
MyFunction
--regionus-east-1
-
ディレクトリに移動します。ここにプロジェクトファイルが保存されます。次のファイルを確認します。MyFunction
/src/MyFunction
-
aws-lambda-tools-defaults.json - このファイルで、Lambda 関数をデプロイするときにコマンドラインオプションを指定します。
-
Function.cs - Lambda ハンドラーの関数コード。これは、デフォルトの
Amazon.Lambda.Core
ライブラリおよびデフォルトのLambdaSerializer
属性が含まれる C# テンプレートです。シリアル化の要件およびオプションの詳細は、Lambda 関数のシリアル化 を参照してください。提供されるコードをテストに使用することも、独自のコードで置き換えることもできます。 -
MyFunction.csproj - アプリケーションを構成するファイルおよびアセンブリを一覧表示する .NET 「プロジェクトファイル
」。 -
Readme.md — このファイルには、サンプル Lambda 関数に関する詳細が含まれています。
-
-
src/
ディレクトリの Dockerfile を調べます。提供される Dockerfile をテストに使用することも、独自の Dockerfile で置き換えることもできます。独自のものを使用する場合、必ず次のことを行ってください。MyFunction
-
FROM
プロパティを「ベースイメージの URI」に設定します。.NET バージョンは、ベースイメージのバージョンと一致する必要があります。 -
CMD
引数を Lambda 関数ハンドラーに設定します。これは「aws-lambda-tools-defaults.json
」内のimage-command
と一致している必要があります。
この例の Dockerfile には USER 命令
が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、 USER
命令を指定しなかったときにroot
ユーザーのデフォルトとなる動作のことです。例 Dockerfile
# You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM
public.ecr.aws/lambda/dotnet:8
# Copy function code to Lambda-defined environment variable COPY publish/* ${LAMBDA_TASK_ROOT} # Set the CMD to your handler (could also be done as a parameter override outside of the Dockerfile) CMD [ "MyFunction::MyFunction.Function::FunctionHandler
" ] -
-
Amazon.Lambda.Tools の「.NET Global Tool
」をインストールします。 dotnet tool install -g Amazon.Lambda.Tools
Amazon.Lambda.Tools が既にインストールされている場合、最新バージョンであることを確認します。
dotnet tool update -g Amazon.Lambda.Tools
-
まだディレクトリが MyFunction ではない場合、ディレクトリを
に変更します。MyFunction
/src/MyFunction
cd src/
MyFunction
-
Amazon.Lambda.Tools を使用して Docker イメージを構築し、新しい Amazon ECR リポジトリにプッシュして Lambda 関数をデプロイします。
--function-role
では、Amazon リソースネーム(ARN)ではなく、関数の「実行ロール」のロール名を指定します。例えば、lambda-role
と指定します。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
Amazon.Lambda.Tools の .NET Global Tool の詳細については、GitHub の AWS Extensions for .NET CLI
リポジトリを参照してください。 -
関数を呼び出します。
dotnet lambda invoke-function
MyFunction
--payload "Testing the function"すべてが成功すると、次のメッセージが表示されます。
Payload: "TESTING THE FUNCTION" Log Tail: START RequestId:
id
Version: $LATEST END RequestId:id
REPORT RequestId:id
Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB -
Lambda 関数を削除する
dotnet lambda delete-function
MyFunction
ランタイムインターフェイスクライアントで代替ベースイメージを使用する
OS 専用ベースイメージまたは代替のベースイメージを使用する場合、イメージにランタイムインターフェイスクライアントを含める必要があります。ランタイムインターフェイスクライアントは、Lambda と関数コード間の相互作用を管理する カスタムランタイムに Lambda ランタイム API を使用する を拡張します。
次の例は、非 AWS ベースイメージを使用して .NET 用のコンテナイメージを構築する方法と、.NET 用の Lambda ランタイムインターフェースクライアントである Amazon.Lambda.RuntimeSupport パッケージ
前提条件
このセクションの手順を完了するには、以下が必要です。
代替的なベースイメージを使用したイメージの作成およびデプロイ
-
Amazon.Lambda.Templates
の NuGet パッケージをインストールします。 dotnet new install Amazon.Lambda.Templates
-
lambda.CustomRuntimeFunction
テンプレートを使用して.NET プロジェクトを作成します。このテンプレートには Amazon.Lambda.RuntimeSupportパッケージが含まれています。 dotnet new lambda.CustomRuntimeFunction --name
MyFunction
--regionus-east-1
-
ディレクトリに移動します。ここにプロジェクトファイルが保存されます。次のファイルを確認します。MyFunction
/src/MyFunction
-
aws-lambda-tools-defaults.json - このファイルで、Lambda 関数をデプロイするときにコマンドラインオプションを指定します。
-
Function.cs — コードには、
Amazon.Lambda.RuntimeSupport
ライブラリをブートストラップとして初期化するMain
メソッドを持つクラスが含まれています。Main
メソッドは、関数のプロセスのエントリポイントです。このMain
メソッドは、ブートストラップが処理できるラッパーで関数ハンドラをラップします。詳細については、GitHub リポジトリの「Amazon.Lambda.RuntimeSupport をクラスライブラリとして使用する」を参照してください。 -
MyFunction.csproj - アプリケーションを構成するファイルおよびアセンブリを一覧表示する .NET 「プロジェクトファイル
」。 -
Readme.md — このファイルには、サンプル Lambda 関数に関する詳細が含まれています。
-
-
aws-lambda-tools-defaults.json
ファイルを開き、次の行を追加します。"package-type": "image",
"docker-host-build-output-dir": "./bin/Release/lambda-publish"
-
package-type: デプロイパッケージをコンテナイメージとして定義します。
-
docker-host-build-output-dir: ビルドプロセスの出力ディレクトリを設定します。
例 aws-lambda-tools-defaults.json
{ "Information": [ "This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.", "To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.", "dotnet lambda help", "All the command line options for the Lambda command can be specified in this file." ], "profile": "", "region": "us-east-1", "configuration": "Release", "function-runtime": "provided.al2023", "function-memory-size": 256, "function-timeout": 30, "function-handler": "bootstrap", "msbuild-parameters": "--self-contained true",
"package-type": "image",
"docker-host-build-output-dir": "./bin/Release/lambda-publish"
} -
-
ディレクトリに Dockerfile を作成します。次の Dockerfile の例では、AWS ベースイメージの代わりに Microsoft .NET ベースイメージを使用します。MyFunction
/src/MyFunction
-
ベースイメージ識別子に
FROM
プロパティを設定します。.NET バージョンは、ベースイメージのバージョンと一致する必要があります。 -
COPY
コマンドを使用して、関数を/var/task
ディレクトリにコピーします。 -
ENTRYPOINT
を、Docker コンテナの起動時に実行させるモジュールに設定します。この場合、モジュールはAmazon.Lambda.RuntimeSupport
ライブラリを初期化するブートストラップです。
この例の Dockerfile には USER 命令
が含まれていないことに注意してください。コンテナイメージを Lambda にデプロイすると、最小特権のアクセス許可を付与したデフォルトの Linux ユーザーを Lambda が自動的に定義します。これは標準の Docker 動作とは異なります。標準の動作とは、 USER
命令を指定しなかったときにroot
ユーザーのデフォルトとなる動作のことです。例 Dockerfile
# You can also pull these images from DockerHub amazon/aws-lambda-dotnet:8 FROM
mcr.microsoft.com/dotnet/runtime:8.0
# Set the image's internal work directory WORKDIR /var/task # Copy function code to Lambda-defined environment variable COPY "bin/Release/net8.0/linux-x64" . # Set the entrypoint to the bootstrap ENTRYPOINT ["/usr/bin/dotnet", "exec", "/var/task/bootstrap.dll
"] -
-
Amazon.Lambda.Tools の「.NET Global Tool
」拡張機能をインストールします。 dotnet tool install -g Amazon.Lambda.Tools
Amazon.Lambda.Tools が既にインストールされている場合、最新バージョンであることを確認します。
dotnet tool update -g Amazon.Lambda.Tools
-
Amazon.Lambda.Tools を使用して Docker イメージを構築し、新しい Amazon ECR リポジトリにプッシュして Lambda 関数をデプロイします。
--function-role
では、Amazon リソースネーム(ARN)ではなく、関数の「実行ロール」のロール名を指定します。例えば、lambda-role
と指定します。dotnet lambda deploy-function
MyFunction
--function-rolelambda-role
Amazon.Lambda.Tools の .NET CLI 拡張機能の詳細については、GitHub の AWS Extensions for .NET CLI
リポジトリを参照してください。 -
関数を呼び出します。
dotnet lambda invoke-function
MyFunction
--payload "Testing the function"すべてが成功すると、次のメッセージが表示されます。
Payload: "TESTING THE FUNCTION" Log Tail: START RequestId:
id
Version: $LATEST END RequestId:id
REPORT RequestId:id
Duration: 0.99 ms Billed Duration: 1 ms Memory Size: 256 MB Max Memory Used: 12 MB -
Lambda 関数を削除する
dotnet lambda delete-function
MyFunction