Visual Studioの無いWindows環境でC# Lambdaの開発環境を整える

2020.04.15

しばたです。

Windows環境においてC#でLambdaを開発する際はVisual StudioAWS Toolkit for Visual Studioを使うのが最も一般的かと思います。

ただ、私は普段仕事では開発をせず仕事用のPCにはVisual Studioをインストールしていません。
そのかわりにMarkdownおよびPowerShellエディタとしてVisual Studio Codeはインストールしていますので、本記事ではVisual Studio Codeを使ってC# Lambdaの開発環境をつくる手順について説明します。

はじめに

検証環境について

検証環境は私の仕事用PCである64bit版 Windows 10 November 2019 Update (1909)を使います。

本記事を書く動機が前の記事で紹介した.NET Core 3.1のLambdaを試すためなので、ランタイムバージョンは.NET Core 3.1としています。
検証はしませんが.NET Core 2.1でも基本的なところは変わらないと思います。

AWS Toolkit for Visual Studio Code

Visual Studio Code向けのAWS拡張としてAWS Toolkit for Visual Studio Codeが提供されており、サーバレスアプリケーション開発を行うための幾つかの機能が提供されています。

ただ、この拡張では

  • Lambda関数の実行
  • SAMアプリケーションのデバッグ

は可能なのですが、今回私がやりたい単体のLambda関数のプロジェクトを作ってデバッグするといった用途には不向きでした。
またSAMアプリケーションのデバッグはC#も対応しているのですが、本日(2020年4月14日)時点では.NET Core 3.1には未対応だったため利用を見送りました。
(.NET Core 3.1対応は近いうちにされるそうです)

1. .NET Core SDKのインストール

ここから実際に開発環境を作っていきます。

なにはともあれ最初に.NET Core SDKをインストールしないと始まりません。
.NET Core SDKのインストール方法は幾つかありますが本記事ではMSIインストーラーからインストールします。

.NETのサイトから最新の.NET Core 3.1 SDKのMSIインストーラーをダウンロードしてインストールします。
今回は v3.1.201 をダウンロードします。

インストール手順はウィザードに従うだけですので本記事ではスクリーンショットだけ掲載しておきます。

インストール後、PowerShellコンソールやコマンドプロンプトからdotnet --versionを実行しバージョンが表示されれば完了です。

2. C# Lambda用開発テンプレートのインストール

次にC# Lambda開発用のテンプレートをインストールします。
コンソール上で以下のコマンドを実行します。

dotnet new -i Amazon.Lambda.Templates

これで追加のテンプレートがインストールされます。

例えば空のテンプレート(lambda.EmptyFunction)からプロジェクトを作成する場合は以下の様にします。

cd [開発用ディレクトリ]
dotnet new lambda.EmptyFunction --name MyFunction

3. AWS Extensions for .NET CLI のインストール

Lambda関数のデプロイに必要なのでAWS Extensions for .NET CLIをインストールします。
このツールは.NET Global Toolsとして提供されているので以下のコマンドでインストールします。

dotnet tool install -g Amazon.Lambda.Tools

このツールをインストールすることでdotnet lambdaな各種コマンドが使える様になります。

4. AWS .NET Mock Lambda Test Tool (Preview)のインストール

ローカル環境からLambda関数をデバッグするためにAWS .NET Mock Lambda Test Toolをインストールします。
このツールも.NET Global Toolsとして提供されているので以下のコマンドでインストールします。

# .NET Core 3.1向け
dotnet tool install -g Amazon.Lambda.TestTool-3.1

# ちなみに .NET Core 2.1向けの場合は以下
# dotnet tool install -g Amazon.Lambda.TestTool-2.1

このツールの使い方については後述します。

5. Visual Studio Codeおよび拡張機能のインストール

エディタ兼デバッガとしてVisual Studio Codeと以下の拡張をインストールします。

今回は最初に触れた通りAWS Toolkit for Visual Studio Codeはインストールしませんが、必要に応じてインストールしておいても良いでしょう。
その場合は追加でAWS SAM CLIもインストールする必要があります。

Visual Studio Codeのインストールと設定手順ついては詳細を割愛します。
本記事では執筆時点で最新の

  • Visual Studio Code : Ver. 1.44.1 (March 2020)
  • C# for Visual Studio Code : Ver. 1.21.17

を使っています。

以上で環境構築は完了です。

Lambda関数を作ってみる

開発環境が出来上がりましたので、ここからは実際にプロジェクトを作ってデバッグしてみます。

プロジェクトの作成

