モジュール 1:AWS Lambda の概要
学習モジュール
概要
このチュートリアルでは、AWS Lambda で .NET を使用する方法を学習します。AWS Lambda に関する予備知識は前提としていませんが、AWS と.NET に精通している必要があります。このコースでは、コマンドライン、Visual Studio、Visual Studio Code、および Rider を使用して、.NET Lambda 関数を作成、デプロイ、実行、テスト、およびデバッグする方法を学習します。
この入門モジュールでは、サーバーレスコンピューティングとは何か、その利点、および AWS Lambda とどのように関連しているかを学びます。これに続いて、.NET AWS Lambda 関数をいかに簡単に使い始めることができるかを示す 2 つの例が続きます。
所要時間
45 分
サーバーレスコンピューティング
サーバーレスコンピューティングについて説明する前に、従来のコンピューティングについて少し説明します。
大小を問わず、多くの企業がオンプレミスサーバーまたはデータセンターベースのサーバーを使用してアプリケーションを実行しています。これらの企業がさらに多くのサーバを必要とする場合、サーバを購入し、物理的な設置を必要とし、構成し、保護し、保守する必要があります。(場合によっては、データセンターがお客様に代わって物理的にインストールを行うこともありますが、残りはお客様が行う必要があります。)
これがすべて完了すると、会社はアプリケーションをそれらのサーバーにデプロイできます。多くの企業では、これに数週間から数か月かかることがあります。従来、このような遅延により、アプリケーションのスケーリングは困難でした。
クラウドコンピューティングにより、こうした作業が大幅に容易になりました。企業は、1 つのサーバー (または複数のインスタンス) のインスタンスを数分で起動できます。企業は、仮想マシンとオペレーティングシステムを思い通りに構成して、独自のマシンイメージを作成できます。これにより、サーバーの起動後に必要な構成量は減りますが、パッチ、セキュリティ更新、ソフトウェア更新などによってサーバーを最新の状態に保つ必要があります。
多くの場合、これらのサーバーは、ずっと使用されていなくても、24 時間 365 日稼働し続けていることがよくあります。多くの場合、サーバーはアプリケーションが予想するピーク時のワークロードを処理するようにプロビジョニングされます。しかし、このピーク以外では、サーバーは少なくとも部分的にアイドル状態になっています。適切なスケーリングポリシーを使用してこの問題に対する支援を減らすことはできますが、これを正しく行うのは難しい場合があります。
また、サーバーのプロビジョニングとメンテナンスの作業、およびサーバーがアイドル状態で過ごす時間は、企業に直接的なメリットをもたらさないコストにつながります。
これに代わるものがサーバーレスコンピューティングです。サーバーやメンテナンスは不要で、スケーリングは自動的に行われます。コードを記述してデプロイし、インフラストラクチャは AWS に任せます。
AWS には、サーバーレスコンピューティング用の 2 つのオプションがあります。コンテナベースのアプリケーション用の AWS Fargate と、イベント駆動型アプリケーション用の AWS Lambda です。
AWS Lambda
AWS Lambda は、サービスが受信したイベントに応じてコードを実行するサーバーレスコンピューティングサービスです。イベントは、SNS、SQS、S3、DynamoDB、API ゲートウェイなど、他の AWS サービスによって生成できます。
API ゲートウェイまたは Lambda 関数 URL を使用すると、HTTP リクエストに応答して Lambda 関数を実行するようにトリガーできます。Lambda 関数は直接呼び出すこともできますが、これもイベントとみなされます。
AWS Lambda を使用するためにインフラストラクチャをプロビジョニングする必要はありません。また、AWS は、1 日に数回の実行でも、1 秒間に数万回の実行でも、アプリケーションのニーズに合わせて自動的にスケーリングを行います。AWS が管理する Lambda インフラストラクチャは、可用性が高く、耐障害性に優れています。
Lambda 関数では、使用したコンピューティングリソースに対してのみお支払いいただきます。コードが実行されていないときは、支払いは行われません。
使い慣れた IDE を使用して .NET アプリケーションを作成し、次に AWS ツール (または任意の IaC) を使用してアプリケーションを AWS Lambda にデプロイします。
イベントによって Lambda 関数が呼び出されると、実行環境が作成され、初期化コード (コンストラクターなど) が実行され、イベントを処理するコードが実行されます。
実行が完了すると、実行環境は一定期間再利用できます。
別のイベントが発生した場合、同じ実行環境が使用され、初期化コードは再実行されません。
実行環境がない場合は、新しい実行環境が作成され、初期化コードが再度実行されます。
AWS Lambda 関数は現在、.NET Core 3.1 と .NET 6 のマネージドランタイムを提供しています。他のバージョンの .NET でアプリケーションを作成する場合は、Lambda カスタムランタイムまたはコンテナベースのアプリケーションを使用できます。
AWS では、Lambda 関数用の C# および F# プロジェクトテンプレートを提供しています。これらはコマンドライン、Visual Studio、Visual Studio Code、および Rider から使用できます。
.NET Lambda 関数は x86_64 プロセッサと arm64 プロセッサで実行できます。どのプロセッサアーキテクチャを選択しても、アプリケーションの作成方法には影響しません。任意のプロセッサーへのデプロイは、構成パラメーターを 1 つ変更するだけで済みます。
AWS Lambda の主な機能
新しい言語を学ぶ必要はありません。既存の C# と F# の知識を活かして Lambda 関数を記述します。
Lambda 関数を SNS、SQS、S3、ステップ関数、DynamoDB などの他の AWS サービスと併用して、イベント駆動型アプリケーションを作成できます。または、これらのサービスからのイベントに応じてカスタムタスクを実行します。
複数の Lambda 関数を実行する複数の関数をオーケストレーションする必要がある場合は、AWS Step Functions を使用できます。Step Functions を使用して、Lambda 関数の実行を管理するステートマシンを作成します。
お客様がインフラストラクチャをプロビジョニングおよび管理する必要はありません。AWS はこれらの作業を引き受けることができます。決定する必要があるのは、プロセッサアーキテクチャと、関数に割り当てるメモリの量だけです。選択したメモリに基づいて、AWS は適切な CPU 速度、ネットワーク帯域幅、ディスク I/O を選択します。
Lambda 関数は可用性が高く、耐障害性があり、各リージョンの複数のアベイラビリティーゾーンで実行されています。
AWS Lambda 関数は、イベントが到着してから数ミリ秒以内に起動し、受信するイベントの量に合わせて迅速かつ自動的にスケーリングできます。
お支払いいただくのは使用した分のみで、使用したミリ秒単位で請求されます。
Lambda には 1 か月あたり 100 万件の無料リクエストと、1 か月あたり 400,000 GB 秒の計算時間を実行できる、充実した、いつでも無料利用枠があります。
大量のトラフィックパターンがある場合、Lambda はそのニーズに合わせてスケーリングし、トラフィックが減少しても、不要になったリソースにお金を払う必要はありません。
Lambda は Compute Savings Plans の一部です。このプランでは、1 ~ 3 年の期間にわたって一定量のコンピューティング時間を使用するコミットメントと引き換えに、より低価格で提供されます。
次のセクションでは、AWS Lambda をいかに簡単に使い始めることができるかを説明します。ほんの数分の作業で、2 つの.NET AWS Lambda 関数をクラウドで実行できるようになります。
.NET AWS Lambda 関数をいかに簡単に使い始めることができるかを示す 2 つの例
所要時間:30 分
ここで紹介した例を参考にしてもかまいませんが、その必要はありません。
サーバーレステクノロジーを使ったことがなければ、最初は気が遠くなるかもしれません。始め方を知っていても、理解するのが難しい場合があります。
この短いモジュールを修了すると、AWS で 2 つの .NET Lambda 関数が稼働するようになります。
1 つはコマンドラインから呼び出し、もう 1 つはほとんど手間をかけずにセットアップできるパブリック HTTPS エンドポイントを介して呼び出します。
コマンドラインを使用して、両方の例を作成、ビルド、デプロイします。
前提条件
1.AWS アカウント。
AWS アカウントをお持ちでない場合は、アカウントの作成と有効化についてこちらのページをご覧ください。 新しいアカウントを作成すると、無料利用枠が自動的に有効になります。無料利用枠では、特定の AWS サービスを制限なく無料で利用できます。無料利用枠の詳細はこちら
2.インストールおよび設定された AWS CLI。
AWS CLI をお持ちでない場合は、ダウンロードしてインストールしてください。次に、認証情報とデフォルトリージョンを使用して AWS CLI を設定します。デフォルトリージョンの選択は、地理的な場所と使用する AWS サービスによって異なります。サービスの可用性は地域によって異なります。
AWS ユーザーには AdministratorAccess ポリシーを添付する必要があります。詳細については、モジュール 3 の「権限に関するメモ」セクションを参照してください。
3..NET 6 SDK
.NET 6 SDK がインストールされていない場合は、ダウンロードしてインストールしてください。
ツールとテンプレートを入手
使用可能なツールとテンプレートについては、後のモジュールで詳しく説明しますが、今のところは、以下の 2 つのコマンドを実行して始めることができます。
dotnet tool install -g Amazon.Lambda.Tools
dotnet new -i Amazon.Lambda.Templates
デモ 1: Lambda 関数の「Hello World!」
これは、入力を受け取って応答を返す、記述できる最も基本的な Lambda 関数で、数分で起動して実行できます。
ステップ 1-.NET プロジェクトを作成する
コマンドライン/ターミナルウィンドウから、次のコマンドを実行して新しい Lambda 関数を作成します。
dotnet new lambda.EmptyFunction -n HelloLambda
ステップ 2-Lambda 関数をデプロイする
HelloLambda/src/HelloLambda ディレクトリに移動します。
cd HelloLambda/src/HelloLambda
興味があれば、このディレクトリにあるプロジェクトを開いてください。Function.cs という名前のファイルが表示されます。そこに関数を実行するコードが置かれています。今のところ、ファイル内の内容は変更しないでください。
コマンドラインから、以下のコマンドを実行して関数をデプロイします。
dotnet lambda deploy-function --function-name HelloLambda
以下のような出力が表示されます。
AWS Toolkit for Visual Studio は、ECR パブリックレジストリでの作業や、プライベートレジストリ内の新しいリポジトリの自動スキャンやリポジトリ暗号化などの機能の有効化をサポートしていません。これらの機能が必要な場合は、AWS マネジメントコンソール、または AWS CLI や AWS Tools for PowerShell などのコマンドラインツールを使用してリポジトリを作成します。
この時点で、次の 2 つのうちのいずれかが起こります。
- AWS アカウントにロールがない場合は、「新しい IAM ロールの名前を入力してください」と表示されますので、入力してください。HelloLambdaRole という名前を使ってください。
- AWS アカウントにロールがある場合はリストが表示されますが、一番下に「新しい IAM ロールを作成」と表示されますので、それに関連する番号を入力します。すると、「新しい IAM ロールの名前を入力してください」と表示されますので、入力してください。HelloLambdaRole という名前を使ってください。
次に、作成中のロールにアタッチできる権限のリストが表示されます。AWSLambdaBasicExecutionRole を選択してください。私のリストの 6 番目です。
ロール、権限、Lambda 関数が作成されるまで数秒待ちます。
ステップ 3-Lambda 関数を呼び出す
コマンドラインから以下を実行します。
dotnet lambda invoke-function --function-name HelloLambda --payload "Hello World!"
出力には以下が表示されます。
完了しました。 Lambda 関数をクラウドにデプロイしました。
ステップ 4: クリーンアップ
Lambda 関数では、実行中でなくても課金されませんが、他の AWS サービスでは、サービスがアイドル状態であっても料金が変わります。使用していないリソースは必ず削除することをお勧めします。
次のコマンドを実行して、Lambda 関数を作成します。
dotnet lambda delete-function --function-name HelloLambda
削除されるのは関数だけで、作成したロールは削除されないことに注意してください。
デモ 2: Lambda 関数で実行される.NET API
このデモでは、HTTPS リクエストを処理する.NET API アプリケーションを作成します。新しい最小 API テンプレートを使用することも、古いフル API とコントローラーテンプレートを使用することもできます。手順は同じです。.NET 6 のトップレベルステートメントと API エンドポイントに精通している場合は、最小限のテンプレートである サーバーレス.AspNetCoreMinimalAPI の使用を検討してください。トップレベルのステートメントに慣れていない場合は、古いテンプレート サーバーレス AspNetCoreWebAPI を使用してください。
ステップ 1-.NET プロジェクトを作成する
最小限の API テンプレートを使用する場合は、次のコマンドを実行します。
dotnet new serverless.AspNetCoreMinimalAPI -n HelloLambdaAPI
コントローラーを含む完全な API テンプレートに慣れている場合は、以下のコマンドを実行してください。
dotnet new serverless.AspNetCoreWebAPI -n HelloLambdaAPI
ステップ 2 - S3 バケットの作成
これは 1 回限りのステップです。ステップ 3 のコマンドには、デプロイに関連するファイルを保存するための S3 バケットが必要です。
すべての AWS アカウント (自分のアカウントだけでなく)、すべてのリージョンで一意のバケット名を作成する必要があります。
us-east-1 を使用している場合は、次のコマンドを実行します。
aws s3api create-bucket --bucket your-unique-bucket-name1234
別のリージョンを使用する場合は、以下を実行してください。
aws s3api create-bucket --bucket your-unique-bucket-name1234 --create-bucket-configuration LocationConstraint=REGION
選択したバケット名が使用中の場合、次のエラーが表示されます。
CreateBucket オペレーションを呼び出すときにエラーが発生しました (BucketAlreadyExists): 要求されたバケット名は使用できません。バケット名前空間は、システムのすべてのユーザーによって共有されます。別の名前を選択して、もう一度お試しください。
ステップ 3-Lambda 関数をデプロイする
HelloLambdaAPI/src/HelloLambdaAPI ディレクトリに移動します。
コマンドラインから、以下のコマンドを実行して関数をデプロイします。
dotnet lambda deploy-serverless --stack-name HelloLambdaAPI --s3-bucket your-unique-bucket-name1234
座っておくつろぎください。
ビルドとデプロイのプロセスに関連する出力が表示され、最後にリンクが表示されます。
Output Name Value
------------------------------ --------------------------------------------------
ApiURL https://xxxxxxxxxx.execute-api.us-east-1.amazonaws.com/Prod/
それをブラウザで開きます。選択したプロジェクトテンプレートに応じて、以下のいずれかのメッセージが表示されます。
ステップ 4: クリーンアップ
Lambda 関数と関連リソースを削除するには、以下のコマンドを実行します。
dotnet lambda delete-serverless HelloLambdaAPI
まとめ
ほら、どうぞ。ほんの数分で、2 つの Lambda 関数をデプロイできました。これだけ簡単に.NET Lambda 関数を使い始めることができるのです。