Visual Studio for Mac で使用する AWS Lambda(C#)のテンプレート
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] 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ファンクションの本体です
(3) デバッグ実行
続いて、Function.FunctionHandlerの中の、適当な所にブレークポイントを設定し、デバッグ実行してみて下さい。 ブレークポイントで停止して、変数等を確認出来ていることを見ることができます。
このデバック要領で、ファンクションを完成させます。
なお、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 nameをAWSLambdaSampleとしました。(名前については、なんでも構いません。) また、IAMロールについては、予め、作成済みのlambda_exec_testを使用しました。
AWSコンソールを開くと、今、デプロイしたファンクションが出来ていることを確認できます。
(5) テスト実行
この雛形は、デフォルトのテスト用ペーロードで動作するようになっておりますので、下記のように、Execution result: succeededで、戻り値、ログなども確認することができます。
3 最後に
まだまだ未完成ですが、個人的には、やっとMacでもC#でLambdaを書ける環境が整ってきました感じです。 今後、このテンプレートを使用して、色々試してみたいと思います。
4 参考資料
Announcing C# Support for AWS Lambda
Creating a Deployment Package (C#) > .NET Core CLI
Deploying an AWS Lambda Project with the .NET Core CLI