.NET Core CLIによる AWS Lambda Project のデプロイ
1 はじめに
今回は、Amazon.Lambda.Toolsを使用して、.NET Core CLIからLambdaファンクションをパッケージ化してAWSにデプロイする作業をやってみました。
Amazon.Lambda.Toolsは、AWS Lambda の管理コマンドを.NETCoreに追加するものであり、Windowsで利用可能な、Visual Studio の AWS SDK for .NETでも、バックでこれが利用されています。
2 プロジェクトへの追加
Amazon.Lambda.Toolsをプロジェクで利用可能にするためには、project.jsonのdependenciesとtoolsのセクションに設定する必要があります。
下記は、その一例です。
project.json
{ "version": "1.0.0-*", "dependencies": { "Microsoft.NETCore.App": { "type": "platform", "version": "1.1.0" }, "Amazon.Lambda.Tools" : { "type" :"build", "version":"1.0.4-preview1" } }, "tools": { "Amazon.Lambda.Tools" : "1.0.4-preview1" }, "frameworks": { "netcoreapp1.0": { "imports": "dnxcore50" } } }
(1) dependencies
dependenciesに記載することで、Nugetパッケージでの追加が可能となり、dotnet restoreコマンドで、ダウンロードすることができます。
$ dotnet restore log : Restoring packages for /tmp/AWSLambdaSample/project.json... log : Installing Amazon.Lambda.Tools 1.0.4-preview1. log : Restoring packages for tool 'Amazon.Lambda.Tools' in /tmp/AWSLambdaSample/project.json... log : Writing lock file to disk. Path: /tmp/AWSLambdaSample/project.lock.json log : /tmp/AWSLambdaSample/project.json log : Restore completed in 8939ms.
ダウンロードされたパッケージは、.nugetフォルダに配置されます。
$ ls -la ~/.nuget/packages/Amazon.Lambda.Tools total 0 drwxr-xr-x 3 hirauchishinichi staff 102 12 29 08:16 . drwxr-xr-x 204 hirauchishinichi staff 6936 12 29 08:15 .. drwxr-xr-x 7 hirauchishinichi staff 238 12 29 08:16 1.0.4-preview1
(2) tools
toolsに記載されていることで、dotnetコマンドが拡張されます。
$ dotnet lambda --help AWS Lambda Tools for .NET Core functions Project Home: https://github.com/aws/aws-lambda-dotnet Commands to deploy and manage AWS Lambda functions: deploy-function Command to deploy the project to AWS Lambda invoke-function Command to invoke a function in Lambda with an optional input list-functions Command to list all your Lambda functions delete-function Command to delete an AWS Lambda function get-function-config Command to get the current runtime configuration for a Lambda function update-function-config Command to update the runtime configuration for a Lambda function Commands to deploy and manage AWS Serverless applications using AWS CloudFormation: deploy-serverless Command to deploy an AWS Serverless application list-serverless Command to list all your AWS Serverless applications delete-serverless Command to delete an AWS Serverless application Other Commands: package Command to package a Lambda project into a zip file ready for deployment To get help on individual commands execute: dotnet lambda help <command></command>``` <command></command>helpオプションで、だいたい何が出来るのか分かります。 なお、上記のどちらかが無効な場合、下記のようにエラーとなりますので、設定を見直してみて下さい。
$ dotnet lambda --help No executable found matching command "dotnet-lambda"
<br />## 3 deploy-function 下記のコマンドで、コードをコンパイルし、それをパッケージ(zipファイル)化し、AWS上へのデプロイまで一気に行うことができます。 (事前に **dotnet restore**でライブラリの復元が終わっている必要があります)
$ dotnet lambda deploy-function
<br />しかし、設定値が非常に多いため、次のように、各種の問い合わせに全部答えるのが大変です。 **aws-lambda-tools-defaults.json**ファイルを作成しておくと、これらの問い合わせにデフォルト値を設定することが可能になります。
{ "profile":"default", "region" : "ap-northeast-1", "configuration" : "Release", "framework" : "netcoreapp1.0", "function-runtime":"dotnetcore1.0", "function-memory-size" : 256, "function-timeout" : 30, "function-handler" : "AWSLambdaSample::AWSLambdaSample.Function::FunctionHandler" } ```
上記のファイルを作成しておけば、問い合への入力が必要なのは、LambdaファンクションのAWS上での名前とIAMロールだけになります。(同じ名前で上書きする場合は、IAMロールは問われません)
$ dotnet lambda deploy-function Executing publish command ... invoking 'dotnet publish', working folder '/tmp/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:02.0339991 ... publish: ... publish: publish: Published to /tmp/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 /tmp/AWSLambdaSample/bin/Release/netcoreapp1.0/publish to /tmp/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 (/tmp/AWSLambdaSample/bin/Release/netcoreapp1.0/AWSLambdaSample.zip). Enter Function Name: (AWS Lambda function name) test 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」の問い合わせに答える名前を変えると、別のファンクションとしてデプロイされます。
以下は、AWSコンソールから、デプロイされていることを確認している様子です。
4 最後に
Winddows上のVisual Studio に提供されている AWS SDK for .NETは、Visual Studio上からデプロイや実行が可能なUIが提供されていますが、裏で動作しているのは、このコマンドなので、Mac上でも同様の作業が可能なはずです。
次回は、このコマンドをうまく組み合わせて、githubから雛形をcloneして、コマンド一回ぐらいでデプロイ出来るところまでやってみたいと思います。