Serverless Frameworkのリソース定義をTypeScriptで書く(serverless.ts)
「serverless.tsなるものが登場したらしい」という話を聞いたので、調べてみました。 いつから? 2020年7月の出来事の様子です。 該当PR: https://github.com/serverless/ser […]
広告ここから
広告ここまで
目次
「serverless.ts
なるものが登場したらしい」という話を聞いたので、調べてみました。
いつから?
2020年7月の出来事の様子です。
- 該当PR: https://github.com/serverless/serverless/pull/7755
- Template PR: https://github.com/serverless/serverless/pull/7934
serverless.ts
対応版の取得
npmにあるものはまだ対応していない様子でした。なのでGitHubからmasterのソースを取得してビルドします。
$ git clone [email protected]:serverless/serverless.git
$ npm install
$ ./bin/serverless.js --version
Framework Core: 1.77.1
Plugin: 3.6.18
SDK: 2.3.1
Components: 2.33.2
絶対パスで動かすのも面倒なので、変数にしておきましょう。
$ DEV_SLS="$(pwd)/bin/serverless.js"
% $DEV_SLS --version
Framework Core: 1.77.1
Plugin: 3.6.18
SDK: 2.3.1
Components: 2.33.2
不安な方は、git grep
で対応版かチェックしておくと良いと思います。
% git grep "serverless.ts" lib
lib/classes/Utils.js: } else if (fileExistsSync(path.join(process.cwd(), 'serverless.ts'))) {
lib/classes/Utils.test.js: const tmpFilePath = path.join(tmpDirPath, 'serverless.ts');
lib/plugins/create/create.test.js: expect(dirContent).to.include('serverless.ts');
lib/plugins/plugin/install/install.test.js: const serverlessTsFilePath = path.join(servicePath, 'serverless.ts');
lib/plugins/plugin/uninstall/uninstall.test.js: const serverlessTsFilePath = path.join(servicePath, 'serverless.ts');
lib/utils/getServerlessConfigFile.js: const tsPath = path.join(servicePath, 'serverless.ts')
プロジェクトの作成
せっかくなので手組みしてみます。
$ mkdir test-pj
$ npm init -y
$ npm i -D @types/node @types/serverless ts-node typescript
$ touch serverless.ts
$ touch index.js
index.js
ここの内容はあまり重要でないので、適当に作ります。
module.exports.hello = async (event, _context) => {
return {
statusCode: 200,
body: JSON.stringify({
message: 'Go Serverless Webpack (Typescript) v1.0! Your function executed successfully!',
input: event,
}, null, 2),
};
}
serverless.ts
本題はこちら。YAMLをそのままTypeScriptで書いています。
import { Serverless } from 'serverless/aws';
export const services: Serverless = {
frameworkVersion: '>=1.72.0',
service: {
name: 'serverless-ts-demo',
},
provider: {
name: 'aws',
runtime: 'nodejs12.x',
timeout: 30,
memorySize: 1024,
},
functions: {
get: {
handler: 'index.hello',
events: [
{
http: {
path: 'hello',
method: 'get'
},
},
],
},
},
};
module.exports = services
デプロイする
デプロイはnpmにリリースされるまで自前ビルド版を使います。
$ $DEV_SLS deploy
or
$ /PATH/TO/serverless/bin/serverless.js deplou
TypeScriptにするメリット
AWS CDKもそうですが、「型定義を元にかけること」と「プログラマブルに定義をかけること」の2点があるかなと思います。
型定義を利用することで、events
をevent
と書いていてsls deploy
でエラーみるみたいこともIDE上で実装中に気づけますし、新しい機能なども型を見れば大体わかります。
また、process.env
を使って値を動的に変えることも可能そうです。非同期処理もできるかもしれませんが、だいたいこういうので非同期を入れ出すと碌な目に合わないのでやる時は腹を括りましょう。