概要
私はAWS歴1年目のおじさんエンジニアです。当記事は、私が初めてLambda@Edgeを書くにあたってハマったポイントの備忘録です。
ご存じの方には今更な内容かと存じます。基本的には公式ドキュメントに記載してあることばかりです。
なお、私の都合上、ランタイムはNode.js前提です。
落とし穴たち
リージョンはus-east-1(バージニア北部)のみ
これは皆さま最初に驚くポイントかと思いますが、Lambda@Edgeを設置できるリージョンはus-east-1のみです。
環境変数が使えない
Lambda@Edgeでは環境変数が使えません。私は今回扱いませんでしたが、どうしてもLambda@Edgeで機微情報を扱いたい場合には、SecretsManager等を参照する手段が一般的な様です。
メモリなどの制約が厳しい
Lambda@Edgeは、起動するタイミングによってオリジンとビューワーに大別されますが、下表のとおり、それぞれ通常のLambdaよりも厳しい制約が設けられています。特にビューワーのリクエスト/レスポンスはごく小さなプログラムしか実行できません。
オリジンリクエスト/レスポンス | ビューワーリクエスト/レスポンス | |
---|---|---|
メモリサイズ | 通常のLambdaと同様 | 128MB |
タイムアウト | 30秒 | 5秒 |
レスポンスのサイズ | 1MB | 40KB |
バンドルのサイズ | 50MB | 1MB |
提供AWS SDKはV2のみ
これはLambda一般の話ですが、Lmabda関数の実行環境ではAWS SDKが提供されています。従ってLambdaから他AWSサービスへのアクセスをしたい場合にも、SDKをバンドルに含める必要はありません。
SDKのバージョンについて、Node.jsで利用するAWS SDK for JavaScriptは2020年12月からバージョン3が公開されています。
しかしながら、2021年7月13日現在、Lambda環境上で提供されるSDKはV2のみです。
通常のLambdaでは、マイナーバージョン固定のためにSDKをバンドルする場合もあるかと思いますし、大きな問題にはなりません。しかしLambda@Edgeでは前述のバンドルサイズ制約のため、V3の利用はほぼ不可能です。アップデートを待ちましょう。最新の状況はこちら。
[余談] Serverless Framework にてAWS SDKをバンドルから除外する手段
私は現在Serverless Frameworkを利用しています。Serverless FrameworkでLambda@Edgeをデプロイするにあたって、AWS SDKをバンドル対象から除外する方法を調べるのに思いのほか時間がかかったため、ここに遺しておきます。
① devDependenciesにする
dependenciesでなくdevDependenciesに指定すればバンドルから外れます。が、依存は事実であるためかっこよくはないです。
② serverless.ymlのserverless-webpackの設定で除外する
serverless-webpackを利用している場合、特定のパッケージをバンドルから除外する設定があります。こちらのissueで見つけました。
custom:
webpack:
includeModules:
forceExclude:
- aws-sdk
以上。