momota.txt

hello, hello, hello, how low?

Serverless Framework による AWS Lambda ローカル開発

serverless framework logo

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 アクセスキーを設定する

  1. AWSアカウントを作り、マネージドコンソールからIAMページにアクセスする
  2. ペインのユーザをクリックし、「ユーザを追加」をクリックする
    • 適切なユーザ名を入力する
    • アクセスの種類の、「プログラムによるアクセス」にチェックをいれ、次へ
    • アクセス許可の設定は、「既存のポリシーを直接アタッチ」で、「AdministratorAccess」を選択し、次へ
    • レビューして、問題なければ作成する
  3. アクセスキーIDとシークレットアクセスキーをコピーする
  4. 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 が返ってくる。

参考

Comments