動かざることバグの如し

近づきたいよ 君の理想に

fastifyでAPIサーバーを作成、GCPに音速デプロイ

結論

fastify使うなら fastify-cli使え

環境

  • Nodejs 10
  • fastify v3.0.0

概要

Nodejsでサーバーfastify-cliを使ってAPIサーバーのひな壇を作って、GCPのCloud Runにデプロイするところまでやってみる。

インストール

まずはfastify-cliをインストール 公式ではグローバルインストールが推奨されている

npm install fastify-cli --global

これで fastify コマンドが使えるようになる。

ひな壇作成

fastify generate YOUR_APP_NAME
cd yourapp
yarn install

するとこんな感じのひな壇が生成される。

├── app.js
├── node_modules
├── package.json
├── plugins
│   ├── README.md
│   └── support.js
├── routes
│   ├── README.md
│   ├── example
│   └── root.js
├── test
│   ├── helper.js
│   ├── plugins
│   └── routes
└── yarn.lock

MVCでいうControllerにあたるのはroutesディレクトリ。特にroutes/root.jsが一番重要

起動

yarn dev

で、http://127.0.0.1:3000 にアクセスすると

{"root":true}

JSONが表示されるはず。これはさっきの routes/root.js で制御されている。

routes/example/index.js にもあるように、ルーティングを足していきたければ、都度ディレクトリを切って fastify.get等を追加していくだけ。簡単。

デプロイ

今回は GCPCloud Runにデプロイしてみる。

公式ドキュメントにサーバーレスのデプロイ方法が詳しく載っているので参考になる。

github.com

まずはGCPのコンテナレジストリにログイン

gcloud auth configure-docker

ルートディレクトリにDockerfileを作成し、以下

FROM node:10

WORKDIR /app

COPY package.json ./
COPY yarn.lock ./

RUN npm install --only=production

COPY . .

CMD [ "npm", "start" ]

ビルド

docker build -t asia.gcr.io/[PROJECT_ID]/[APP_NAME]:latest .

GCP側でビルドする場合は以下(料金がかかるので注意

gcloud builds submit --tag asia.gcr.io/[PROJECT_ID]/[APP_NAME]

うまくビルドができたら、ローカルで確認してみる

docker run --rm -p 3000:3000 asia.gcr.io/[PROJECT_ID]/fastify-example:latest

これで curl http://localhost:3000/してJSONが返ってくればおk

いざデプロイ

gcloud beta run deploy [APP_NAME] \
  --image asia.gcr.io/[PROJECT_ID]/[APP_NAME] \
  --platform managed \
  --region=asia-northeast1