Make Local Happiness

自分の幸せは自分で作る!!!

Serverless-v1でLambda+API Gatewayをデプロイする

Serverless Frameworkとは?

https://camo.githubusercontent.com/070a9e7238f39ff039caa1158f127e187ee182a5/68747470733a2f2f73332e616d617a6f6e6177732e636f6d2f7365727665726c6573732d696d616765732f6672616d65776f726b76315f726561646d655f76322e676966

マイクロサービスを構成するアプリケーションをビルドし、アプリはイベントに応答して実行します。 課金されるのはアプリが動いた時だけなので、従来のEC2などの期間での従量課金よりも場合によっては安く済みます。 また、AWSのLambdaはアクセス数などの負荷によってオートスケールするみたいなので、 アプリエンジニアにとっては、メンテナンスにかかるコストがなくなるのは嬉しいことだと思います。

The Serverless Framework – Build applications comprised of microservices that run in response to events, auto-scale for you, and only charge you when they run. This lowers the total cost of maintaining your apps, enabling you to build more logic, faster.

AWSだけが対応していると思っていたのですが、 GoogleMicrosoftIBMなど対応しているサービスが増えているみたいですね。

バージョンが 1と0.5 があるけど何が変わったのか?

使ってみてですが、 使用するファイルがかなり減りました。 設定ファイルはjsonからyamlになり、カッコを沢山書かなくて良くなったのは嬉しいです。

インストールする

npm install -g serverless

AWSのアカウントの設定

※初めて触るという方、aws-cliを使ったことがないという方はこちらの設定が必要です。 ここでは省略します。

github.com

Lambda関数を作ってみる

プロジェクトを作成

さっそくですが、Lambda関数を作っていきます。
私はJavascriptが好きなので、 Nodejsのテンプレートで作成していきます。
現時点でテンプレートは以下の4つが用意されているようです。

"aws-nodejs", "aws-python", "aws-java-maven" and "aws-java-gradle"

$ serverless create --template aws-nodejs --path hello-world
Serverless: Creating new Serverless service...
Serverless: Creating the service in "/Users/repos/hello-world"
 _______                             __
|   _   .-----.----.--.--.-----.----|  .-----.-----.-----.
|   |___|  -__|   _|  |  |  -__|   _|  |  -__|__ --|__ --|
|____   |_____|__|  \___/|_____|__| |__|_____|_____|_____|
|   |   |             The Serverless Application Framework
|       |                           serverless.com, v1.0.0-rc.2
 -------'

Serverless: Successfully created service with template: "aws-nodejs"

コマンドが終了すると以下のファイルが出来ています。

$ tree hello-world/
hello-world/
├── event.json
├── handler.js
└── serverless.yml

Lambdaをデプロイする

デフォルトだとリージョンがUSになっているので、serverless.ymlを変更しておきます。

$ vim serverless.yml

service: hello-world

provider:
  name: aws
  runtime: nodejs4.3
  stage: dev
  region: ap-northeast-1

functions:
  hello:
    handler: handler.hello

リージョンを変えたらデプロイします。 1分くらいでできるかと思います。

$ serverless deploy
Serverless: Creating Stack...
Serverless: Checking Stack create progress...
.....
Serverless: Stack create finished...
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.............
Serverless: Stack update finished...

Service Information
service: hello-world
stage: dev
region: ap-northeast-1
api keys:
  None
endpoints:
  None
functions:
  hello-world-dev-hello: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:hello-world-dev-hello

API Gatewayでエンドポイントを作ってみる

次にAPI Gatewayと接続していくのですが、 functions の hello配下に evetnsを書くだけです。 corsはtrueに設定するとクロスオリジン対応になります。これはとっても便利です。

$ vim serverless.yml

functions:
  hello:
    handler: handler.hello
    events:
      - http:
          path: world
          method: get
          cors: true

API Gatewayをデプロイ

デプロイすると結果がさっきと異なり、 endpointsが追加されています。

$ serverless deploy
Serverless: Packaging service...
Serverless: Uploading CloudFormation file to S3...
Serverless: Uploading service .zip file to S3...
Serverless: Updating Stack...
Serverless: Checking Stack update progress...
.......................
Serverless: Stack update finished...

Service Information
service: hello-world
stage: dev
region: ap-northeast-1
api keys:
  None
endpoints:
  GET - https://xxxxxxxxx.execute-api.ap-northeast-1.amazonaws.com/dev/world
functions:
  hello-world-dev-hello: arn:aws:lambda:ap-northeast-1:xxxxxxxxxxxx:function:hello-world-dev-hello

Curlで実行

以下のコマンドは jqコマンドで見やすく加工しています。

$ curl -s https://xxxxxxxxxe.execute-api.ap-northeast-1.amazonaws.com/dev/world | jq ".message "
"Go Serverless v1.0! Your function executed successfully!"

serverlessコマンドで実行

$ serverless invoke -f hello
{
    "message": "Go Serverless v1.0! Your function executed successfully!",
    "event": {}
}

AWS上のアプリ・ファイルを削除

serverless remove

まとめ

以前、LambdaとAPI Gatewayを使って認証サービス作った際には、aws-cliを使ってシェルでロジックを書きまくっていたのですが、 ここまで簡単に書けるのはいいと思います。 ただ、細かい設定などはまだドキュメントが少ないこともあり、難しいのかなと思いました。

今回は殆どデフォルトの設定のまま使いましたが、次は何かアプリとして作ってみようと思います。