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

AmazonLambda

1 はじめに

今回は、Amazon.Lambda.Toolsを使用して、.NET Core CLIからLambdaファンクションをパッケージ化してAWSにデプロイする作業をやってみました。

Amazon.Lambda.Toolsは、AWS Lambda の管理コマンドを.NETCoreに追加するものであり、Windowsで利用可能な、Visual StudioAWS SDK for .NETでも、バックでこれが利用されています。
Amazon.Lambda.Tools

2 プロジェクトへの追加

Amazon.Lambda.Toolsをプロジェクで利用可能にするためには、project.jsonのdependenciestoolsのセクションに設定する必要があります。

下記は、その一例です。

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>

helpオプションで、だいたい何が出来るのか分かります。

なお、上記のどちらかが無効な場合、下記のようにエラーとなりますので、設定を見直してみて下さい。

$ dotnet lambda --help
No executable found matching command "dotnet-lambda"

3 deploy-function

下記のコマンドで、コードをコンパイルし、それをパッケージ(zipファイル)化し、AWS上へのデプロイまで一気に行うことができます。 (事前に dotnet restoreでライブラリの復元が終わっている必要があります)

$ dotnet lambda deploy-function

しかし、設定値が非常に多いため、次のように、各種の問い合わせに全部答えるのが大変です。

$ dotnet lambda deploy-function
Enter Build Configuration: (Configuration to build with, for example Release or Debug)
Release
Enter Framework: (Target framework to compile, for example netcoreapp1.0)
netcoreapp1.0
Enter Runtime: (The runtime environment for the Lambda function)

・・・省略・・・

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コンソールから、デプロイされていることを確認している様子です。

002 001

4 最後に

Winddows上のVisual Studio に提供されている AWS SDK for .NETは、Visual Studio上からデプロイや実行が可能なUIが提供されていますが、裏で動作しているのは、このコマンドなので、Mac上でも同様の作業が可能なはずです。

次回は、このコマンドをうまく組み合わせて、githubから雛形をcloneして、コマンド一回ぐらいでデプロイ出来るところまでやってみたいと思います。

5 参考資料


AWS Lambda for .NET Core
Deploying an AWS Lambda Project with the .NET Core CLI
Visual Studio for Mac で AWS Lambda(C#)ファンクションを作成してみた