たそらぼ

日頃思ったこととかメモとか。

C#でAWS Lambdaの開発を始めるのにハマったこと

C#AWS Lambdaの開発を始めるのにハマったことまとめです。
(2019年11月時点の記録です)

はじめに

.NETでAWS Lambda用のコードを開発する用事があったのですが、C#は右も左も分からない所からのスタートで、とにかくハマりまくりました!
普段からC#を使われている方からすると当たり前のことかもなのですが、やはり敷居が高いのか、ウェブ上の情報も少なかったので、困った点などをまとめておきます。

Lambdaのビルド環境を分かってなくてハマる

まだ記憶に新しい、AWS LambdaがC#に対応したニュース、

aws.amazon.com

ですが、ここで注目していただきたいのは、

AWS Lambda が、.NET Core 2.1 をサポート

と、AWS Lambdaは.NET coreに対応していることです。

そう、AWS Lambdaは.NET coreに対応していることを分かっておらず、ハマりました。

.NET coreってなんじゃい

.NETの実装には.NET FrameworkやXamarin/Monoが存在する。.NET Coreはクロスプラットフォームを特徴としてMicrosoftが主導的に開発をおこなっている.NET実装の1つである。
.NET Core - Wikipedia

.NET coreと.NET Frameworkって違うんですね。。。
MSのドキュメントをみると、

次のような場合、サーバー アプリケーションには .NET Core を使用します。

  • ロスプラット フォームが必要である。
  • マイクロサービスが対象である。
  • Docker コンテナーを使用している。
  • 高パフォーマンスでスケーラブルなシステムが必要である。
  • 1 つのアプリケーションに複数の .NET バージョンが必要である。

サーバー アプリ用 .NET Core と .NET Framework の選択 | Microsoft Docs

確かに.NET Coreの方がLambdaと相性が良い感じがします。


AWS SDKは.NET Core の非同期の呼び出しのみサポート

.NET Coreにのみ対応している影響は、この点に大きく効いてきます。
以下のドキュメントの.NET Coreのところを確認いただくと、非同期呼び出しにのみ対応していることが分かります。
docs.aws.amazon.com

Classmethodさんの記事でも、その旨が紹介されています。[2]

私の場合、公式ドキュメントを参考にして同期呼び出しの関数を使っていたので、「型または名前空間の名前 'xxxxx' が名前空間 'xxxx' に存在しません (アセンブリ参照があることを確認してください)。」が出たまま右往左往しました。

参考

[1] C# による Lambda 関数のビルドの詳細
docs.aws.amazon.com

[2] Classmethodさんの記事
dev.classmethod.jp

[3] AWS Toolkit for Visual Studioの利用方法
docs.aws.amazon.com