前回サーバーレスなアプリケーションのひな形を作りました。
今回は、ひな形で作られたAWS Lambdaのソースを Hello World にし、また新しくアプリケーションのバージョンを返す Version Web API を追加します。
シリーズの記事
- Serverless Framework と TypeScript で サーバレス開発事始め
- Serverless Framework と TypeScript で Hello & Version の Web API を実装(本記事)
環境
本記事の開発環境は以下となります。
- Windows 10 64bit
- Visual Studio Code
- Node.js 9
- TypeScript 2.7
- Serverless Framework 1.26.0
主な実行環境について、また全部稼働まではいきませんが以下を想定しています。
※ Amazon API Gateway などは、Serverless Framework が自動設定するので省略、明示的に使うものとしてリストになります。
- Amazon S3
- AWS Lambda
ベースとなるソースコード
前回の続きとなりますので、こちらhttps://github.com/riotz-works/samples-hello-serverless/tree/0.0.1をもとに追加開発します。
本記事と一緒に作成する場合は前回のソースもしくはタグを指定してチェックアウトしたソースをお使いください。
1 | c:\Temp\nlog>git clone --depth 1 -b 0.0.1 https://github.com/riotz-works/samples-hello-serverless.git |
Hello Web API の改修
Serverless Frameworkのボイラープレートで生成した Lambda のプログラムはhandler.js
で以下のようになっています。
これを Hello World の Web API へ改修するにあたり、このままでresponse
のbody
を変えるだけでよさそうです。今回はmessage
を'Hello Serverless !!'
にし、input
は削除することにします。
1 | import { APIGatewayEvent, Callback, Context, Handler } from 'aws-lambda'; |
そしてプロジェクトのディレクトリ直下で汎用的な名前のhandler.js
だと、このあと追加する Version Web API の配置などで困ります。
まずはディレクトリ配置を見直し、Lambda のハンドラー・ファンクションのソースが入っていることがわかるようにsrc/handler
配下に置おきます。
続いて Hello Web API のハンドラーに対応したファンクションのファイル名としてgreetings.ts
とすることにします。
ファイル名と配置を変えたので Lambda の定義をしているserverless.yml
を修正します。hello
ファンクションのハンドラーはhandler.hello
と定義されていましたが、greetings
ファクションsrc/handler/greetings.hello
ハンドラーに変更します。
Hello Web API ができました。
この時点でserverless deploy
コマンドを使いデプロイできます。(–aws-profile [profilename] を忘れずに)
Version Web API の作成
Hello Web API が作れましたがボイラープレートのままだったので、新しく Web API を追加します。
とりあえず、アプリケーションのバージョンを返す Version Web API を作ることにします。
仕様は「HTTP GET /version
でpackage.json
のversion
を返す」にします。
まずは、Lambda のハンドラーのソースを配置するsrc/handler
にsystems.ts
を作ります。
他にシステム関連の Web API の想定はありませんが、システム関連 Web API のハンドラーを配置するsystems.ts
にversion
のハンドラーを追加するイメージにしました。
コードは以下のようにします。(このコードを使う場合は、1行目の Copyright は書き換えてください)
1 | /* Copyright 2018 Riotz.works. */ |
主なキー・ポイントは以下になります。 先の Hello Web API と若干異なる部分 (context.succeed()
とか) がありますが詳細は後日の記事として、基本的には変わりありません。
- 3行目で、バージョンのもとになる
package.json
をsystems.ts
の相対パスで指定しversion
要素をインポートします - 17行目で、インポートした
version
属性の値をレスポンス・ボディとしてセットします
Visual Studio Code の環境によってはエラーが出ないかもしれませんが、3行目のインポート文でエラーにあります。
何も表示されていなくてもserverless package
を実行するとエラーが出力されます。
1 | C:\Temp\samples-hello-serverless> serverless package |
これはpackage.json
のモジュール定義が存在しないためになります。
このように型定義などを確認してくれるのが TypeScript のありがたいところです。
一方で今回のは若干無茶な実装でした。標準モジュールには存在しませんし、適切なモジュール定義をとってくることも難しいでしょう。さりとてpackage.json
と何か別ファイルでversion
のダブルメンテはしたくないです。。。 ということで、モジュール定義を追加することにします。
ソースディレクトリのsrc
にtypes.d.ts
を追加します。.d.ts
ファイルでしたらとくに命名規則はなくtyping.d.ts
もよく見かけます。
コードは以下のようにします。(1行目の Copyright は書き換えてください)
1 | /* Copyright 2018 Riotz.works. */ |
*.json
なので、モジュール定義が見つからなかった JSON ファイルの型定義になります。
その中にversion
が文字列として存在することを定義しますが、これはすべてての JSON ファイルに当てはまることではないので、型定義はstring | undefined
としドキュメントで注釈しました。
頑張るとpackage.json
固有のモジュール定義もできたのですがversion
を取得するだけにしては複雑になりすぎたので、このあたりを落としどころとしました。
最後にserverless.yml
へ Version Web API の Lambda 定義を追加します。functions: greetings:
の下に追加します。
1 | systems: |
Version Web API ができました。
デプロイ
AWS 環境へデプロイします。前回のデプロイ と 稼働テスト同様に、AWS のプロファイを参照してserverless deploy --aws-profile [profilename]
を実行します。
endpoints
にhello
とversion
の URL が出力されるので、それぞれブラウザでアクセスすると、プログラムした JSON が返ってきます。
ソースコード
今回作成した部分までのソースを GitHub へアップしました。
https://github.com/riotz-works/samples-hello-serverless/tree/0.0.2
Hello Web API はボイラープレートのレスポンスを改修しただけだったのでとくに大きな変化はありませんでした。一方で Version Web API は新しく追加となりましたし、両方のプログラムを配置するためにプロジェクトの構造も変化させました。
Hello と Version で実装レベルが異なっている部分はありますが、これについては次の記事で確認しながら合わせこみをしていきます。できれば TypeScript のコンパイラ設定や Lint にまでふれたいです。