Visual Studio for Mac で使用する AWS Lambda(C#)のテンプレート

2017.01.02

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

1 はじめに

AWS LambdaをC#で構築する際に、Windows上の Visual Studioであれば、AWS Toolkit for Visual Studioをインストールすることで、プロジェクトのテンプレートから、デプロイ、実行まで全ての環境が揃います。しかし、残念ながら、Mac上で作業する場合、そのような便利なツールキットは提供されていません。

そこで、今回は、Visual Studio for Macを使用して、少しでも、上記のような快適な環境が出来ないかと、テンプレートを作成してみました。

内容としては、下記で行った作業を、GitHubに置いたのと、コマンド等をシェル化しただけです。

Visual Studio for Mac で AWS Lambda(C#)ファンクションを作成してみた

.NET Core CLIによる AWS Lambda Project のデプロイ

github [GitHub] https://github.com/furuya02/AWSLambdaSample

2 使用方法

使い方は、下記のとおりです。

(1) githubからのclone作成

テンプレートは、GitHub上に有りますので、手元にダウンロードして下さい。

$ git clone https://github.com/furuya02/AWSLambdaSample

(2) Visual Studio for Macで開く

Visual Studio for Macを起動し、メニューから ファイル > 開く > AWSLambdaSample.slnでプロジェクトを開いて下さい。

(パッケージは自動的に復元されますが、もし、エラーとなった場合は、パッケージ > 復元 で強制的に復元して下さい)

ソリューションエクスプローラーからFunction.csを開いてみて下さい。ここにある、Function.FunctionHandlerが、Lambdaファンクションの本体です 002

(3) デバッグ実行

続いて、Function.FunctionHandlerの中の、適当な所にブレークポイントを設定し、デバッグ実行してみて下さい。 ブレークポイントで停止して、変数等を確認出来ていることを見ることができます。

001

このデバック要領で、ファンクションを完成させます。

なお、Functoin.csが、Lambdaファンクションの本体で、Program.csが、テスト実行側になります。詳しくは、下記をご参照下さい。

Visual Studio for Mac で AWS Lambda(C#)ファンクションを作成してみた

Program.csの方は、下記のように簡略化しても問題ありません。

static void Main(string[] args)
{
var sampleData = new SampleData() { Key1 = "value1", Key2 = "value2", Key3 = "value3" };
(new Function).FunctionHandler(sampleData, new TestLambdaContext());
}

(4) コンパイル・パッケージ作成・デプロイ

プロジェクトの中のproject.jsonの存在するフォルダに移動します。

$ ls -la
total 56
drwxr-xr-x 11 sin staff 374 12 30 08:36 .
drwxr-xr-x 9 sin staff 306 12 30 08:34 ..
-rw-r--r-- 1 sin staff 1267 12 30 08:34 AWSLambdaSample.csproj
-rw-r--r-- 1 sin staff 294 12 30 08:34 AWSLambdaSample.csproj.user
-rw-r--r-- 1 sin staff 586 12 30 08:34 Function.cs
-rw-r--r-- 1 sin staff 697 12 30 08:34 Program.cs
-rw-r--r-- 1 sin staff 306 12 30 08:34 aws-lambda-tools-defaults.json
drwxr-xr-x 3 sin staff 102 12 30 08:36 bin
-rw-r--r-- 1 sin staff 686 12 30 08:34 createLambdaPacket.pi
drwxr-xr-x 6 sin staff 204 12 30 08:36 obj
-rw-r--r-- 1 sin staff 533 12 30 08:34 project.json

ここで、createLambdaPacket.piを実行します。

このシェルでは、一時的に作業フォルダを作成し、ライブラリの復元、コンパイル、パッケージ作成、デプロイまでを行います。 なお、シェルの最後の方で、AWS Lambda functionの名前と、IAMロールの指定を問うプロンプトが表示されますので、入力が必要です。

$ python createLambdaPacket.pi
Function.cs
log : Restoring packages for /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/project.json...
log : Restoring packages for tool 'Amazon.Lambda.Tools' in /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/project.json...
log : Writing lock file to disk. Path: /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/project.lock.json
log : /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/project.json
log : Restore completed in 2707ms.
Executing publish command
... invoking 'dotnet publish', working folder '/Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish'
... publish: Publishing AWSLambdaSample for .NETCoreApp,Version=v1.0
... publish: Project AWSLambdaSample (.NETCoreApp,Version=v1.0) will be compiled because expected outputs are missing
... publish: Compiling AWSLambdaSample for .NETCoreApp,Version=v1.0
... publish: Compilation succeeded.
... publish: 0 Warning(s)
... publish: 0 Error(s)
... publish: Time elapsed 00:00:01.6818108
... publish:
... publish: publish: Published to /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish
... publish: Published 1/1 projects successfully
Changed permissions on published dll (chmod +r Amazon.Lambda.Core.dll).
Changed permissions on published dll (chmod +r Amazon.Lambda.Serialization.Json.dll).
Changed permissions on published dll (chmod +r AWSLambdaSample.dll).
Changed permissions on published dll (chmod +r Newtonsoft.Json.dll).
Changed permissions on published dll (chmod +r System.Runtime.Serialization.Primitives.dll).
Zipping publish folder /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish to /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip
... publish: adding: Amazon.Lambda.Core.dll (deflated 57%)
... publish: adding: Amazon.Lambda.Serialization.Json.dll (deflated 55%)
... publish: adding: AWSLambdaSample.deps.json (deflated 72%)
... publish: adding: AWSLambdaSample.dll (deflated 64%)
... publish: adding: AWSLambdaSample.pdb (deflated 37%)
... publish: adding: Newtonsoft.Json.dll (deflated 60%)
... publish: adding: System.Runtime.Serialization.Primitives.dll (deflated 48%)
Created publish archive (/Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip).
Lambda project successfully packaged: /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip
Executing publish command
Deleted previous publish folder
... invoking 'dotnet publish', working folder '/Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish'
... publish: Publishing AWSLambdaSample for .NETCoreApp,Version=v1.0
... publish: Project AWSLambdaSample (.NETCoreApp,Version=v1.0) was previously compiled. Skipping compilation.
... publish: publish: Published to /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish
... publish: Published 1/1 projects successfully
Changed permissions on published dll (chmod +r Amazon.Lambda.Core.dll).
Changed permissions on published dll (chmod +r Amazon.Lambda.Serialization.Json.dll).
Changed permissions on published dll (chmod +r AWSLambdaSample.dll).
Changed permissions on published dll (chmod +r Newtonsoft.Json.dll).
Changed permissions on published dll (chmod +r System.Runtime.Serialization.Primitives.dll).
Zipping publish folder /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/publish to /Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip
... publish: adding: Amazon.Lambda.Core.dll (deflated 57%)
... publish: adding: Amazon.Lambda.Serialization.Json.dll (deflated 55%)
... publish: adding: AWSLambdaSample.deps.json (deflated 72%)
... publish: adding: AWSLambdaSample.dll (deflated 64%)
... publish: adding: AWSLambdaSample.pdb (deflated 37%)
... publish: adding: Newtonsoft.Json.dll (deflated 60%)
... publish: adding: System.Runtime.Serialization.Primitives.dll (deflated 48%)
Created publish archive (/Users/hirauchishinichi/Documents/work3/AWSLambdaSample/AWSLambdaSample/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip).
Enter Function Name: (AWS Lambda function name)
AWSLambdaSample
Creating new Lambda function
Select IAM Role that Lambda will assume when executing function:
1) lambda_exec_test
2) *** Create new IAM Role ***
1
New Lambda function created

上記では、AWS Lambda function nameAWSLambdaSampleとしました。(名前については、なんでも構いません。) また、IAMロールについては、予め、作成済みのlambda_exec_testを使用しました。

AWSコンソールを開くと、今、デプロイしたファンクションが出来ていることを確認できます。 003

(5) テスト実行

この雛形は、デフォルトのテスト用ペーロードで動作するようになっておりますので、下記のように、Execution result: succeededで、戻り値、ログなども確認することができます。

004

3 最後に

まだまだ未完成ですが、個人的には、やっとMacでもC#でLambdaを書ける環境が整ってきました感じです。 今後、このテンプレートを使用して、色々試してみたいと思います。

4 参考資料

Announcing C# Support for AWS Lambda

Lambda Function Handler (C#)

Creating a Deployment Package (C#) > .NET Core CLI

AWS Lambda for .NET Core

Deploying an AWS Lambda Project with the .NET Core CLI

Visual Studio for Mac で AWS Lambda(C#)ファンクションを作成してみた

.NET Core CLIによる AWS Lambda Project のデプロイ