そのAWS Lambdaの.NET Core、1.0から2.0にアップデートしませんか？

# 概要
* 2018年1月15日、とうとうAWS Lambdaでの.NET Coreで2.0がサポートされるようになりました🎉
* 早速バージョンアップしてみましょう。

# ソリューションのアップデート
細かいことはおいておいて、まずはアップデートしてみましょう。

題材はこれです。

[CloudWatch Logsに書き込まれた内容をSlackとGoogle Homeで通知するAWS Lambda using dotnet](https://qiita.com/toshi0607/items/9b9c9da1bbb07aac94ce)

がんばった割に鳴かず飛ばずだったこの記事で紹介している、CloudWatch Logsを監視してSlackとGoogle Homeに通知するLambdaです。

https://github.com/toshi0607/ErrorNotificationLambda

## プロジェクト構成
ErrorNotificationLambda/
├ErrorNotificationLambda/
│  ├Properties/
│  ├aws-lambda-tools-defaults.json
│  ├**ErrorNotificationLambda.csproj**
│  ├Function.cs
│  └Readme.md
└ErrorNotificationLambda.Tests/
 　 ├Properties/
 　 ├**ErrorNotificationLambda.Tests.csproj**
 　 ├FunctionTest.cs
 　 └LaunchSettingsFixture.cs
```

## 変更箇所
csprojを変更します。

```ErrorNotificationLambda.csproj
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netcoreapp1.0</TargetFramework>
  </PropertyGroup>

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

  <PropertyGroup>
    <OutputType>Library</OutputType>
  </PropertyGroup>

  <ItemGroup>
    <PackageReference Include="Amazon.Lambda.CloudWatchLogsEvents" Version="1.0.0" />
    <PackageReference Include="Amazon.Lambda.Core" Version="1.0.0" />
    <PackageReference Include="Amazon.Lambda.Serialization.Json" Version="1.1.0" />
  </ItemGroup>

  <ItemGroup>
    <DotNetCliToolReference Include="Amazon.Lambda.Tools" Version="1.8.0" />
  </ItemGroup>

</Project>
```

これを
```
<TargetFramework>netcoreapp1.0</TargetFramework>
```

こう
```
<TargetFramework>netcoreapp2.0</TargetFramework>
```

以上。

Visual Studio 2017から編集する場合は、該当プロジェクトを右クリックすると「[プロジェクト名].csprojの編集」が選択できます。

![4csproj.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/4e28ba6f-04b3-d1db-8653-03d0e3e09986.png)

aws-lambda-tools-defaults.jsonにデフォルトのデプロイ設定を書いている場合、そちらもお忘れなく。

Publish to Lambdaするときに設定を保存しても書き換わってくれます。

また、Serverless Applicationのテンプレートからプロジェクトを作成した場合はCloudFormationのリソースも`dotnetcore2.0`に変更しましょう。

# AWS Toolkit for Visual Studio 2017のアップデート
[AWS Toolkit for Visual Studio 2017](https://marketplace.visualstudio.com/items?itemName=AmazonWebServices.AWSToolkitforVisualStudio2017)はVisual Studioからデプロイしたり、テンプレートを選択したりできるようにする拡張機能です。

今回.NET Core 2.0系対応が入った拡張機能のバージョンは`1.14.0.0`ですが、僕のVisual Studioにはまだ更新が降ってきていなかったので、マーケットプレースから直接.vsixをダウンロードし、インストールしました。

現在インストールされているバージョンは「ツール」->「拡張機能と更新プログラム」->「インストール済み」の中にあるAWS Toolkit for Visual Studio 2017を選択すると確認することができます。

![61.14.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/1eeebea0-18b4-664a-ac19-e469e0cc6db5.png)

バージョンアップすることで変更される大事なポイントは次の二点でしょう。

* Language Runtimeで.NET Core v2.0が選択できる
* Memoryが3008MBまで選択できる


メモリはまた上限上がったんですねw　年末のLambda共通のアップデート時点ではポータルで選択できる上限が上がっているにもかかわらず、「Upload Lambda Function」ではそれが反映されていませんでした。

![72.0.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/83c48b77-a514-417d-a583-f3d5312b202e.png)

![8memory.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/9a873ebb-6b04-8b3c-496b-3e50d4a69d38.png)


# 動作確認
## ローカルでテスト通るか？

## デプロイ後ポータルでのバージョンが2.0になっているか？

![82.0.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/971e1472-0663-aadd-4524-86a28df81169.png)

## 本番環境のLambdaに対してテストイベントを発行した期待した結果になるか？

![9vs.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/8d0a0e3a-21e9-c48b-fe2f-30afa824a72e.png)

![9slack.PNG](https://qiita-image-store.s3.amazonaws.com/0/46547/2ffaf60d-4547-2836-b010-6ce6e0fc0c4b.png)

特に問題はなかったです。

# アップデートの詳細

<blockquote class="twitter-tweet" data-lang="ja"><p lang="en" dir="ltr">You can now develop AWS Lambda functions in C# using the .Net Core 2.0 runtime! Get started easily with the AWS Toolkit for Visual Studio.  <a href="https://t.co/uxmrKodaUY">https://t.co/uxmrKodaUY</a> <a href="https://t.co/h442a6DwEZ">pic.twitter.com/h442a6DwEZ</a></p>&mdash; Amazon Web Services (@awscloud) <a href="https://twitter.com/awscloud/status/953059230621331456?ref_src=twsrc%5Etfw">2018年1月16日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

[AWS Lambda Supports C# (.NET Core 2.0)](https://aws.amazon.com/jp/about-aws/whats-new/2018/01/aws-lambda-supports-c-sharp-dot-net-core-2-0/)

[AWS Lambda .NET Core 2.0 Support Released](https://aws.amazon.com/jp/blogs/developer/aws-lambda-net-core-2-0-support-released/)

一番下のが実際に開発してる人が書いた記事です。

aws-lambda-dotnetは大体この人が書いていると言っても過言ではないし、PRを出すととても丁寧に対応してくれます。

https://github.com/aws/aws-lambda-dotnet/graphs/contributors

VSTSのAWS周りタスクがリリースされた記事も英語版が出て2週間後くらいに日本語版が出たので、今回もきっとそのうち日本語版が出ることでしょう。

とても雑にまとめると、

* .NET Core 2.0サポートすると、.NET Standard 2.0ベースでライブラリを作成するときより多くの.NET APIを利用できるので、既存の.NET資産をより使い回しやすくなる
* テンプレはもう2.0ベースにアップデートしているので、AWS Toolkitのテンプレート使ってVisual Studioからデプロイしてしまうのが一番楽
* Amazon.Lambda.Toolsも2.0がリリースされ、パッケージングするにあたって2.0ランタイムで必要となるファイルも生成できる
* Amazon.Lambda.Templatesも2.0.0（同日に2.0.1がリリースされていた...！）がリリースされ、Visual Studioがなくてもすべてのテンプレがコマンドで利用できるようになった
* プログラミングモデルは変わっていたいので、既存の1.0系プロジェクトもシュッとアップデートできる
* AWS Tools for VSTSもアップデートされて2.0対応されたが既存のタスクを更新する必要はない

# まとめ
「.NET Core 2.0対応」が目につきますが、実際は周辺のツールのアップデートがとてもとてもいい感じです。