コンテナイメージを使用して.NET の Lambda 関数をデプロイする - AWS Lambda

コンテナイメージを使用して.NET の Lambda 関数をデプロイする

.NET Lambda 関数のコンテナイメージを構築するには 3 つの方法があります。

ヒント

Lambda コンテナ関数がアクティブになるまでの時間を短縮するには、「Docker ドキュメント」の「マルチステージビルドを使用する」を参照してください。効率的なコンテナイメージを構築するには、「Dockerfiles を記述するためのベストプラクティス」に従ってください。

このページでは、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 ベースイメージを使用する

前提条件

このセクションの手順を完了するには、以下が必要です。

  • .NET SDK」 — 以下の手順では .NET 8 ベースイメージを使用します。.NET のバージョンが、Dockerfile で指定した「ベースイメージ」のバージョンと一致することを確認してください。

  • Docker

ベースイメージを使用したイメージの作成およびデプロイ

次のステップでは、「Amazon.Lambda.Templates」および「Amazon.Lambda.Tools」を使用して .NET プロジェクトを作成します。次に、Docker イメージを構築し、イメージを Amazon ECR にアップロードして Lambda 関数にデプロイします。

  1. Amazon.Lambda.Templates の NuGet パッケージをインストールします。

    dotnet new install Amazon.Lambda.Templates
  2. lambda.image.EmptyFunction テンプレートを使用して.NET プロジェクトを作成します。

    dotnet new lambda.image.EmptyFunction --name MyFunction --region us-east-1
  3. MyFunction/src/MyFunction ディレクトリに移動します。ここにプロジェクトファイルが保存されます。次のファイルを確認します。

    • aws-lambda-tools-defaults.json - このファイルで、Lambda 関数をデプロイするときにコマンドラインオプションを指定します。

    • Function.cs - Lambda ハンドラーの関数コード。これは、デフォルトの Amazon.Lambda.Core ライブラリおよびデフォルトの LambdaSerializer 属性が含まれる C# テンプレートです。シリアル化の要件およびオプションの詳細は、Lambda 関数のシリアル化 を参照してください。提供されるコードをテストに使用することも、独自のコードで置き換えることもできます。

    • MyFunction.csproj - アプリケーションを構成するファイルおよびアセンブリを一覧表示する .NET 「プロジェクトファイル」。

    • Readme.md — このファイルには、サンプル Lambda 関数に関する詳細が含まれています。

  4. src/MyFunction ディレクトリの Dockerfile を調べます。提供される Dockerfile をテストに使用することも、独自の Dockerfile で置き換えることもできます。独自のものを使用する場合、必ず次のことを行ってください。

    • 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" ]
  5. Amazon.Lambda.Tools の「.NET Global Tool」をインストールします。

    dotnet tool install -g Amazon.Lambda.Tools

    Amazon.Lambda.Tools が既にインストールされている場合、最新バージョンであることを確認します。

    dotnet tool update -g Amazon.Lambda.Tools
  6. まだディレクトリが MyFunction ではない場合、ディレクトリを MyFunction/src/MyFunction に変更します。

    cd src/MyFunction
  7. Amazon.Lambda.Tools を使用して Docker イメージを構築し、新しい Amazon ECR リポジトリにプッシュして Lambda 関数をデプロイします。

    --function-role では、Amazon リソースネーム(ARN)ではなく、関数の「実行ロール」のロール名を指定します。例えば、lambda-role と指定します。

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Amazon.Lambda.Tools の .NET Global Tool の詳細については、GitHub の AWS Extensions for .NET CLI リポジトリを参照してください。

  8. 関数を呼び出します。

    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
  9. Lambda 関数を削除する

    dotnet lambda delete-function MyFunction

ランタイムインターフェイスクライアントで代替ベースイメージを使用する

OS 専用ベースイメージまたは代替のベースイメージを使用する場合、イメージにランタイムインターフェイスクライアントを含める必要があります。ランタイムインターフェイスクライアントは、Lambda と関数コード間の相互作用を管理する カスタムランタイムに Lambda ランタイム API を使用する を拡張します。

次の例は、非 AWS ベースイメージを使用して .NET 用のコンテナイメージを構築する方法と、.NET 用の Lambda ランタイムインターフェースクライアントである Amazon.Lambda.RuntimeSupport パッケージを追加する方法を示しています。Dockerfile の例では、Microsoft .NET 8 ベースイメージを使用します。

前提条件

このセクションの手順を完了するには、以下が必要です。

  • .NET SDK」 — 以下の手順では .NET 8 ベースイメージを使用します。.NET のバージョンが、Dockerfile で指定した「ベースイメージ」のバージョンと一致することを確認してください。

  • Docker

代替的なベースイメージを使用したイメージの作成およびデプロイ

  1. Amazon.Lambda.Templates の NuGet パッケージをインストールします。

    dotnet new install Amazon.Lambda.Templates
  2. lambda.CustomRuntimeFunction テンプレートを使用して.NET プロジェクトを作成します。このテンプレートには Amazon.Lambda.RuntimeSupport パッケージが含まれています。

    dotnet new lambda.CustomRuntimeFunction --name MyFunction --region us-east-1
  3. 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 関数に関する詳細が含まれています。

  4. 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" }
  5. MyFunction/src/MyFunction ディレクトリに Dockerfile を作成します。次の Dockerfile の例では、AWS ベースイメージの代わりに Microsoft .NET ベースイメージを使用します。

    • ベースイメージ識別子に 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"]
  6. Amazon.Lambda.Tools の「.NET Global Tool」拡張機能をインストールします。

    dotnet tool install -g Amazon.Lambda.Tools

    Amazon.Lambda.Tools が既にインストールされている場合、最新バージョンであることを確認します。

    dotnet tool update -g Amazon.Lambda.Tools
  7. Amazon.Lambda.Tools を使用して Docker イメージを構築し、新しい Amazon ECR リポジトリにプッシュして Lambda 関数をデプロイします。

    --function-role では、Amazon リソースネーム(ARN)ではなく、関数の「実行ロール」のロール名を指定します。例えば、lambda-role と指定します。

    dotnet lambda deploy-function MyFunction --function-role lambda-role

    Amazon.Lambda.Tools の .NET CLI 拡張機能の詳細については、GitHub の AWS Extensions for .NET CLI リポジトリを参照してください。

  8. 関数を呼び出します。

    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
  9. Lambda 関数を削除する

    dotnet lambda delete-function MyFunction