.netcoreのサポートが終了してしばらく経つので、いい加減、あたらしい環境で構築せねば、、となったのでメモ

.NET SDK のバージョン決め / インストール

サポート期限の問題で、

  • .NET6(サポート期限:2024/11)
  • .NET7

の2択

.NET7 は現時点でも未対応のモジュールが稀によくあったため、.NET6一択。
macOSで使う場合、M1向けとIntel向けがあるので、要注意。

ダウンロードURL

https://dotnet.microsoft.com/ja-jp/download

Serverless framdwork の インストール

npmで直インストールしてもよいけど、安定板の判断がめんどくさいので、homebrewで入れると無難of無難。

brew install serverless

参考

Mac M1でServerless frameworkを利用してLambdaを作成

スケルトンを生成

旧バージョンからの移行は無駄にハマるので、一旦最新版のテンプレートで雛形作るのが無難。
まずは必要なパッケージを追加する

dotnet new -i Amazon.Lambda.Templates
dotnet tool install -g Amazon.Lambda.TestTool-6.0
dotnet tool install -g Amazon.Lambda.Tools

なんで new でテンプレート追加?と思いきや、new に -i サブオプションを指定すると、テンプレートパッケージインストールになる...

テンプレートを入れるとわかるのだが、.NET6だと AWS SDK for .NET の V2 が csprojから参照されている。
DEPRECATEDと言われているが、V3使おうと思うと、.NET7必須な気配なので、一旦見なかったことにする...

そして、スケルトンを生成といったが、enacs & serverless という危篤な環境で開発する場合、通常のテンプレートに色々手を加える必要がある。

故に、上記に合うようなスケルトンを自作して、githubに置いた。それを使おう。

(地味に使いそうなAWSのパッケージ色々add packageしている。restoreで全部入るので気にせんで良い)

後日追記:

V3でも組み合わせによってはいけた。使うコンポーネントやバージョン組み合わせによる...?
新目のサービスのSDKはV3でないと存在しなかったりするので、V3を使おう。

判断の仕方としては、一度AWS系のSDKを消して、AWSSDK.Core を追加。
その後、必要なものを追加しつつ様子見が無難そう。

SDKは、3系、3.5系、3.7系でまた微妙に溝があるので、注意。

emacs + Serverless Framework + .NET6 で開発用のオレオレテンプレート

karinharp/LamndaTemplateDotnet6 - GitHub

AWS SDK for .NET documentation

驚くほど情報がない + .Net Core から .NET6 になったことで、かなりの変化があるため、古い記事を当たるよりは本家ドキュメントを当たるのが無難。

https://docs.aws.amazon.com/sdk-for-net/index.html

.NET6における引数処理

理想論

Amazon.Lambda.APIGatewayEvents を使ったハンドリングを奨励する、、と公式ドキュメントで言っているが、通る気配がない。

曰く、APIGatewayHttpApiV2ProxyRequest/Responce型を使って、ソースコードジェネレーターをコンパイル時に通して定義するらしい。

https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/csharp-handler.html

しかし、実際にやると、うまく型情報が登録されずに、実行時エラーで落ちる。

現実解

DefaultのJsonマッピングで、POSTでもらったJSONを、Serializableなクラスメンバーにマッピングしてやる従来の方法が一つ。

APIGatewayと連携する場合、REST風にパス情報だったりHTTPヘッダーの情報をあれこれ触れた方が良いケースもある。この場合は、APIGatewayHttpApiV2ProxyRequestをHandlerの第一引数に取ると良い。

ただし、この場合はPOSTされたデータのパース等は自力で一からやる必要があるので、リクエスト処理のコードが無駄に膨らみがち。データを受け取る系の処理は、前者を使った方が楽な気がする。

あくまで、APIGatewayHttpApiV2ProxyRequest で実装するのは、GETなAPIを作る時用とするのがよさげ。

Serverless でビルド/テスト

api-test:  
    serverless invoke --function ${API_FUNC} -p ${API_FUNC_ARG} --log --stage ${API_STAGE}    

でAPIGatewayを通さないテストが可能。

まずはこれでやるとよい。

以下、書き途中

Previous Post Next Post

【2023年6月版】 Serverless で C# で AWS Lambda をキメる