Netlifyでサーバーレスのアーキテクチャを無料で構築できることご存知ですか。今日はNetlifyのfunctions
を使って、express + serverless + GraphQLのHelloWorld
を作ってデプロイしてみましょう。
必要なパッケージのインストール
最低限のパッケージはexpress
&body-parser
&express-graphql
&graphql
&serverless-http
となります。
yarn add express body-parser express-graphql graphql serverless-http
フォルダの基本構成
- src
- schema
- schema.js
- api.js
- package.json
GraphQLのスキーマの定義
実際はオリジナルのGraphQLより、graphql-yogaのほうがわかりやすいですが、今日はHelloWorldなので、オリジナルのもので定義してみましょう。
import { GraphQLSchema, GraphQLObjectType, GraphQLString } from "graphql";
export default new GraphQLSchema({
query: new GraphQLObjectType({
name: "HelloWorld",
fields: () => ({
message: {
type: GraphQLString,
resolve: () => "Hello World!!!",
}
})
})
});
query: new GraphQLObjectType({
name: "HelloWorld",
これで、name=HelloWorld
というquery
を定義しました。(GraphQLに初めての方はqueryがSqlのSelect
と考えればいい)
message: {
type: GraphQLString,
このqueryを実行すると、{ message: 'xxxxxx' }
をgetできます。messageの型はstring
となります。
resolve: () => "Hello World!!!",
実際にgetできるのは、ここに固定文字列HelloWorld!!!
となります。
サーバーレスのexpressサーバ
※注意:この実装方法ならリクエストが来る度、expressサーバの再起動が発生するので、productionモードに向いていないかもしれません。
import express from "express";
import bodyParser from "body-parser";
import { graphqlHTTP } from "express-graphql";
import serverless from "serverless-http";
import schema from "./settings/schema";
// expressサーバ
const app = express();
app.use(bodyParser.json());
// 全てのリクエストをexpress-graphqlサーバーへ
app.use("/", graphqlHTTP({
schema,
graphiql: true,
}));
// サーバーレス用の関数へ変換
export const handler = serverless(app);
ローカルで起動
netlify-lambda
を利用してローカルでGraphQLサーバ起動してみましょう。まずはパッケージのインストールをしておきましょう。
# netlify-lambdaをパッケージリストへ追加
yarn add -D netlify-lambda
そしてスクリプトをpackage.json
へ追加してみましょう。
{
"scripts": {
"dev": "netlify-lambda serve src",
"build": "netlify-lambda build src"
}
}
次へnetlify.toml
ファイルを追加しましょう。
[build]
command = "yarn && yarn build"
functions = "functions"
最後に、yarn dev
で起動してみましょう。http://localhost:9000/.netlify/functions/api へアクセスしてみれば、GraphQL-serverへアクセスできるようになりました。
query { message }
を実行したら、ちゃんとHelloWorld!!!
を取れるでしょう。schema.js
とapi.js
を変更したら、サーバが自動的に再起動され、しばらく経つとGraphQLのquery結果には反映します。とても便利ですね。
redirects
ソースコードをGithubなどにアップしたらNetlifyとすぐ連携できます。しかし、そのままデプロイすると、apiのURLはhttps://xxxxxxxxx.netlify.app/.netlify/functions/api
となります。Netlifyのredirects
を利用して、apiのURLをもっとわかりやすくしましょう。
netlify.toml
に下記の内容を追加しましょう。
[[redirects]]
from = "/api/v1/*"
to = "/.netlify/functions/api/:splat"
status = 200
force = true
apiのURLはhttps://xxxxxxxxx.netlify.app/api/v1
のわかりやすい形でアクセスできるようになりました。便利ですよね。
完了
これでサーバーレスのGraphQLをNetlify functionsへのデプロイが完了しました。
フルソースコードはGithubへアップロード済みなので、ご参照ください。
https://github.com/thundermiracle/express-graphql-serverless