BEACHSIDE BLOG

Azure と GitHub と C# が好きなエンジニアの個人メモ ( ・ㅂ・)و ̑̑

AWS Lambda を .Net Core と ( .NET Standard と) C# で実装する(その1)

AWS Lambda を C# で、.NET Core 1.0、.NET Standard 1.6 を使って実装する際のメモです。

(2017/9月時点での話=.NET Core 1.0しかサポートしてない時点)

Overview

 1 開発環境の準備
 2 .NET Core 1.0 対応の .NET Standard 1.6 のクラスライブラリの作成
 3 簡易なクラスライブラリー実装
 4 Console プロジェクトの作成 (その2)
 5 Autofac の実装(その2)
 6 AWS Labmda プロジェクトの作成 (その2)
 7 AWS Labmda の環境変数を読み込む
 8 AWS API Gateway から Lambda - プロキシ統合 の使用とか
 9 AWS Lambda から AWS Lambda の呼び出し
 10 AWS Lambda から CloudWatch Events の呼び出し

Lambda のプロジェクト作ってそこにシンプルなメソッド書いて終わりだと幸せですが、そんな単純にはいかない場合もあると思ってます。そんなときの個人的にこんな感じがいいかなーな実装サンプルです。

(個人的な)実装のポイント

プロジェクトの構成は、最低でも以下の感じにしといた方が後々楽だと思ってます(あくまで個人的な考えです)。

概要 フレームワーク 備考
AWS Lambda のエントリーポイントとなる Lambda のプロジェクト .NET Core1.0 ビジネスロジックは含めず、必要なライブラリの1メソッドのコールのみを呼ぶだけにするこで責務をシンプルにします。
ビジネスロジック用のクラスライブラリ- .NET Standard1.6 責務分割やテスタビリティ向上の観点から分けてます。
IoC コンテナーのプロジェクト .NET Standard1.6 今回はAutofacでDIを実装します。
クラスライブラリを呼び出して動作チェックする用のConsoleアプリのプロジェクト .NET Core1.0 本来はテストプロジェクトで動作チェックやればよいですが、今回はそのかわりでもあります。

Lambda のエントリーポイントのプロジェクトにビジネスロジックのメソッド書いたら、デバッグ実行したりテストコード作ったりがめんどいですよね。なので分けます。

そして、Lambda 使ってると環境変数も使うだろうから、IoC コンテナーのプロジェクト作ってそこで最初からやっといた方が色々楽だと思っています(テストプロジェクトも結局そうなんだけれども)。

プロダクションで使うならもちろんModel とかその他諸々のプロジェクトも必要に応じて作る感じですが、今回はそこまではやりません。

AWS Lambda の注意点

Lambda に関することは、AWSのドキュメントを読んでいただくとして、個人的に注意したい点は以下。

  • 起動時間が最大300秒で落ちるので、時間のかかる処理は向いてません。
    (そもそもサーバーレスやクラウドアーキテクチャーやデザインパターンの基本的な話として、重たいバッチ処理を1つの Lambda で..とかないですよね)

  • API Gateway 経由でのインプットのデータ貰うのがちょっとめんどい。

  • AWS Lambda は、ブログ書いてる時点で .NET Core 1.0 しかサポートしてない

  • .NET Core 1.0は、.NET Standard 1.6.0 まで(1.6.1からは、. NET Core1.1)

1 開発環境の準備

Visual Studio 2017 と .NET Coreの環境構築

今回はVisual Studio 2017(エディション不問)を使うので、インストールはもちろん必要です。 インストール時に、.NET Core を入るように良しなに選択してください。、.NET Core 1.0は入ってくるんだっけ?...自分のPCは昔から .NET Core 使ってるから、最新のバージョン入れたときに1.0がインストールされるかわからんです(選択できそうな妄想...でも調べない)。

入っていない場合は、以下から .NET Core 1.0のバージョンをインストールしましょう。1.1ではだめです、1.0 です。

github.com

