こんにちは。
Web・iOSエンジニアの三浦です。
今回は、コンテナイメージにしていないサイズの大きなコードを、AWS Labmdaにデプロイする裏技を紹介します。
はじめに
今でこそAWS Lambda(以降Lambda)は2020年12月4日に10GBまでのコンテナイメージが使用できるようになりましたが、それまでは最大で250MBまでしかコードをデプロイすることができませんでした。
まだその制限があった際に250MBを超えるコードのデプロイが必要になったことがあり、とある裏技を使うことでなんとか回避してデプロイすることができたので、今回はその方法について紹介していきます。
AWSとLambdaの紹介
AWSとは
AWSは、Amazonが運営するクラウドサービスです。
サーバやデータベース、その他開発に必要/有用な様々なサービスを提供してくれています。
使用するメリットとして、使った分だけ請求されることや、管理をAWS側に任せることができることが挙げられます。
Lambdaとは
Lambdaは、AWSが提供しているサービスの一つで、コードをデプロイして動かす事のできるサービスです。
サーバそのものに加え、内部の設定や負荷分散してくれる機能なども含めて提供してくれているサービスであり、エンジニアは、コードのデプロイと多少のパラメータの設定をするだけで良いというものになっています。
Lambdaの制限とその回避方法
Lambdaに存在する制限
上記で挙げたとおりLambdaは非常に便利なサービスですが、一方でいくつか制限も存在します。
その一つが、コンテナイメージでないコードだと、デプロイできるコードが最大250MBということです。
私が以前行っていたプロジェクトでは、以下のシステムをLambdaで実現しようとしたときに250MBを超えてしまいました。
インターネット上のサイトをChromeのバイナリを使ってスクレイピングし、その結果をDBに保存するシステム。
Chromeのバイナリと、それを操作してデータを取得・DBに保存するPythonのコードをLambdaにデプロイする。
特にChromeのバイナリが重く、全て合わせると250MBを超えてしまっていました。
ただ、いくつかの事情からこの状態でLambdaでの運用をする必要があり、色々検討した結果、以下の方法でこれをデプロイ・実行できることが判明しました。
Lambdaのコードサイズ制限の回避方法
回避方法といってもシンプルなもので、以下のようにChromeのバイナリを圧縮した、というものです。
ChromeのバイナリのみZIPとして固めた状態でLambdaにデプロイし、Lambda実行時にコード上で解凍して使用します。
このときのプロジェクトでは、Chromeのバイナリを圧縮すれば250MBを下回ったので、この方法でなんとかデプロイすることができました。
また、解凍後に250MBを超えてしまいますが、現状(2020年11月23日現在)では問題なく動いています。
まとめ
Lambdaには、コンテナイメージでないコードは250MBまでしかデプロイできないという制限がありますが、一部のコードやバイナリなどを圧縮してデプロイし、Lambda実行時に解凍して使用する、という裏技を使うことで、250MBを超えていてもデプロイできます。
ただし、以下の懸念点も存在します。
- 使用する言語・フレームワークによっては、実行時に解凍して使用できない可能性がある
- 圧縮しても250MBを上回る場合はデプロイできない
- 現状では、デプロイ時に250MBを下回っていさえすれば、実行時に解凍して250MBを超えていても問題ないが、将来的に問題ないという保証はない
以上の点から、250MBを上回ってしまう場合は、コンテナイメージを使用したり、EC2・ECS等を使用するほうが安全性は高いでしょう。
ただ、もしどうしようもない理由がある場合は、こちらの裏技を試してみてもいいかも知れません。
参考になれば幸いです。