(訂正)
書いたはいいが、 よくよく確認したら repository の last commit が2年前と全くメンテナンスされてない状態だったので、
こちらのほうがむしろ推奨されない方法となっていました。
なにかの参考になるかもしれないので、記事は残しておきます。
不便な記事2連発で申し訳ありません。
広告
tl; dr
sls create -t aws-nodejs-typescript -p プロジェクト名
あらまし
ちょっとしたスクレイピングをするバッチのために Serverless Framework + AWS Lambda + Node.js + TypeScript の構成で実装しようとしたが、
よく検索して出てくる方法が特定の方法に特化しすぎていて、使いづらいケースが多そうだったのでオフィシャルで説明されている方法をおすすめする。
検索するとよく出てくる方法
こちらやこちらなどでは、以下のコマンドでテンプレートから生成する方法が紹介されている。
sls create -t aws-nodejs-typescript -p プロジェクト名
この方法で生成されるプロジェクトには以下の問題がある。
- API Gateway 前提のコードになっていて、それ以外の用途で使いづらい
- 依存が多い
- serverless.yml ではなく serverless.ts になる
問題その1: API Gateway 前提のコードになっていて、それ以外の用途で使いづらい
生成されるコードはここの内容になる 1。
github.com
見てほしいのは、 serverless.ts
と src/
以下で、どちらもガッツリAPI Gatewayを使用する設定になっている。
provider: {
name: 'aws',
runtime: 'nodejs14.x',
apiGateway: {
minimumCompressionSize: 1024,
shouldStartNameWithService: true,
},
environment: {
AWS_NODEJS_CONNECTION_REUSE_ENABLED: '1',
},
lambdaHashingVersion: '20201221',
},
const hello: ValidatedEventAPIGatewayProxyEvent<typeof schema> = async (event) => {
return formatJSONResponse({
message: `Hello ${event.body.name}, welcome to the exciting Serverless world!`,
event,
});
}
serverless.ts
と hello
ハンドラーがガッチリAPI Gateway使用を前提としているので、
それ以外で定時バッチ組みたいとかのケースだとこれらのコードを削除して整える必要があり、テンプレートを使う旨味が全然ない。
むしろ意図せずAPI Gatewayに公開する危険すらあるので、それ以外の用途で使う場合以外は使うべきではない。
問題その2: 依存が多い
Lambda は依存が増えるとパフォーマンスに影響が出るので依存を減らしたいところだが、
package.json
の dependencies
を見ると、@middy
と source-map-support
が入っており、不要の場合いちいち削る必要がある。
また、その下の devDependencies
は実行速度に影響こそないものの、なるべく少ないほうがパッケージのメンテナンス上都合がいい。
問題その3: serverless.yml
ではなく serverless.ts
になる
これは良し悪しだが、 serverless.ts
はあんまり使いたくない。
スキーマチェックが入るので安心できる部分はあるが、ブログなどで紹介されている記述例は9割が serverless.yml
なので、いちいち変換して書く必要があるのは美味しくない。
推奨する方法: serverless-plugin-typescript
を使う
serverless-plugin-typescript
を使おう。
github.com
serverless ではなく prisma-labs 以下のリポジトリなので 3rd party になってしまうが、 本家からも紹介されているので、
問題なく使えると思います。
使い方は、通常のプラグインのように npm install serverless-plugin-typescript
したあとに、 serverless.yml
に以下を追記するだけ。
plugins:
- serverless-plugin-typescript
あとは、handler.js
ではなく handler.ts
に実装するだけで良い。
バンドラの設定などはよしなにやってくれる。
細かいところは ここ を参考にすると良い
まとめ
aws-nodejs-typescript よりも、 serverless-plugin-typescript を使いましょう。