AWS Tookkit for Visual Studio 2017 のインストール

VS2017を起動し、画面上部のメニューで、 ツール > 拡張機能と更新プログラム をクリックします。

f:id:beachside:20170927225902p:plain


左ペインで オンライン を選択し、右側の検索で「aws」と入力すると、「AWS Tookkit for Visual Studio 2017」 が表示されます。インストールしましょう。

f:id:beachside:20170927225913p:plain


Visual Studio 自体の拡張のインストールの場合、Visual Studio を一度閉じる必要があります(閉じるとインストールが開始します)。 これで下準備は完了。

2 .NET Core 1.0 対応の .NET Standard 1.6 のクラスライブラリの作成

.NET Core 1.0は、.NET Standard 1.6.0 まで(1.6.1からは、. NET Core1.1)となります。 クラスライブラリから作っていきます。VS2017でスタートページの真ん中下の方 新しいプロジェクトの作成 をクリックして、プロジェクトを新規作成していきます。

f:id:beachside:20170927230018p:plain


今回は、プロジェクトの名前を「LambdaDemo.DemoService」、ソリューション名を「LambdaDemo」として、OKボタンをクリックして作成しました。

f:id:beachside:20170927230057p:plain


ターゲットフレームワークの変更

まず、ソリューションエクスプローラーでプロジェクト「LambdaDemo.DemoService」を右クリックし、一番下にある プロパティ をクリックします。

f:id:beachside:20170927230109p:plain


左ペインの アプリケーション を選択し、ターゲットフレームワークを .NET Standard 1.6 にします。表示されないときは、runtime かSDKが入ってない可能性ががるの確認しましょう。

f:id:beachside:20170927230118p:plain


あと、直接は関係ないのですが、左ペインの ビルド を選択し、右下の方にある 詳細設定 をクリックして、 「言語バージョン」を「C# 最新のマイナー バージョン(最新)」に変更します。これで最新のC#(ブログ書いてるときだとC#7.1)が使えます。

csprojの編集

次は、ソリューションエクスプローラーを右クリックして、「LambdaDemo.DemoService.csprojを編集する」をクリックします(プロジェクト名が別だと表示が変わりますが、ようは、csprojを編集するです。

f:id:beachside:20170927230133p:plain


csproj のファイルが開きます。ここで1行、PropertyGroup タグ内に、NetStandardImplicitPackageVersion タグを追加します。追加すると以下のようになります。

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard1.6</TargetFramework>
    <NetStandardImplicitPackageVersion>1.6.0</NetStandardImplicitPackageVersion>
  </PropertyGroup>

  <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|AnyCPU'">
    <LangVersion>latest</LangVersion>
  </PropertyGroup>

</Project>

これで強制的に1.6.0のバージョンを使います。これをしないと、1.6.1が適用され(=.NET Core 1.1用) なので Lambda のサポート外となります(なんか動くって噂も聞きますがサポート外といってるので試してません)。

これでクラスライブラリの準備完了です。

 

3 簡易なクラスライブラリー実装

.NET Core での AWS Lambda では、ログ出力を Console.WriteLine でログを書くことができます。

では、クラスを実装していきます。ソリューションエクスプローラーでプロジェクトを右クリックして 追加 > クラス を選択します。

f:id:beachside:20170927230145p:plain


SampleClass というクラス名で作成しました。

f:id:beachside:20170927230357p:plain


実装は以下にしました。 この後、autofac を使うので、小さいアプリですがサンプル用に interface を実装しています。

Dynamo使ったりどっかとIOしたりすると非同期処理を使うだろうから(私的な主観です)、サンプルでも無駄に async なメソッドで実装してます(使わないならいらないです)。

ここまでで、AWS Lambda のプロジェクト作成して、このプロジェクトを参照してメソッド呼び出せばサクッと動きますが、それだと実用性があまりない(と個人的に思う)ので、もう少し下準備を進めます。


次回は Autofac の実装して、Lambdaでデプロイまで行きます。

beachside.hatenablog.com