12/06 Netlify Functions

2 min読了の目安(約1900字TECH技術記事

この記事は、Serverless Hello World Advent Calendar 2020の6日目です。

Netlify FunctionsでHTTP APIを実装します。

関数の作成

Netlify Functionsではコードジェネレータ等は特に用意していないようなので、素直に書いていきます。

$ mkdir helloworld
$ cd helloworld
$ git init 
$ mkdir functions

まずはNetlifyに関数を読み込ませるディレクトリを指定します。

netlify.toml
[build]
  functions = "functions"

つづいて、さきほど作ったfunctionsディレクトリに関数の本体を置いていきます。

functions/hello.js
'use strict';

exports.handler = async function (event, context) {
  const body = event.body ? JSON.parse(event.body) : {};
  const name = event.queryStringParameters.name || body.name || '';
  return {
    statusCode: 200,
    body: JSON.stringify({message: `Hello ${name}!`}),
  };
};
$ git add .
$ git commit

GitHubにpushして、Netlifyに登録します。特にNetlify Functions固有の設定などは不要です。

少し待つとデプロイが完了するので、cURLで叩いてみます。
URLは{サイトURL}/.netlify/functuions/{関数名}になります。

curl -v 'https://friendly-pike-1b50fb.netlify.app/.netlify/functions/hello?name=world'
*   Trying 18.136.21.181:443...
* TCP_NODELAY set
* Connected to friendly-pike-1b50fb.netlify.app (18.136.21.181) port 443 (#0)

...(省略)...

> GET /.netlify/functions/hello?name=world HTTP/2
> Host: friendly-pike-1b50fb.netlify.app
> user-agent: curl/7.68.0
> accept: */*
> 
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* TLSv1.3 (IN), TLS handshake, Newsession Ticket (4):
* old SSL session ID is stale, removing
* Connection state changed (MAX_CONCURRENT_STREAMS == 150)!
< HTTP/2 200 
< cache-control: no-cache
< date: Tue, 15 Dec 2020 20:12:46 GMT
< content-length: 26
< content-type: text/plain; charset=utf-8
< age: 0
< server: Netlify
< x-nf-request-id: 738de0d0-bc2d-42da-b98b-17be5b7e48cc-38804153
< 
* Connection #0 to host friendly-pike-1b50fb.netlify.app left intact
{"message":"Hello world!"}%

Netlify上にhello関数をデプロイできました。
とにかくAWS Lambadaベースの関数を同じドメイン上で動かせるというのはCORS等を考えなくても良いこともあり手軽で良いですね。