Lambda@Edge プロジェクト用のテンプレートを作りました。
https://github.com/akr4/lambda-edge-template
構成はこういったところです。
- TypeScript
- webpack
- Jest
Lambda@Edge は環境変数が使えないので少し工夫しています。
全環境に共通のテンプレート関数を用意します。テンプレート関数はこんな感じの高階関数で、環境変数がわりの設定を渡せるようになっています。
export const makeHandler = (config: { bucket_name: string }) => {
return async (event: CloudFrontResponseEvent): Promise<CloudFrontResponseResult> => {
// get from the bucket
};
};
環境ごとにハンドラー関数を用意します。中身はテンプレートからハンドラー関数を生成しているだけです。
import { makeHandler } from '../../../../template/behavior1/origin-response';
export const handler = makeHandler({
bucket_name: 'my-bucket',
});
詳しくは GitHub の README.md をご覧ください。
Lambda@Edge についての所感
Lambda@Edge は TypeScript のように高機能なプログラムで書けるのがいいですね。Lambda@Edge に対応するのは Apache の httpd.conf や Nginx の nginx.conf だと思います。これらの設定は独自の記法で書くため修得が難しく、またプログラム言語ではないため表現力が弱いです。
同じことが Lambda@Edge なら簡単に表現できます。特に TypeScript には型があるので多くの問題をビルド時に検出できますし、IDE のサポートも受けられます。このリポジトリの例のように単体テストも簡単に書けるのも良い点ですね。