Problem
AWS Lambda が、.NET Core 2.1 をサポートされて、1年以上経過しました。
しかし、サポートされているのはC#だけではありません。F#もまた同様です。
F#は.NETで実行される機能言語であり、C#で記述されたAWS SDK for .NETなど、他の.NET言語で記述されたパッケージを使用できます。
これまでに、F#を使用したAWS Lambdaのプロジェクトを作ったことがない方にも分かるように作り方をまとめます。
Solution
開発環境
Windowsの場合
開発環境は以下の通りです。
項目 | 値 |
---|---|
IDE | Visual Studio 2019 |
Macの場合
項目 | 値 |
---|---|
IDE | Visual Studio Code |
準備
Windowsの場合
AWS Toolkit for Visual Studio のインストール
AWS Toolkit for Visual Studioをインストールしておくことで、簡単にプロジェクトを作成することができます。
こちらからダウンロードし、インストールしましょう。
Macの場合
Amazon.Lambda.Templates のインストール
Amazon.Lambda.Templatesをインストールしておくことにより、dotnet
コマンドで簡単にプロジェクトを作成することができます。
こちらからダウンロードし、インストールしましょう。
また、こちらはWindowsでも使用することができます。
プロジェクトを作る
プロジェクトを作りましょう。
Windowsの場合
Create a new project
よりAWS Lambda Project with Tests(.Net Core - F#)
を選択します。
プロジェクト名を入力後、使用するテンプレートを選択します。今回の例ではEmpty Function
を選択しました。
Macの場合
dotnet new lambda.EmptyFunction -o HelloLambda -lang f#
code ./HelloLambda -r
これで、プロジェクトWindow/Macのいずれかで、プロジェクトを作成することができました。
それでは、プロジェクトで作成されたファイルのいくつかを見てみましょう。
生成されたファイル
Functions.fs
: - Lambdaのハンドラーを定義します。
namespace HelloLambda
open Amazon.Lambda.Core
open System
// Assembly attribute to enable the Lambda function's JSON input to be converted into a .NET class.
[<assembly: LambdaSerializer(typeof<Amazon.Lambda.Serialization.Json.JsonSerializer>)>]
()
type Function() =
/// <summary>
/// A simple function that takes a string and does a ToUpper
/// </summary>
/// <param name="input"></param>
/// <param name="context"></param>
/// <returns></returns>
member __.FunctionHandler (input: string) (_: ILambdaContext) =
match input with
| null -> String.Empty
| _ -> input.ToUpper()
aws-lambda-tools-defaults.json –デプロイに必要な設定情報が含まれています。
{
"Information" : [
"This file provides default values for the deployment wizard inside Visual Studio and the AWS Lambda commands added to the .NET Core CLI.",
"To learn more about the Lambda commands with the .NET Core CLI execute the following command at the command line in the project root directory.",
"dotnet lambda help",
"All the command line options for the Lambda command can be specified in this file."
],
"profile" : "default",
"region" : "ap-northeast-1",
"configuration" : "Release",
"framework" : "netcoreapp2.1",
"function-runtime" : "dotnetcore2.1",
"function-memory-size" : 256,
"function-timeout" : 30,
"function-handler" : "HelloLambda::HelloLambda.Function::FunctionHandler"
}
実行してみる
Windowsの場合
AWS .NET Mock Lambda Test Tool (Preview)
を使用することでLambda関数の処理を確かめることができます。
Macの場合
WindowsのようなToolkitはないので、単体テストコードを使用することでLambda関数の処理を確かめることができます。
テストコードはプロジェクトフォルダ/test/プロジェクト名.Tests/
にあります。
namespace HelloLambda.Tests
open Xunit
open Amazon.Lambda.TestUtilities
open HelloLambda
module FunctionTest =
[<Fact>]
let ``Invoke ToUpper Lambda Function``() =
// Invoke the lambda function and confirm the string was upper cased.
let lambdaFunction = Function()
let context = TestLambdaContext()
let upperCase = lambdaFunction.FunctionHandler "hello world" context
Assert.Equal("HELLO WORLD", upperCase)
[<EntryPoint>]
let main _ = 0
cd HelloLambda/test/HelloLambda.Tests
dotnet test
Conclusion
AWS Lambdaプロジェクトを作成し、実行して検証するところまではこれでできるようになりました。
S3のPutイベントを元にサムレイル画像を生成したり、リアルタイムにストリーミングデータを処理したり...色々と試してみてください。