Netlify FunctionsをTypeScriptで実装する方法を紹介します。
環境構築
必要なパッケージをインストールする
yarn add -D typescript netlify-lambda @types/aws-lambda @babel/preset-typescript
- netlify-lambda: Babel+WebPackを内包していて、TSで実装したFunctionをシングルファイルのJSにビルドしてくれるツールです。
- @types/aws-lambda: Netlify FunctionsはAWS Lambdaとインターフェイスが同じなので、その型定義ファイルを入れておきます。
- @babel/preset-typescript: netlify-lambdaがBabelなので、BabelでTSをビルドするために必要です。
Babelの設定を書く
プロジェクトルートに以下の内容で.babelrcを作ります:
{
"presets": [
"@babel/preset-typescript",
[
"@babel/preset-env",
{
"targets": {
"node": "12"
}
}
]
],
"plugins": []
}
TypeScriptのコンパイル設定
Netlify FunctionsはNode.js 12が実行環境なので、それに合ったtarget
とlib
を設定します。
{
"compilerOptions": {
"target": "ES2019",
"module": "commonjs",
"lib": [
"ES2020"
],
"noEmit": true
}
}
tsc
でJSを生成することはないので、noEmit
を設定しておきます。
package.jsonの設定
package.jsonにscripts
とengines
を追加します。
{
"scripts": {
"build": "netlify-lambda build src/",
"serve": "netlify-lambda serve src/"
},
"engines": {
"node": "^12.9.0"
}
}
build
スクリプトは、TSファイルからJSファイルを生成するものです。serve
スクリプトはローカルで関数を試せるようにするものです。TSファイルは、./src
ディレクトリに置くことにします。
engines
にはNode.js 12.9以上を要求する設定にしておきます。
Netlifyの設定
Netlify Functionsの置き場と、ビルドコマンドを指定しておきます。
[build]
functions = "./functions"
commands="yarn build"
ビルドコマンドは先ほどpackage.jsonで定義した、build
スクリプトです。
※この設定でNetlifyにデプロイしてyarn build
が動かない場合は、Netlifyの管理画面でyarn build
を設定してください:
.gitignoreの設定
/functions
はビルドの生成物が入るところなので、gitの管理対象外にしておきます。
/functions
/node_modules
NetlifyのNodeバージョンを12に設定する
NetlifyはデフォルトでNode 10が使われます。package.jsonで12.9以上を要求しているので、そのままだとビルドがFailになります。そうならないよう環境変数の設定にNODE_VERSION
、値12
を追加しておきます:
以上で環境構築は完了です。
TypeScriptで関数を実装する
上の手順でTypeScriptファイルは./src
に置くことにしたので、ためしに./src/hello.ts
を作ってみましょう。
import { APIGatewayProxyHandler } from 'aws-lambda'
export const handler: APIGatewayProxyHandler = (
event,
context,
callback
) => {
const subject = event.queryStringParameters?.name ?? 'World'
callback(null, {
statusCode: 200,
headers: {
'Content-Type': 'application/json'
},
body: JSON.stringify(`Hello ${subject}`)
})
}
これを作ったらローカルで動かしてみます:
yarn serve
curl http://localhost:9000/hello
"Hello World"が出力されれば成功です。
デプロイする
あとは普通にgit push
すればデプロイできます。デプロイプロセスが開始すると、ビルドが走り、JSにコンパイルされた関数がNetlify Functionsに配置されます。
おわり
本稿で紹介した手順をほどこしたサンプルリポジトリはGitHubにあげてあります。