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

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

Serverless FrameworkでExpressを動かす(serverless-httpを使用)

More than 3 years have passed since last update.

Serverless Frameworkの公式ブログで Deploy a REST API using Serverless, Express and Node.jsという記事を見つけたので、この記事で紹介されているserverless-httpとういミドルウェアを使って、Serverless上でExpressを動かしてみました。

環境

 $ sw_vers
ProductName:    Mac OS X
ProductVersion: 10.12.6
BuildVersion:   16G29
$ node -v && npm -v
v8.8.1
5.4.2

手順

AWS CLIの事前設定とserverlessのインストール

AWS CLIをインストールし、認証情報を登録しておきます。
AWS - Credentials を参考に、使用するAWSアカウントの情報をDefaultプロファイルに設定します。

serverlessをグローバルにインストールしておきます。

$ npm install serverless -g

ココらへんは、以前書いた記事 (serverlessでLambdaのローカル開発環境を整える)でも紹介していますので、こちらを参照してください。

プロジェクトを作成

$ mkdir serverless-express-sample
$ cd serverless-express-sample
$ npm init -f

必要なパッケージのインストール

今回は、次のnpmパッケージを使用します。

  • express
  • serverless-http

serverless-httpはLambdaでexpressのようなhttpをルーティングするソフトウェアを使用できるようにするミドルウェアです。

$ npm i -S express serverless-http

サンプルAPIの作成

//hogeにアクセスすると、それぞれ違った文字列をjsonで返す簡単なAPIを作成してみます。

まずは、serverlessコマンド(エイリアス: sls)でnodejsベースのプロジェクトを作成します。

$ sls create --template aws-nodejs --name serverless-express-sample 

次に、追加されたhandler.jsを次のように変更します。
Expressを使ったことがあれば、見慣れた内容だと思います。

handler.js
'use strict';

const serverless = require('serverless-http');
const express = require('express');
const app = express();

app.get('/', function (req, res) {
  res.json({ message: 'Hello World!' });
});

app.get('/hoge', function (req, res) {
  res.json({ message: 'Hello Hoge!' });
});

module.exports.main = serverless(app);

serverless.ymlは次のように変更します。

eventsには、全てのpath、全てのhttpリクエストをAPI Gatewayの機能のLambda Proxy IntegrationでExpress側に渡すための設定を記述しています。

serverless.yml
service: serverless-express-sample

provider:
  name: aws
  runtime: nodejs6.10
  stage: dev
  region: ap-northeast-1

functions:
  app:
    handler: handler.main
    events:
      - http:
          method: ANY
          path: '/'
      - http:
          method: ANY
          path: '{proxy+}'

デプロイ

作成したサンプルAPIをデプロイします。

$ sls deploy

動作確認

デプロイ結果のendpoints:に表示されているエンドポイントにブラウザからアクセスしてみると...
次のように、Expressからjsonレスポンスが返ってくることが確認できるかと思います。

スクリーンショット 2017-10-29 17.26.06.png

スクリーンショット 2017-10-29 17.26.10.png

また、WappalyzerというChrome Extensionで確認してみると、Expressが動いていることが確認出ます。

スクリーンショット 2017-10-29 17.26.35.png

参考

https://serverless.com/blog/serverless-express-rest-api/

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