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 [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点があるかなと思います。

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

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

    広告ここから
    広告ここまで
    Home
    Search
    Bookmark