S3putイベントをトリガーにしたlambdaをaws samでハンドリングするプロジェクトを一から作った

はい、ちょっと長ったらしいタイトルになってしまいました

えー、どういうことかというと、今回S3へのファイルアップロードのイベントをトリガーに起動するlambdaを作成しました

で、そのlambdaはaws samを使ってデプロイなどができるようにしました

rubyで実装しています

まあ、aws samを使ったので、template.ymlを使って、lambdaの管理はできるようにしたという感じです

ただねー、うーん、結構大変でした…

うーん、色々、どうあるべきだったかなぁ…と思いつつ、より良い方法あったかもしれないとも思いつつ、でも前に進むしかなかったしなぁと思いつつ、実装し切った感じになります

一応、健全なリポジトリに必要な機能は用意できたかなと思ってます

一旦できたけど、やっぱりECR使ってイメージの管理をした方がいいなぁと思ったり…

まあそのあたり踏まえて少しまとめておきたいと思います

構成について

まず、タイトルにもあるように、S3のput eventをトリガーに起動するlambdaを作成しました

で、今回は、aws samを使って、まあtemplate.ymlを使ってlambdaを管理する感じにしました

というのは、template.ymlにlambdaの情報とか、s3のバケットの作成とかすべて記載できるので、そこがいいなぁと思ったからです

server less frameworkも良さそうと思ったんですが、あれ、有料になっちゃったんですね…

ちなみにECRのイメージでlambdaを管理しようとすると、aws samのsam localのコマンドを使って、ローカルで動作確認できないんですかね?

なんか自分のやった場合だと、sam localで動作確認ができなかったので、仕方なく、S3で管理することにしました

しかしなぁ…ここでやっぱりECRで管理したかったなぁと思いましたね

理由はgemなどの管理ですね

要するにローカルの環境に依存することになるので、gemの追加とかあった場合は、それに対応する必要があります

環境ごとに対応が異なる可能性があるってことです

だからECRとかにしとけば環境一定にできので、そのあたりぐぬぬ…という感じでしたね…

ただし、sam localが使えないということもあったので、今回はS3で対応しました

ちなみにlocal stackでs3のプットイベントのトリガーと、lambdaを起動できればそれがベストだと思いましたけど、多分その辺りの連携って、有料になっちゃうんですよね…

だから、sam localを使わないとダメだったという背景もあります…

しかしこれは茨の道だったかもしれない…

S3のプットイベントのローカルでの再現

ちなみに、S3のプットイベントをトリガーに動作するlambdaですが、本番環境でしか動かないというのは、個人的にはあり得ないと思っています

理由は、適切な開発プロセスに載せられなくなるからですね

適切なといってるのは、開発して、cicd回して、デプロイっていう流れです

ローカルでS3のプットイベントを模倣して、ローカルのlambdaを起動して、動作を確認できることは必須だと思っています

なかなか難しかったんですが、結論localstackのs3と、sam localを組み合わせることで実現しました

具体的には以下のような感じです

s3については、localstackにバケットを作成し、uploadされる予定のサンプルファイルをおいておきます

そして、put eventを模倣したjsonファイルを用意して、それをsam localでlambdaを動かすときに、引数として渡してあげます

こうすることで、S3のプットイベントを模倣して、ローカルで動作確認することができます

ruby lambda + sam localの欠点

これ、実装してて気づいたことなんですが、sam local + rubyのlambdaは、デバッグできません…

具体的には、binding.pryのようなpry系の処理を仕込むことができないということがわかりました…

マジで終わっている…

pythonとか一部の言語については、vscodeで良い感じのデバッグするプラグインがあって、それを使えそうでした

しかし、rubyはそれが対応していない。。。

なので仕方なく、putsで必要な情報を常々表示しながらデバッグしました…

かなり大変でした…

このデバッグについては、結構みんな気になっていたみたいで、stackoverflowとかにも質問結構ありましたが、ないという結論でした…

まじで…なんてこったい…

一応、超原始的なprintデバッグと、テストをちゃんと書くことで対応はしましたが、なんともrubyの弱さみたいなものを感じて、悔しいというか、切ない気持ちにはなりました

まとめ

というわけで、まあ、本当に何にもないところから、一から全部作成したわけですが、なんとか、ちゃんとした仕組みを作ることができたと思っています

結構茨の道だった気がしていて、どうあるべきだったのかとか、もっとこうしたら楽にできたとか少しちゃんと振り返りたい気がします

ただ、あまり聞ける人がいないのも事実で、どうしようかなと思っています

ちょっと知り合いのリードエンジニアの方に質問してみようかな…

そんな感じでした!

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA