ゆれくるコール開発日誌

ゆれくるコール、あめふるコール、つながるコールや緊急地震速報のことなど

AWS Lambda C#でDynamoDBアクセス時のハマりポイント

こんにちは、商品開発部の池端です。

 

AWS API Gatewayでリクエストを受け、DynamoDBを検索して結果を返すような処理をAWS Lambdaでやりたい。

昨年12月よりLambdaでC#が使えるようになったので、C#でやってみましたが、ハマってしまったポイントがあったのでメモメモ。

 

AWS Lambda C#に関しては、下記の記事を参考にさせて頂きました。

qiita.com

ohke.hateblo.jp

 

1.Lambdaプロジェクト新規作成時、パッケージの復元に失敗

Lambdaプロジェクト新規作成時に、ソリューションエクスプローラに「パッケージの復元に失敗しました」とエラーが表示されました。

こちらは、ツール→NuGetパッケージマネージャ→ソリューションのNuGetパッケージの管理の更新プログラムタブよりMicrosoft.NETCore.Appを更新することで解消されました。

 

2.AWS LambdaへのPublish時やテストプロジェクトのビルドでエラー

AWS LambdaへのPublish時やテストプロジェクトをビルドする際に、下記のようなエラーが表示されました。

f:id:ken447:20170307153814p:plain

上記は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をアプリに含めるかどうかを指定します。

詳細については下記に解説があります。

docs.microsoft.com

 

だれかの参考になれば幸いです。

それではまた!