プロジェクトの作成は.NET Core CLIから行います。
今回はS3のテンプレートからプロジェクトを作ってみます。

dotnet new lambda.S3 --name lambda-s3

するとカレントディレクトリにlambda-s3フォルダが作成され、各種ファイルが生成されます。

プロジェクト設定

Visual Studio Codeでこのlambda-s3フォルダを開くと、dotnet restoreを要求されるのでRestoreボタンを押して依存関係の復元を行っておきます。
(ボタンを押しそびれた場合は手動でdotnet restoreコマンドを実行しても構いません)
これで起動時に表示されていたエラーが解消されるはずです。

あとビルド用にaws-lambda-tools-defaults.jsonファイルを環境に応じて変更しておきます。
最低限profileregionを埋めておけば良いでしょう。

デバッグ設定

次に左ペインのデバッグアイコンを選択しlaunch.jsonファイルを生成します。環境は.NET Coreを選びます。

今回は以下のファイルが生成され、既定ではテストのDLLを実行する様になっています。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "${workspaceFolder}/test/lambda-s3.Tests/bin/Debug/netcoreapp3.1/lambda-s3.Tests.dll",
            "args": [],
            "cwd": "${workspaceFolder}/test/lambda-s3.Tests",
            "console": "internalConsole",
            "stopAtEntry": false
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}

これをAWS .NET Mock Lambda Test Toolを実行する様に以下の様に書き換えます。

{
    // IntelliSense を使用して利用可能な属性を学べます。
    // 既存の属性の説明をホバーして表示します。
    // 詳細情報は次を確認してください: https://go.microsoft.com/fwlink/?linkid=830387
    "version": "0.2.0",
    "configurations": [
        {
            "name": ".NET Core Launch (console)",
            "type": "coreclr",
            "request": "launch",
            "preLaunchTask": "build",
            "program": "C:/Users/${env:USERNAME}/.dotnet/tools/dotnet-lambda-test-tool-3.1.exe",
            "args": [],
            "cwd": "${workspaceFolder}\\src\\${workspaceFolderBasename}\\bin\\Debug\\netcoreapp3.1",
            "console": "internalConsole",
            "stopAtEntry": false,
            "internalConsoleOptions": "openOnSessionStart"
        },
        {
            "name": ".NET Core Attach",
            "type": "coreclr",
            "request": "attach",
            "processId": "${command:pickProcess}"
        }
    ]
}
  • "program" を dotnet-lambda-test-tool-3.1.exe のあるパスに更新
  • "cwd" をバイナリの生成されるパスに(*.dep.jsonのあるパスに)更新
  • "internalConsoleOptions": "openOnSessionStart" を追加

設定の詳細はGitHubをご覧ください。

変更後に.NET Core Launch (console)を実行すると、

localhostの5050番ポートでAWS .NET Mock Lambda Test Toolが起動しWEBブラウザで以下の画面が表示されます。

あとは関数の引数を適切に選んでやってExecute Functionのボタンを押すとローカルで関数が実行されデバッグすることができます。

関数のデプロイ

関数のデプロイは.NET Core CLIから行います。
dotnet lambda deploy-functionコマンドで関数をデプロイします。

cd [.csprojのあるディレクトリ]
dotnet lambda deploy-function [関数名] --function-role [関数の実行ロール] --profile [使用プロファイル]
  • 上記は一例です。引数の詳細はヘルプを参照してください。

無事関数がデプロイされれば完了です。

階層型コンパイルの使用について

前の記事で書いた様に階層型コンパイルの使用するには"/p:PublishReadyToRun=true --self-contained false"を追加して以下の様にすれば良いのですが、これは開発環境がLinuxである必要があります。

cd [.csprojのあるディレクトリ]
dotnet lambda deploy-function [関数名] --msbuild-parameters "/p:PublishReadyToRun=true --self-contained false" --function-role [関数の実行ロール] --profile [使用プロファイル]

Windows環境で実行しても次の様なエラーとなってしまいます。

最後に

ざっとこんな感じです。

いろいろ頑張って環境をつくってみましたが、Windows環境では素直にVisual Studioをインストールしたほうが簡単で開発効率もぐっと上がる気がします...
とはいえVisual Studioをインストールできない環境の方もいると思いますので、そういう方には本記事の内容も役に立つのではと考えています。状況に応じて適切な環境を作っていただければと。

私はプライベートで使用するPCにはVisual StudioをインストールしてますのでVisual Studio Codeと使い分けていこうと思います。

参考資料