AWSServerless FW

Serverless Frameworkのリソース定義をTypeScriptで書く(serverless.ts)

「serverless.tsなるものが登場したらしい」という話を聞いたので、調べてみました。 いつから? 2020年7月の出来事の様子です。 該当PR: https://github.com/serverless/ser […]

広告ここから
広告ここまで

serverless.tsなるものが登場したらしい」という話を聞いたので、調べてみました。

いつから?

2020年7月の出来事の様子です。

serverless.ts対応版の取得

npmにあるものはまだ対応していない様子でした。なのでGitHubからmasterのソースを取得してビルドします。

$ git clone git@github.com: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点があるかなと思います。

型定義を利用することで、eventseventと書いていてsls deployでエラーみるみたいこともIDE上で実装中に気づけますし、新しい機能なども型を見れば大体わかります。

また、process.envを使って値を動的に変えることも可能そうです。非同期処理もできるかもしれませんが、だいたいこういうので非同期を入れ出すと碌な目に合わないのでやる時は腹を括りましょう。

ブックマークや限定記事(予定)など

WP Kyotoサポーター募集中

WordPressやフロントエンドアプリのホスティング、Algolia・AWSなどのサービス利用料を支援する「WP Kyotoサポーター」を募集しています。
月額または年額の有料プランを契約すると、ブックマーク機能などのサポーター限定機能がご利用いただけます。

14日間のトライアルも用意しておりますので、「このサイトよく見るな」という方はぜひご検討ください。

広告ここから
広告ここまで

Related Category posts