Serverless Framework を使うことにより、FaaS (AWS Lambda, GCP Cloud Functions, Azure functions, など) の開発をローカルで実施できる。
ローカル環境で自分の好きなエディタ・IDEで開発やテストが可能になるし、デプロイも容易になる。
AWS には AWS SAM もあるが、他のクラウドプロバイダでも開発物やノウハウが使い回せることが期待できるので、3rd パーティ製の Serverless Framework を選ぶ。
本稿では、Serverless Framework の導入と、Hello Worldアプリ (AWS Lambda) のデプロイについて書く。
環境
1
2
3
4
5
$ cat /etc/lsb-release
DISTRIB_ID = Ubuntu
DISTRIB_RELEASE = 18.04
DISTRIB_CODENAME = bionic
DISTRIB_DESCRIPTION = "Ubuntu 18.04.3 LTS"
Serverless framework のインストール
まず Node.js (v6.5.0以降) と npm をインストールする。
1
2
3
4
5
6
7
8
9
$ sudo apt-get update
$ sudo apt-get install nodejs
$ nodejs --version
v8,10,0
$ sudo apt-get install npm
$ npm --version
3.5.2
npm で serverless framework をインストールする。
1
2
3
$ sudo npm install -g serverless
$ serverless --version
1.32.0
AWS アクセスキーを設定する
AWSアカウントを作り、マネージドコンソールからIAMページにアクセスする
ペインのユーザをクリックし、「ユーザを追加」をクリックする
適切なユーザ名を入力する
アクセスの種類の、「プログラムによるアクセス」にチェックをいれ、次へ
アクセス許可の設定は、「既存のポリシーを直接アタッチ」で、「AdministratorAccess」を選択し、次へ
レビューして、問題なければ作成する
アクセスキーIDとシークレットアクセスキーをコピーする
Serverless framework に設定する
1
2
3
4
5
6
7
# パターン1: 環境変数に設定
$ export AWS_ACCESS_KEY_ID = <your-key-here>
$ export AWS_SECRET_ACCESS_KEY = <your-secret-key-here>
# パターン2: serverless config credentials コマンドで設定
$ serverless config credentials --provider aws --key <your-key-here> --secret <your-secret-key-here>
# => ~/.aws/credentials が生成される
Serverless framework で Hello World
まず、作業ディレクトリの作成と、package.json
を作成する。
1
2
$ mkdir my-express-application && cd my-express-application
$ npm init -f
いくつかのライブラリをインストールする。
1
$ npm install --save express serverless-http
アプリケーションを index.js
に書く。
1
2
3
4
5
6
7
8
9
10
11
12
const serverless = require ( 'serverless-http' );
const express = require ( 'express' );
const app = express ();
app . get ( '/' , function ( req , res ) {
res . send ( JSON . stringify ({
id : '00001' ,
message : 'Hello World!' ,
}));
});
module . exports . handler = serverless ( app );
これはルートパス /
にアクセスがあった場合に、 { id: '00001', message: 'Hello World!' }
を返す単純なアプリ。
これをデプロイするため、以下の serverless.yml
を作成する。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
service : my-express-application
provider :
name : aws
runtime : nodejs8.10
stage : dev
region : ap-northeast-1
functions :
app :
handler : index.handler
events :
- http : ANY /
- http : 'ANY {proxy+}'
関数をデプロイする。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
$ serverless deploy
...snip...
Service Information
service: my-express-application
stage: dev
region: ap-northeast-1
stack: my-express-application-dev
api keys:
None
endpoints:
ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
ANY - https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/{ proxy+}
functions:
app: my-express-application-dev-app
数分後にデプロイが完了し、endpoints
の情報が出力される。
この URL へアクセスし、動作確認する。
1
2
$ curl -X GET https://xxxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev
{ "id" :"00001" ,"message" :"Hello World!" }
アプリケーションで定義した JSON が返ってくる。
参考