AWS LambdaでScalaを使ってみたんだが
こんな記事を書きました
とても気になっている問題があります。
それが、AWS Lambda Deployment Limits です。
項目 | デフォルトの制限 |
---|---|
Lambda 関数デプロイパッケージのサイズ(.zip/.jar ファイル) | 50 MB |
リージョンあたりの、アップロードできるすべてのデプロイパッケージの合計サイズ | 75 GB |
デプロイパッケージ(非圧縮 zip/jar サイズ)に圧縮できるコード/依存関係のサイズ | 250 MB |
こういう制限があるけど、Scalaコードは、Scalaの標準ライブラリとかjarに含まれるはずなので、Javaで書くよりもjarのサイズは大きくなるはず。 この影響がどれぐらいかというのを調べてみました。
実験
とりあえず、シンプルなサンプルとして、Serverless Frameworkで create
しただけのjarのサイズを見てみます。
Serverless Frameworkについては、Web+DB PRESS vol.95 で取り上げられてたので、読むといいと思います。
- 作者: 小出淳子,黒澤剛志,牧大輔,横江亮佑,山口貴也,尾藤正人,佐藤琢哉,中橋研太郎,田中慎司,小西裕介,伊藤直也,稲富駿,前島真一,長野雅広,山際康貴,のざきひろふみ,うらがみ,岡林大,遠藤雅伸,ひげぽん,海野弘成,はまちや2,竹原,大場寧子,大場光一郎,野々下裕子,WEB+DB PRESS編集部
- 出版社/メーカー: 技術評論社
- 発売日: 2016/10/22
- メディア: 大型本
- この商品を含むブログを見る
$ sls create -t aws-scala-sbt $ sbt assembly $ ll target/scala-2.11/hello.jar -rw-rw-r-- 1 k2 k2 15M 10月 29 00:58 target/scala-2.11/hello.jar
ということで、 15MB のjarができました。 この時点で既に 50MBの 30% を消費しています。
ちなみに、冒頭の記事で最終的に作成した、依存関係に skinny-json を追加したバージョンのjarのサイズを見てみます。
$ sbt assembly $ ll target/scala-2.11/hello.jar -rw-rw-r-- 1 k2 k2 37M 10月 31 12:48 target/scala-2.11/hello.jar
なんと、 37MB まで増えました。
実に上限の 74% です。
もう少し調べます。
AWS Lamdaでは、zip/jarの展開後の容量も制限があって、250MBに収まっている必要があります。
$ mv hello.jar hello.zip $ unzip hello.zip $ du -hcd 2 15M ./models 24K ./hello 108K ./com/thoughtworks 17M ./com/amazonaws 5.2M ./com/fasterxml 22M ./com 60K ./skinny/util 64K ./skinny 184K ./mozilla 2.0M ./software/amazon 2.0M ./software 16K ./META-INF/services 188K ./META-INF/native 344K ./META-INF 12K ./scala/compat 20M ./scala/reflect 720K ./scala/sys 68K ./scala/ref 52M ./scala/tools 128K ./scala/annotation 868K ./scala/math 15M ./scala/collection 2.3M ./scala/xml 80K ./scala/text 900K ./scala/concurrent 44K ./scala/beans 2.5M ./scala/util 1.2M ./scala/runtime 196K ./scala/io 97M ./scala 3.7M ./org/joda 5.0M ./org/apache 2.9M ./org/json4s 12M ./org 148M . 148M 合計
skinny-jsonを追加した状態で、展開後のファイルサイズは合計148Mでした。 250MBの59.2%ですね。こちらも制限の半分を超えています。
やはり、./scala
が 97M と大変ボリュームがあります。
油断してライブラリを追加してしまうと、あっという間に上限に迫ってしまいそうです。 気持よく開発をつづけてたら、突然デプロイに失敗する危険があります。
依存関係の追加は計画的に行いましょう!!
ちなみに
aws-java-gradle テンプレートで build したzipのサイズ
$ sls create -t aws-java-gradle $ gradle build $ ll build/distributions/hello.zip -rw-rw-r-- 1 k2 k2 7.9M 10月 28 14:41 build/distributions/hello.zip
こちらは、 15.8% ですね。