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

2017.01.01

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

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

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#)ファンクションを作成してみた