Kuchitama Tech Note

はてな記法がいつまでたっても覚えられないので、はてなダイアリーからマークダウンが使えるこっちに引っ越してきました。

AWS LambdaでScalaを使ってみたんだが

こんな記事を書きました

qiita.com

とても気になっている問題があります。

それが、AWS Lambda Deployment Limits です。

docs.aws.amazon.com

項目 デフォルトの制限
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 で取り上げられてたので、読むといいと思います。

WEB+DB PRESS Vol.95

WEB+DB PRESS Vol.95

$ 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のサイズを見てみます。

qiita.com

$ 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% ですね。