どのように我々は80 %以上でAWSラムダで我々のnodejsアプリのサイズを削減😮


この記事は我々が我々のNODEJSアプリのサイズを減らすために取ったステップをハイライトします.
最後に、私たちは50 MB - 75 MB(圧縮)ノードのアプリを8 MB - 10 MBにドロップした方法を見つけるでしょう.素晴らしい、右?
でもまず、どうやってここに来たの?
どのように、この開発者のソフトウェア開発者は75 GBのAWSラムダストレージ限界を排出しましたか?
ああはい、私たち.🙈

誤り
AWSラムダにマイクロサービスを展開することは、SNS、SNS、APIゲートウェイなどの他のAWSサービスで動作しなければならず、Serverless Framework , デフォルトの実行は、これらのサービスのそれぞれから来るイベントのハンドラを定義することです.
フードの下で、Serverlessなフレームワークは、あなたが定義する各々のハンドラのために新しいラムダ関数をつくります.
SNS、SQS、S 3、およびAPIゲートウェイからイベントを処理したいとしましょう、4つのラムダ関数は同じコードベースを使用しているそれらのイベントのためにつくられます.これは、我々の50 MBのアプリは、展開時には、合計で巨大な200 MBのアプリになることを意味します.
ここでは興味深い部分は、これは私たちのステージング環境だけでした.
我々が走っていたマイクロサービスの数を考慮すると、我々はすでに50 %の使用量で、我々のマイクロサービスを新しい環境に押し込んで、すぐに我々の記憶用具を二倍にしました、そして、我々の展開は壊れました.ワハラ🙆🏽‍♂️

修正:我々はどのように我々のAWSラムダサイズを削減


1 . dev依存関係としてAWS - SDKを設定する
これはすべての母です.あなたがこの点の後に読書を辞めるならば、私さえ悩まされません.
The aws-sdk パッケージだけで60 MB以上(非圧縮)です.これは巨大です!
これは我々のアプリのサイズの問題、私たちの不幸とも私たちの奇跡についてほとんどすべてだった.良い知らせはaws-sdk あなたのラムダのランタイムで事前にインストールされているので、再度インストールする必要はありません.dev依存性として設定するだけです.
我々がこれを知っているならば.今ひどい痛みがある😭

不要なパッケージを削除する

あなたが既にこれをした良いチャンスがあります.しかし、大規模なプロジェクトでは、いくつかの未使用のパッケージが簡単に検出できなくなります.
パッケージを試してくださいdepcheck . それはあなたが未使用と行方不明の依存関係のためのあなたのアプリケーションをスキャンすることができます.
npm install -g depcheck
The -g フラッグは重要です.ここで物事を複雑にしましょう.

パッケージのチェック
と同じようにaws-sdk , などの生産依存として隠すことができる他のパッケージがありますserverless とそのプラグインserverless-offline .
これらのパッケージは、あなたのためにインストールされている余分なパッケージと組み合わせて、サイズで100 MB以上(非圧縮)ですaws-sdk . したがって、除去aws-sdk これらの人々を削除せずに任意の違いはありません.再インストールされます.
展開の進行中にこれらのタイプのパッケージが展開に使用され、インストールされる必要があるため、簡単にパッケージを生産パッケージとして使用することができます.
最良のアプローチは、あなたのアプリケーションのdev依存関係として設定し、あなたのCI/CD Dockerイメージでグローバルにインストールすることです.また、CGI/CDパイプラインが実行されるたびに再インストールする必要はありません.
このDockerイメージを作成しましたavonnadozie/serverless この目的のために、再利用を自由にする.
serverless-offline プラグインやその他の必要なパッケージは、ラムダに展開する必要があります.

利用--production フラッグ
これは同様に一般的なステップでなければなりません、しかし、それはそれを繰り返すために傷つきません.
常に使用してください--production NPMをプロダクション上で実行したり、ci/cdスクリプトを実行したりして、dev依存関係をインストールしない場合.
npm install --production

利用可能なラムダランタイムパッケージの再利用
まさにaws-sdk , 他のパッケージもありますuuid and dotenv これは、ラムダランタイムで再利用できます.
これを参照できますlist of node packages in lambda runtime .

展開の検査
粗野な方法もうまくいきます.ライブコードをダウンロードして手動で検査します.
ダウンロードするには、ラムダコンソールに行き、関数をクリックし、“アクション”ドロップダウンから“エクスポート機能”を選択します.

その後、「展開パッケージのダウンロード」をクリックします.

ダウンロードが完了するとnode_modules フォルダは、サイズでフォルダをランク付けし、見てください.それは多くを明らかにする.
このようにしてaws-sdk が設定された後でもインストールされています.

大きな非JSファイルを
画像などの大きなファイルをホスティングしたり、JSONをプライベートCDN(最も可能性の高いS 3)を考慮し、そこから読んでください.
これは速度でトレードオフを引き起こすが、それはあなたのアプリケーションの設計に応じてあなたのために価値がある可能性があります.

mergeサーバレスハンドラ
これは完全にあなたとあなたのアプリケーションのアーキテクチャですが、必要に応じて、不要な関数を作成するServerlessを防ぐために必要なラムダ関数を再利用を検討することができます.
私たちのために、我々は彼らのイベント入力データと彼らが働く方法が類似していて、それが我々にMBSの全部をたくさん保存したことを与えられたSQSとSNSハンドラーを合併する方法を見つけました.
ラムダコンソールは、あなたが働くことができるそのテストタブのサンプルイベント入力データを提供します.リストから選択します.


利点は、アプリケーションのサイズを縮小する
あなたは私たちがしたように、あなたのAWSの制限を排気する複数のアプリを展開していない可能性がありますが、さらにあなたは関係なく、アプリのサイズをドロップして得るために立っている.
  • 速くcold start 時間
  • ジップアップとアップロードのプロセスとしてCI/CDとのより高速な展開が高速になります
  • ストレージとメモリの低コスト