AWS Lambda C#でDynamoDBアクセス時のハマりポイント
こんにちは、商品開発部の池端です。
AWS API Gatewayでリクエストを受け、DynamoDBを検索して結果を返すような処理をAWS Lambdaでやりたい。
昨年12月よりLambdaでC#が使えるようになったので、C#でやってみましたが、ハマってしまったポイントがあったのでメモメモ。
AWS Lambda C#に関しては、下記の記事を参考にさせて頂きました。
1.Lambdaプロジェクト新規作成時、パッケージの復元に失敗
Lambdaプロジェクト新規作成時に、ソリューションエクスプローラに「パッケージの復元に失敗しました」とエラーが表示されました。
こちらは、ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理の更新プログラムタブよりMicrosoft.NETCore.Appを更新することで解消されました。
2.AWS LambdaへのPublish時やテストプロジェクトのビルドでエラー
AWS LambdaへのPublish時やテストプロジェクトをビルドする際に、下記のようなエラーが表示されました。
上記はAWS LambdaへのPublish時のエラー表示ですが、テストプロジェクトビルドエラーの際はVisual Studioの出力、エラー一覧タブに同様のメッセージが表示されます。
こちらはproject.jsonにruntimesを指定することで解決しました。
"runtimes": {
"win7-x64": {}
}
指定するランタイムID(win7-x64の部分)はそれぞれの環境に合わせてください。
ランタイムIDの種類はコチラ。
3.DynamoDBのScanでエラー
これが一番ハマった。。
LambdaにPublishし、DynamoDBでScanをすると下記のエラーがLambdaから返却されました。
{
"errorType": "TypeInitializationException",
"errorMessage": "The type initializer for 'System.Diagnostics.Stopwatch' threw an exception.",
"stackTrace":[
"at xxxxx.Function.FunctionHandler(Param input, ILambdaContext context)",
"at lambda_method(Closure , Stream , Stream , ContextInfo )"
],
"cause":{
"errorType": "DllNotFoundException",
"errorMessage": "Unable to load DLL 'api-ms-win-core-profile-l1-1-0.dll': The specified module could not be found.\n (Exception from HRESULT: 0x8007007E)",
"stackTrace":[
"at Interop.mincore.QueryPerformanceFrequency(Int64& value)",
"at System.Diagnostics.Stopwatch..cctor()"
]
}
}
こちらはstackoverflowのこの記事を参考に、project.jsonの"Microsoft.NETCore.App"にtypeの指定を追加することで解決しました。
"Microsoft.NETCore.App": {
"type": "platform",
"version": "1.1.0"
}
"type":"platform"の指定有無で、.NET Coreをアプリに含めるかどうかを指定します。
詳細については下記に解説があります。
だれかの参考になれば幸いです。
それではまた!