C#のLambdaプロジェクトを作成してVisual Studio for Macでデバッグ実行する

# はじめに

MacでC#のLambdaプロジェクトを作成し、Visual Studio for Macでテストプロジェクトをデバッグ実行した記録です。

### できたこと

* C#のLambdaプロジェクトを作成
* AWS Lambdaへのデプロイ
* AWS Lambdaでのテスト
* Visual Studio for Macでソリューション化
* テストプロジェクトのデバッグ実行

AWS Lambda上で動くプログラムをアタッチしてデバッグしたわけではありません。
テストプロジェクトをローカルPC上でデバッグ実行しました。

# 準備

### アクセスキー ID とシークレットアクセスキーを設定

PCからAWSにアクセスできるようにアクセスキー ID とシークレットアクセスキーを設定します。

* AWS CLIのインストール
インストール手順は以下のURLを参照してください。
参考：https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-chap-install.html

* 設定
以下のURLを参考にアクセスキー ID とシークレットアクセスキーを設定します。
参考：https://docs.aws.amazon.com/ja_jp/cli/latest/userguide/cli-configure-quickstart.html

### .NET Core CLI

* プロジェクトテンプレートの追加
`dotnet new -i Amazon.Lambda.Templates`コマンドを実行して、.NET Core CLIにAWS Lambdaのテンプレートを追加します。

* Amazon.Lambda.Tools .NET Core Global Tool のインストール
`dotnet tool install -g Amazon.Lambda.Tools`コマンドを実行します。

参考：https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/csharp-package-cli.html

# プロジェクトの作成

空のLambdaプロジェクト作成するコマンドを実行します。
`dotnet new lambda.EmptyFunction --name {メソッド名}`
（以下、{メソッド名}に「SelectFunction」と指定した想定で説明します。）

色々とファイルが生成されますが、Lambda関数を実行するとFunction.csのFunction.FunctionHandler()メソッドが呼び出されることになります。
デフォルトでは、引数inputで受け取った文字列を大文字に変換して戻り値に返す処理となっています。

```C#:Function.cs
using Amazon.Lambda.Core;

// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[assembly: LambdaSerializer(typeof(Amazon.Lambda.Serialization.SystemTextJson.DefaultLambdaJsonSerializer))]

namespace SelectFunction
{
    public class Function
    {
        /// <summary>
        /// A simple function that takes a string and does a ToUpper
        /// </summary>
        /// <param name="input"></param>
        /// <param name="context"></param>
        /// <returns></returns>
        public string FunctionHandler(string input, ILambdaContext context)
        {
            return input?.ToUpper();
        }
    }
}
```

参考：https://docs.aws.amazon.com/ja_jp/lambda/latest/dg/csharp-package-cli.html

# デプロイ

デプロイしてみます。

* .csprojファイルがあるディレクトリに移動します。
* `dotnet restore`コマンドを実行します。
* `dotnet lambda deploy-function`を実行します。

  * `Enter AWS Region:`と表示されるので、デプロイ先のリージョンを入力。
  * `Enter Function Name:`と表示されるので、作成したいLambda関数名を入力。
  * `Select IAM Role that to provide AWS credentials to your code:`とIAMロールの一覧が表示されるので、使用するIAMロールを選択。

デプロイに成功すると、AWS Lambdaのコンソールに作成したLambda関数が表示されます。
![スクリーンショット 2020-09-21 8.49.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/42683572-092f-a4ef-d48f-e673e481f75a.png)

# AWS Lambda上でテスト

AWS LambdaコンソールでデプロイしたLambda関数を選択し、「テストイベントの設定」をクリックします。
![スクリーンショット 2020-09-21 8.49.59.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/1c945809-6c2c-f060-bd8b-fd58242a523f.png)

「イベント名」欄に任意の名称を入力し、その下の編集エリアに引数に渡す情報をJsonで入力して保存ボタンをクリックします。
![スクリーンショット 2020-09-21 8.50.49.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/74ec7b2f-853b-af65-a3b5-2251ac4b3811.png)

先ほど「イベント名」欄に入力した名前を選択してテストボタンをクリックすると、実行結果欄にFunction.csのFunction.FunctionHandler()メソッドの戻り値が表示されます。
![スクリーンショット 2020-09-21 8.51.39.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/56bc41c1-41a3-0d88-6694-195c8d20950f.png)

# Visual Studio for Macでソリューション化

Visual Studio for Macでコーディングやデバッグ実行をしたいのでソリューションを作成します。
まずは、空のソリューションを作成します。

![スクリーンショット 2020-09-21 8.17.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/71fa2a1d-8d74-6573-802e-3be439548b03.png)

[プロジェクトの作成](#プロジェクトの作成)で作成されたディレクトリ構成に合わせてソリューションの場所を指定します。ディレクトリ構成はお好きにどうぞ。
![スクリーンショット 2020-09-21 8.23.37.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/4d10aed0-a9ba-406c-e547-d0422bc75d0a.png)

ソリューションウィンドウでソリューション名を右クリック→[追加]→[既存のプロジェクト]を選択し、Lambdaプロジェクトとそのテストプロジェクトを追加します。
![スクリーンショット 2020-09-21 9.03.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/a44e4c93-04c0-82d5-58ec-cc01b7d943a0.png)

# テストの実行

テストプロジェクトをスタートアッププロジェクトに設定します。

単体テストウィンドウを表示し、テストメソッドを右クリック→[テストのデバッグ]をクリックすると、テストメソッドをデバッグ実行できます。

![スクリーンショット 2020-09-21 9.07.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/342629/70d63663-bdca-d06f-26a7-5437567de835.png)