サーバーレスパッケージが大きすぎるエラーのトラブルシューティング
このガイドは、“Code uncompressed size is greater than max allowed size of 272629760 “というエラーのトラブルシューティングを支援します。このエラーは、Datadog サーバーレスプラグインを使用して Node.js サーバーレスアプリケーションをインスツルメントするときに最も一般的に表示されます。また、他の言語やデプロイメント方法でこのエラーが発生した場合にも、このトラブルシューティングの方法が適用される場合があります。
このエラーは、関数の_圧縮されていない_コードサイズが 250MB の制限を超えていることを示しています。関数パッケージ (関数のコードと依存関係を含む .zip
アーティファクト) と関数に設定された Lambda レイヤーの両方が、この制限にカウントされます。両方を調べて、根本的な原因を探ってください。
レイヤー
通常、Datadog はインスツルメンテーションのために 2 つの Lambda レイヤーを追加します。
- 関数コードをインスツルメントする言語固有のライブラリと
- 観測データを集計し、バッファリングし、Datadog のバックエンドに転送する拡張機能。
AWS CLI コマンド aws lambda get-layer-version
を使用して Datadog Lambda レイヤーの内容とサイズを確認します。例えば、以下のコマンドを実行すると、_Datadog-Node20-x バージョン 115 と _Datadog-Extension バージョン 65 の Lambda レイヤーをダウンロードするリンクが得られ、圧縮されていないサイズ (合わせて約 30MB) を確認することができます。解凍サイズはレイヤーやバージョンによって異なります。以下の例のレイヤー名とバージョン番号は、アプリケーションで使用されているものに置き換えてください。
aws lambda get-layer-version \
--layer-name arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Node20-x \
--version-number 115
aws lambda get-layer-version \
--layer-name arn:aws:lambda:us-east-1:464622532012:layer:Datadog-Extension \
--version-number 65
Datadog の Lambda レイヤー以外にも、関数に追加された (または追加される) Lambda レイヤーも検査します。Serverless Framework を利用している場合、CloudFormation のテンプレートは deploy
または package
コマンドを実行した後の隠しフォルダ .serverless
から、Lambda レイヤー一覧は Layers
セクションから確認することが可能です。
パッケージ
関数デプロイメントパッケージには、不要な大きなファイルやコードが含まれていることがあります。Serverless Framework を使用している場合、deploy
または package
コマンドを実行した後に、隠しフォルダである .serverless
に生成されたデプロイメントパッケージ (.zip
ファイル) を見つけることができます。
デプロイメントパッケージとレイヤーのサイズの合計が制限を超えていない場合は、AWS サポートに連絡して調査を依頼してください。合計サイズが制限を超える場合は、デプロイメントパッケージを検査し、実行時に不要な大きなファイルをパッケージオプションを使用して除外してください。
依存関係
Datadog Lambda レイヤーはインスツルメンテーションライブラリをパッケージ化し、Lambda 実行環境で使用できるようにするので、 datadog-lambda-js
と dd-trace
を package.json
で依存関係に指定する必要は ありません。もし、ローカルのビルドやテストに Datadog のライブラリが必要な場合は、devDependencies
として指定し、デプロイメントパッケージから除外するようにします。同様に、serverless-plugin-datadog
は開発時にのみ必要であり、 devDependencies
の下に指定するべきです。
また、デプロイメントパッケージに含まれる他の依存関係 (node_modules
フォルダ) を検査し、必要なものだけを dependencies
に保存してください。
バンドラー
Webpack や esbuild のようなバンドラーを使用すると、使われているコードのみを含めることができ、デプロイメントパッケージのサイズを劇的に削減することができます。必要な Webpack の構成は Node.js の Lambda Tracing とバンドラーの互換性を参照してください。
Datadog-ci
ユースケースによっては、パッケージサイズの問題を回避するために datadog-ci lambda instrument
コマンドを使用する方が簡単だと感じるかもしれません。datadog-ci lambda instrument
コマンドは、serverless-plugin-datadog と同じインスツルメンテーションを構成します。詳しくは、datadog-ci リポジトリを参照してください。
サポート
Datadog のサポートチームによる調査が必要な場合は、チケットに以下の情報を含めてください。
- この関数の構成された Lambda レイヤー (名前とバージョン、または ARN)。
- AWS にアップロードする関数のデプロイメントパッケージ (または解凍したパッケージの内容とサイズがわかるスクリーンショット)。
- プロジェクトのコンフィギュレーションファイル (編集されたシークレットを含む):
serverless.yaml
、package.json
、package-lock.json
、yarn.lock
、 tsconfig.json
および webpack.config.json
。
その他の参考資料