Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
18
Help us understand the problem. What is going on with this article?

More than 3 years have passed since last update.

@okamu_

serverless frameworkを使って本格的なAPIサーバーを構築(Express編)

serverless frameworkを使って本格的なAPIサーバーを構築(Express編)

最近、推しメンの serverless framework の記事の第3弾です。
保守メンテが楽になりつつも、実戦で速攻で構築ができます。

目次

framework_repo.png

前回まで、serverless frameworkのハンズオンの記事まで書きました。
今回は、serverless frameworkで 「 lambda + APIGateway + DynamoDB 」 の構成ですが、Expressを導入しローカルで実行できるようにします。

この記事でできるようになること

  • Lambda上でExpressを動かす
  • ローカルでAPIを試す環境を構築する

Expressを使う旨味

  • サーバレスでサービス全体を作るのはしんどい
  • ローカルで開発+テストできるようになる
  • Expressは、RubyのSinatraのようなシンプルなMVCフレームワークなのでとっつきやすい
  • packege.jsonをfunctionごとに用意しなくて良くなる!!

前準備

  • expressをinstallしておく
  • Lambda上でExpressを動かすツールとして、「aws-serverless-express(公式)」と「express-on-serverless」というものがあります。本来公式のものを使うべきですが、今回はexpress-on-serverlessを使用しました。
$ yarn add express
$ yarn add express-on-serverless

まずは、単純にJSONを返してみる(Express)

  • serverless.ymlを編集します
    • /配下をAnyですべてExpressに渡します
serverless.yml
functions:
  app:
    handler: functions/api/api.handler
    events:
      - http:
          path: /{proxy+}
          method: any
          cors: ${self:custom.cors_enabled.${opt:stage, self:provider.stage}}
  • api.jsでは、/hello がきたらJSONを返すようにしておきます。
functions/api/api.js
'use strict';

const express = require('express');
const app = express();
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({
  extended: true
}));
app.use(bodyParser.json());

const response = {
  statusCode: 200,
  body: JSON.stringify({
    message: 'Go Serverless v1.0! Your function executed successfully!'
  }),
};

app.get("/hello", function(req, res, next){
  res.json(response);
});
exports.handler = require('express-on-serverless')(app);

ローカルで動かしてみる

  • 先ほどの、シンプルなアプリケーションをローカルで動かして見ましょう
  • functions/api/api.jsに以下を追記してください。
functions/api/api.js
// 追記する
if (process.env.NODE_ENV === 'dev') {
  app.listen(3000,  () => {
    console.log("Node.js is listening to PORT: 3000");
  });
}

そしてサーバーを起動します $ node functions/api/api.js

すると、http://localhost:3000/hello で先ほどのAPIにアクセスすることができます!!

  • これで、deployしても、前回と同じようなAPIを作ることができます!!
$ sls deploy -v -s dev

デプロイが成功し、APIにアクセスすると
前回Expressを使わずに作ったAPIと同じレスポンスになると思いますが、ローカルで開発できるようになったので、開発スピードは5000兆倍になります!!

まとめ

  • serverlessにExpressを乗せて使うと、開発スピードが5000兆倍になりました!!
  • 今まで通り、serverlessの旨味を生かしたイベントのフックでの発動+APIの構築ができるようになり利益ありありです。

次回

  • serverless frameworkを使って本格的なAPIサーバーを構築(テストコード編)です!!
18
Help us understand the problem. What is going on with this article?
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
18
Help us understand the problem. What is going on with this article?