AWS LambdaとGlue、どっちを選ぶ？

## はじめに

こんにちは、情報戦略テクノロジーの小林と申します。
今回は初めて記事を書くということで、私が最も実務で触れているバッチ処理におけるlambdaとglueについてまとめることにしました。
ちょっとだけAWSを触ったことがある方に向けて、このふたつの違いを説明し、「じゃあどっちを使えばいいの？」に答えたいと思います。
前提条件として、どちらも時間起動でpythonコードを動かしているものとしています。

根本的にlambdaとは、glueとはなにかを知りたい方は以下のリンクをご参照ください。
https://aws.amazon.com/jp/lambda/
https://aws.amazon.com/jp/glue/

というだけだと寂しいので、キャラクターに見立てて一言書いていきます。
せっかくなので、この子たちはこの後も説明に登場させようと思います。
ちなみにこれらはラノベツクールMVというソフトと、サンプルでもともと入っているデータを使用して作っています。
興味がある方は検索してみてください。

Lambdaちゃん
![スクリーンショット (29).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/901bda17-d662-8321-15f1-1c94eee57bb8.png)
CloudWatch EventsやS3など連携サービスが多いため選ばれがちなLambda


Glueちゃん
![スクリーンショット (42).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/813fa582-1e4b-4923-1639-792af33b2721.png)
ETL処理を得意とするが、あまり注目されないGlue



## 結論

モノを説明するときはまず結論から。と言われて育ってきたのでいきなり結論ですが、
**バッチ処理では基本的にglueを使おう！簡単なものはlambdaでもオッケー！**
で良いかと思います。
理由を以下に書いていきます。



## 理由そのいち
**制限時間（タイムアウトまでの時間）**

最初にタイムアウトまでの時間で比較をしたいと思います。
まずlambdaですが、こちらには15分の制限時間があります。
AWSの思想的にもlambdaに大きなデータを扱うような時間がかかる処理を任せることは考えていないということですね。

一方glueはタイムアウトまでの時間が2880分（48時間！）です。
元々ETLに使うことを想定しているサービスということもあり、大量データの処理はこっち！とAWSも思っているようです。

図1.1　15分以上の仕事は断られてしまう
![イラスト2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/901dca9a-97d7-d3c9-339f-ace2cc76f2b0.png)

図1.2　二日間タイムアウトしないGlue
![ichi.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/af400b15-1a0b-ac94-3f47-e2d5b8d95dd4.png)




## 理由そのに
**コスト**

それぞれ10分間動かしたときの料金は以下の通りです。
Glue：$0.15
Lambda（メモリ128）：$0.1248
Lambda（メモリ3008）：$2.9382
※こちら料金を古いもので見てます。最新の料金は公式ページをご確認ください。

Lambdaは計算方法が結構あいまいで、メモリによって料金が大幅に変わるのですがご覧の通りメモリ最大で動かそうとすると大変なことになってしまいます。
ただし、Glueは最低でも10分の料金からでLambdaはミリ秒で計算、しかも無料時間があるためキチンと調整したらLambdaのほうが安くなるということもあります。
例えばメモリ128のLambdaで3秒かかる処理をしたときの料金は上記のものより格段に安いですが、Glueで同じことをやっても料金が変わりません。

図2.1　すぐ終わる仕事はコストも少ないLambda
![kosuto1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/39d0e666-066e-5c3c-a091-415cedcf9be4.png)

図2.2　簡単な仕事でも高コストなGlue
![kosuto3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/3f535356-c10e-4193-2f5b-13a2bc5cf9c6.png)

図2.3　時間がかかる処理はものすごく高コストになってしまうLambda
![kosuto2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/e808f2cf-481a-f643-5bc4-aac3ce27be7d.png)

図2.4　10分で終わる処理ならコストが変わらないGlue
![kosuto4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/f63dd3aa-e7fd-c238-e2bb-b69577208ec1.png)



## 理由そのさん
**そもそもどっちでもやりたいことはできる**

これを言ってしまうと元も子もない気がしないでもないですが、lambdaでもglueでも指定のプログラムを動かしている箱にすぎないので、やろうと思えばどちらでも同じことはできます。
ですので、システム構成やテーブルの作りにあわせて柔軟にサービスを選ぶのが良いと思います。
例えば大きい機能を分割することでタイムアウトさせることなくLambdaを実行させたり、逆に小さい機能をまとめてGlueに任せるのも手段のひとつです。

図3.1　Lambdaをふたつに分割することでタイムアウトを防ぐ
![san.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/b9c084ae-31ae-d469-bdc0-0c8c244fbb4d.png)

図3.2　いっぺんに仕事を任せることでコストダウンさせる
![san2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/d122a1d7-2a50-8603-8121-0294d89cbd3a.png)



## おわりに

以上の理由で結論に至ります。

**バッチ処理では基本的にglueを使おう！簡単なものはlambdaでもオッケー！**
メジャーすぎてなにかと使われがちなLambdaですが、GlueなどAWSには他にも便利なサービスがありますので、ぜひシステムを作るときに検討してみてください。
![スクリーンショット (55).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1852100/8413744f-82fb-517d-be0b-8149f2cfdec9.png)