Perl の自作モジュールを AWS Lambda で動かす
GWずっとこれやってた
平年であれば帰省して甥っ子姪っ子と遊んだり・・・いや、もう遊んでもらえない歳になってしまったか。
まぁ、今年もコロナ禍で帰省するわけにはいかない感じなので、Perl の自作モジュールを AWS Lambda で動かすってのをやってました。
最終日にしてやっと動くようになったので、自分用の備忘録で書いておきます。
こんな感じで動かしました
ここに書いてあるまま +α です。
+α 分を書いていきます。
bootstrap
とinstall.sh
にはchmod +x
で実行権限をつけておく。cpanm は GitHub からのインストールを正式にサポートはしていないが、
git://github.com/〜
でいける。うちの場合にはこう書きました。
#!/bin/sh yum install -y gcc git perl-App-cpanminus cpanm -l local --notest --installdeps . cpanm -l local --notest git://github.com/sironekotoro/Zengin-Perl.git
あと、最後に圧縮して AWS Lambda に上げるところですが
docker run --rm -v "$PWD":/var/task lambci/lambda-base ./install.sh zip -r ../dist.zip .
zip -r ../dist.zip .
で、 dist.zip
の後に .
スペースとドットが必要です。まぁ、その場でわかるとは思うけど(一瞬わからなくて???ってなった人)
そして、圧縮した zip ファイルですが、AWS Lambda のここからアップロードします。コード書くところの右上の「アップロード元」ってところ。
同じファイル名で何か書いてある場合には上書きされます。
アップロードするとこんな感じになります。圧縮されたファイルが展開されて左側に色々と増えてます。
なお、この方法で動かす場合には、Lambda Layer に追加の Perl ランタイムは不要です。
ランタイムは「カスタムランタイムを利用」にしておきます。
ハンドラは hello.handler
としていますが、この場合、Lambda 起動したときに動く Perl のスクリプトは hello.pl
内の handler
サブルーチンです。
なんでこんなに時間がかかったのか
AWS Lambda で Perl を動かすには、Perl の Lambda Layer が必須だと思っていた。が、これがどこにも書いていない、完全な思い込み。不要だった。
自分の思い込みで、これだけで 3 日くらい費やした気がします。
カスタムランタイムをアップロードしつつ、Perl のランタイムレイヤーを追加したりしてた。
自作モジュールをインストールするのに当初は SSH でのインストールをやろうとしていました。
が、そうすると Docker イメージに SSH の秘密鍵を設定する必要があり、それをするのに手間取りました。しかし、最終的には
cpanm git://〜
の形で解決。XS利用モジュールがうまく動かなかった。
自作のモジュールでは
Function::Parameters
とFile::Slurp
を利用していましたが、これを検索パスから辿ることができず、またこれから依存しているモジュールが見つからない、ということで難儀しました。どうも、XS という C 言語のバイナリを利用しているモジュールがうまく動いていないことに気づきました。
これに関しては、自作モジュール側を改修して、これらのモジュールを外しました。
テストを書いていたおかげで、安心して書き直すことができました。
AWS Lambda 用にモジュールをローカルにインストールする為に使う
lambci/lambda
と、AWS Lambda に追加するPerl Runtime Leyer
の役割を理解しておらず、混乱したというか、今回の方法でインストールされる Perl は 5.016003 なんだけど、どういう方法で入っているのかわからない。標準モジュールのはずの
Data::Dumper
も明示的に cpanfile に書かないとダメ。Perl Runtime Leyer は Perl 5.032 で標準モジュールは普通に利用できる。
他にもまぁ、アホだ間抜けだ注意不足だなどなど、色々あるんですが、なんとか動きました。
多分、このエントリにも勘違いが入ってるんだろーなーと思います。
動機
AWS でLambda をどうこうっていうと、まぁ普通はサポートしている言語のものが多いです。当たり前ですが。
そこで、Perl を動かしてやろうじゃないか、ってのが一つ。
次に、コンソールから aws cli
使ってアップロードってのが常道で多数派だとは思うのですが、であればこのWebコンソールからもできるはずで、そちらで動かしてみたい、というのが一つ
なお、本来の目的は全銀コード検索を Slack のスラッシュコマンドからやりたい!ってやつだったのですが、先週社内勉強会でこの話したところ「herokuの方が向いてんじゃない?」とのことだったので、そりゃそうだと納得。そのうちherokuで動かしたいと思います。
前に一回やったんで、また過去の自分のブログ記事が助けになるはず。
GWの終わりに
カレンダー通りだったんですが、とはいえ随分な時間を費やしましたわ。
でも、こうやってまとめると2600文字ちょっと。1週間前の自分に教えてあげたいー、そしたらもっと前に進むことできたのにー