devlog

主に web 開発とかプログラミングについて書きます

【画像多め】AWS-Lambda を使って サーバーレス で Express を動かすまでの手順

f:id:nkgr:20180630221916p:plain

TL;DL 🗒

以下の手順を画像多めで解説

これで Serverless Express を公開可能になる

成果物 🎉

Express

動機 🤔

  • Serverless で Express をデプロイして AWS-Lambda を Webアプリケーション実行環境としたい
  • aws-serverless-express の説明は参考リンクの内容で十分なんだけど、API Gateway の設定で結構はまったので手順を残す
  • aws-serverless-express の example に記載の方法で CLIと CloudFormation からデプロイする方法もあるのだけど、既存のexpress アプリケーションをデプロイする方法を確立したかった

環境 💻

  • Node.js v8.10.0
  • express v4.16.0
  • aws-serverless-express 3.2.0

参考リンク

個人開発者のためのaws-serverless-express #kyotojs - Speaker Deck

実行手順

express アプリケーションを作成

$ express aws-lambda-express
$ cd aws-lambda-express
$ yarn

ローカルサーバーを起動しアクセス

$ yarn start
yarn run v1.7.0
warning ../../../../../package.json: No license field
$ node ./bin/www
GET / 200 203.128 ms - 170
GET /stylesheets/style.css 200 3.461 ms - 111
GET /favicon.ico 404 11.657 ms - 1562
GET /favicon.ico 404 8.536 ms - 1562

http://localhost:3000

Express が起動していればOK

aws-serverless-express のインストールと Express への統合

インストール

$ yarn add aws-serverless-express

Lambda の実行ファイルとして index.js を作成

const awsServerlessExpress = require('aws-serverless-express');
const app = require('./app');
const server = awsServerlessExpress.createServer(app);

exports.handler = (event, context) => awsServerlessExpress.proxy(server, event, context);

app.js (Express) に以下の内容を追記

const serverlessExpress = require('aws-serverless-express/middleware');
var createError = require('http-errors');
var express = require('express');

[中略]

var app = express();

// view engine setup
app.set('views', path.join(__dirname, 'views'));
app.set('view engine', 'jade');

// middleware として追加
app.use(serverlessExpress.eventContext());

ローカルの設定は以上

AWS Lambda へのデプロイ

Express アプリケーションを Lambda にデプロイするために zip ファイルの作成

$ rm -rf aws.zip && zip -r aws.zip .

AWS Lambda のコンソールで Lambda 関数の作成

事前に IAM Role で Lambda を実行できるRoleを作成しておく

ロールを仕様するサービスは Lambda を選択

f:id:nkgr:20180630230406p:plain

f:id:nkgr:20180630230518p:plain

f:id:nkgr:20180630230540p:plain

新規でLambda を作成

f:id:nkgr:20180630230617p:plain

先ほど作成したzipファイルをアップロード

f:id:nkgr:20180630230647p:plain

ソースコードを更新可能になる

f:id:nkgr:20180630230756p:plain

基本設定のタイムアウトを3秒から1分以上にしておく(初回の実行でエラーになるため)

f:id:nkgr:20180630230844p:plain

テストを実行してエラーにならずに ステータスコード 200 で HTMLが返却されているならOK

Lambda のトリガーとなる API Gateway の作成

API を新規作成

f:id:nkgr:20180630231318p:plain

メソッドを追加

  • 「アクション」ボタンをクリック
  • 「メソッドの作成」を選択
  • 以下の画像の通りに選択し作成

f:id:nkgr:20180630232049p:plain

リソースを追加

  • 「アクション」ボタンをクリック
  • 「リソースの作成」を選択
  • 以下の画像の通りに選択し作成

f:id:nkgr:20180630232302p:plain

APIのデプロイ

  • 「アクション」ボタンをクリック
  • APIのデプロイ」を選択

f:id:nkgr:20180630232620p:plain

  • 新しいデプロイ用のステージを作成しAPIをデプロイ

f:id:nkgr:20180630232733p:plain

  • 呼び出し用のURLが作成される

f:id:nkgr:20180630233638p:plain

アクセスし、画面が表示されれば作成完了

Express

f:id:nkgr:20180630221916p:plain