.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 で開発用のオレオレテンプレート
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を通さないテストが可能。
まずはこれでやるとよい。
以下、書き途中